Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,24 @@ class ClockImpl implements Clock {
this.browserContext = browserContext;
}

private void sendMessageWithLogging(String method, JsonObject params) {
String capitalizedMethod = method.substring(0, 1).toUpperCase() + method.substring(1);
browserContext.withLogging("Clock." + method,
() -> browserContext.sendMessage("clock" + capitalizedMethod, params));
}

@Override
public void fastForward(long ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksNumber", ticks);
browserContext.sendMessage("clockFastForward", params);
sendMessageWithLogging("fastForward", params);
}

@Override
public void fastForward(String ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksString", ticks);
browserContext.sendMessage("clockFastForward", params);
sendMessageWithLogging("fastForward", params);
}

@Override
Expand All @@ -32,89 +38,89 @@ public void install(InstallOptions options) {
if (options != null) {
parseTime(options.time, params);
}
browserContext.sendMessage("clockInstall", params);
sendMessageWithLogging("install", params);
}

@Override
public void runFor(long ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksNumber", ticks);
browserContext.sendMessage("clockRunFor", params);
sendMessageWithLogging("runFor", params);
}

@Override
public void runFor(String ticks) {
JsonObject params = new JsonObject();
params.addProperty("ticksString", ticks);
browserContext.sendMessage("clockRunFor", params);
sendMessageWithLogging("runFor", params);
}

@Override
public void pauseAt(long time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time);
browserContext.sendMessage("clockPauseAt", params);
sendMessageWithLogging("pauseAt", params);
}

@Override
public void pauseAt(String time) {
JsonObject params = new JsonObject();
params.addProperty("timeString", time);
browserContext.sendMessage("clockPauseAt", params);
sendMessageWithLogging("pauseAt", params);
}

@Override
public void pauseAt(Date time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time.getTime());
browserContext.sendMessage("clockPauseAt", params);
sendMessageWithLogging("pauseAt", params);
}

@Override
public void resume() {
browserContext.sendMessage("clockResume");
sendMessageWithLogging("resume", new JsonObject());
}

@Override
public void setFixedTime(long time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time);
browserContext.sendMessage("clockSetFixedTime", params);
sendMessageWithLogging("setFixedTime", params);
}

@Override
public void setFixedTime(String time) {
JsonObject params = new JsonObject();
params.addProperty("timeString", time);
browserContext.sendMessage("clockSetFixedTime", params);
sendMessageWithLogging("setFixedTime", params);
}

@Override
public void setFixedTime(Date time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time.getTime());
browserContext.sendMessage("clockSetFixedTime", params);
sendMessageWithLogging("setFixedTime", params);
}

@Override
public void setSystemTime(long time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time);
browserContext.sendMessage("clockSetSystemTime", params);
sendMessageWithLogging("setSystemTime", params);
}

@Override
public void setSystemTime(String time) {
JsonObject params = new JsonObject();
params.addProperty("timeString", time);
browserContext.sendMessage("clockSetSystemTime", params);
sendMessageWithLogging("setSystemTime", params);
}

@Override
public void setSystemTime(Date time) {
JsonObject params = new JsonObject();
params.addProperty("timeNumber", time.getTime());
browserContext.sendMessage("clockSetSystemTime", params);
sendMessageWithLogging("setSystemTime", params);
}

private static void parseTime(Object time, JsonObject params) {
Expand Down
65 changes: 65 additions & 0 deletions playwright/src/test/java/com/microsoft/playwright/TestTracing.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.microsoft.playwright.options.AriaRole;
import com.microsoft.playwright.options.Location;
import com.microsoft.playwright.options.MouseButton;

import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -204,6 +207,68 @@ void traceGroupGroupEnd(@TempDir Path tempDir) throws Exception {
assertEquals(asList("outer group", "Page.navigate", "inner group 1", "Frame.click", "inner group 2", "Page.isVisible"), calls);
}

@Test
void shouldTraceVariousAPIs(@TempDir Path tempDir) throws Exception {
context.tracing().start(new Tracing.StartOptions());

page.clock().install();

page.setContent("<input type='text' />");
page.locator("input").click(new Locator.ClickOptions().setButton(MouseButton.RIGHT));
page.getByRole(AriaRole.TEXTBOX).click();
page.keyboard().type("Hello world this is a very long string what happens when it overflows?");
page.keyboard().press("Control+c");
page.keyboard().down("Shift");
page.keyboard().insertText("Hello world");
page.keyboard().up("Shift");
page.mouse().move(0, 0);
page.mouse().down();
page.mouse().move(100, 200);
page.mouse().wheel(5, 7);
page.mouse().up();
page.clock().fastForward(1000);
page.clock().fastForward("30:00");
page.clock().pauseAt("2050-02-02");
page.clock().runFor(10);
page.clock().setFixedTime("2050-02-02");
page.clock().setSystemTime("2050-02-02");

page.clock().resume();

page.locator("input").click(new Locator.ClickOptions().setButton(MouseButton.RIGHT));

Path traceFile1 = tempDir.resolve("trace1.zip");
context.tracing().stop(new Tracing.StopOptions().setPath(traceFile1));

List<TraceEvent> events = parseTraceEvents(traceFile1);
List<String> calls = events.stream().filter(e -> e.apiName != null).map(e -> e.apiName)
.collect(Collectors.toList());
assertEquals(asList(
"Clock.install",
"Page.setContent",
"Frame.click",
"Frame.click",
"Keyboard.type",
"Keyboard.press",
"Keyboard.down",
"Keyboard.insertText",
"Keyboard.up",
"Mouse.move",
"Mouse.down",
"Mouse.move",
"Mouse.wheel",
"Mouse.up",
"Clock.fastForward",
"Clock.fastForward",
"Clock.pauseAt",
"Clock.runFor",
"Clock.setFixedTime",
"Clock.setSystemTime",
"Clock.resume",
"Frame.click"),
calls);
}

private static class TraceEvent {
String type;
String name;
Expand Down
Loading