test: network events (#47)

This commit is contained in:
Yury Semikhatsky 2020-10-27 14:02:04 -07:00 committed by GitHub
parent c134a6355f
commit 7d45a26344
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 167 additions and 7 deletions

View File

@ -834,6 +834,9 @@ class NestedClass extends TypeDefinition {
f.writeTo(output, bodyOffset, fieldAccess);
}
output.add("");
if ("Request.failure".equals(jsonPath)) {
writeConstructor(output, bodyOffset);
}
if (isReturnType) {
for (Field f : fields) {
f.writeGetter(output, bodyOffset);
@ -858,6 +861,19 @@ class NestedClass extends TypeDefinition {
f.writeBuilderMethod(output, bodyOffset, name);
}
}
private void writeConstructor(List<String> output, String bodyOffset) {
List<String> args = new ArrayList<>();
for (Field f : fields) {
args.add(f.type.toJava() + " " + f.name);
}
output.add(bodyOffset + "public " + name + "(" + String.join(", ", args) + ") {");
for (Field f : fields) {
output.add(bodyOffset + " this." + f.name + " = " + f.name + ";");
}
output.add(bodyOffset + "}");
}
}
class Enum extends TypeDefinition {

View File

@ -22,6 +22,9 @@ public interface Request {
class RequestFailure {
private String errorText;
public RequestFailure(String errorText) {
this.errorText = errorText;
}
public String errorText() {
return this.errorText;
}

View File

@ -16,12 +16,13 @@
package com.microsoft.playwright.impl;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.microsoft.playwright.*;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
@ -115,7 +116,7 @@ public class PageImpl extends ChannelOwner implements Page {
String guid = params.getAsJsonObject("request").get("guid").getAsString();
RequestImpl request = connection.getExistingObject(guid);
if (params.has("failureText")) {
request.failureText = new Gson().fromJson(params, Request.RequestFailure.class);
request.failure = new Request.RequestFailure(params.get("failureText").getAsString());
}
listeners.notify(EventType.REQUESTFAILED, request);
} else if ("requestFinished".equals(event)) {

View File

@ -16,7 +16,6 @@
package com.microsoft.playwright.impl;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.microsoft.playwright.Frame;
@ -30,7 +29,7 @@ public class RequestImpl extends ChannelOwner implements Request {
private RequestImpl redirectedFrom;
private RequestImpl redirectedTo;
private final Map<String, String> headers = new HashMap<>();
RequestFailure failureText;
RequestFailure failure;
RequestImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
super(parent, type, guid, initializer);
@ -47,7 +46,7 @@ public class RequestImpl extends ChannelOwner implements Request {
@Override
public RequestFailure failure() {
return null;
return failure;
}
@Override

View File

@ -32,6 +32,8 @@ public class TestBase {
static boolean isChromium;
static boolean isWebKit;
static boolean isFirefox;
static boolean isMac = Utils.getOS() == Utils.OS.MAC;
static boolean isWindows = Utils.getOS() == Utils.OS.WINDOWS;
static boolean headful;
Page page;
BrowserContext context;

View File

@ -0,0 +1,139 @@
/*
* Copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.microsoft.playwright;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import static com.microsoft.playwright.Page.EventType.*;
import static java.util.Arrays.asList;
import static org.junit.jupiter.api.Assertions.*;
public class TestPageEventNetwork extends TestBase {
@Test
void PageEventsRequest() {
List<Request> requests = new ArrayList<>();
page.addListener(REQUEST, event -> requests.add((Request) event.data()));
page.navigate(server.EMPTY_PAGE);
assertEquals(1, requests.size());
assertEquals(server.EMPTY_PAGE, requests.get(0).url());
assertEquals("document", requests.get(0).resourceType());
assertEquals("GET", requests.get(0).method());
assertNotNull(requests.get(0).response());
assertEquals(page.mainFrame(), requests.get(0).frame());
assertEquals(server.EMPTY_PAGE, requests.get(0).frame().url());
}
@Test
void PageEventsResponse() {
List<Response> responses = new ArrayList<>();
page.addListener(RESPONSE, event -> responses.add((Response) event.data()));
page.navigate(server.EMPTY_PAGE);
assertEquals(1, responses.size());
assertEquals(server.EMPTY_PAGE, responses.get(0).url());
assertEquals(200, responses.get(0).status());
assertTrue(responses.get(0).ok());
assertNotNull(responses.get(0).request());
}
@Test
void PageEventsRequestFailed() {
server.setRoute("/one-style.css", exchange -> exchange.getResponseBody().close());
List<Request> failedRequests = new ArrayList<>();
page.addListener(REQUESTFAILED, event -> failedRequests.add((Request) event.data()));
page.navigate(server.PREFIX + "/one-style.html");
assertEquals(1, failedRequests.size());
assertTrue(failedRequests.get(0).url().contains("one-style.css"));
assertNull(failedRequests.get(0).response());
assertEquals("stylesheet", failedRequests.get(0).resourceType());
if (isChromium) {
assertEquals("net::ERR_EMPTY_RESPONSE", failedRequests.get(0).failure().errorText());
} else if (isWebKit) {
if (isMac)
assertEquals("The network connection was lost.", failedRequests.get(0).failure().errorText());
else if (isWindows)
assertEquals("Server returned nothing (no headers, no data)", failedRequests.get(0).failure().errorText());
else
assertEquals("Message Corrupt", failedRequests.get(0).failure().errorText());
} else {
assertEquals("NS_ERROR_NET_RESET", failedRequests.get(0).failure().errorText());
}
assertNotNull(failedRequests.get(0).frame());
}
@Test
void PageEventsRequestFinished() {
Deferred<Event<Page.EventType>> event = page.waitForEvent(REQUESTFINISHED);
Response response = page.navigate(server.EMPTY_PAGE);
event.get();
Request request = response.request();
assertEquals(server.EMPTY_PAGE, request.url());
assertNotNull(request.response());
assertEquals(page.mainFrame(), request.frame());
assertEquals(server.EMPTY_PAGE, request.frame().url());
assertNull(request.failure());
}
@Test
void shouldFireEventsInProperOrder() {
List<String> events = new ArrayList<>();
page.addListener(REQUEST, event -> events.add("request"));
page.addListener(RESPONSE, event -> events.add("response"));
Response response = page.navigate(server.EMPTY_PAGE);
assertNull(response.finished());
events.add("requestfinished");
assertEquals(asList("request", "response", "requestfinished"), events);
}
@Test
void shouldSupportRedirects() {
List<String> events = new ArrayList<>();
page.addListener(REQUEST, event -> {
Request request = (Request) event.data();
events.add(request.method() + " " + request.url());
});
page.addListener(RESPONSE,event -> {
Response response = (Response) event.data();
events.add(response.status() + " " + response.url());
});
page.addListener(REQUESTFINISHED, event -> {
Request request = (Request) event.data();
events.add("DONE " + request.url());
});
page.addListener(REQUESTFAILED, event -> {
Request request = (Request) event.data();
events.add("FAIL " + request.url());
});
server.setRedirect("/foo.html", "/empty.html");
String FOO_URL = server.PREFIX + "/foo.html";
Response response = page.navigate(FOO_URL);
response.finished();
assertEquals(asList(
"GET " + FOO_URL,
"302 " + FOO_URL,
"DONE " + FOO_URL,
"GET " + server.EMPTY_PAGE,
"200 " + server.EMPTY_PAGE,
"DONE " + server.EMPTY_PAGE), events);
Request redirectedFrom = response.request().redirectedFrom();
assertTrue(redirectedFrom.url().contains("/foo.html"));
assertNull(redirectedFrom.redirectedFrom());
assertEquals(response.request(), redirectedFrom.redirectedTo());
}
}