From b90de26d239bc2cf65a238a0ae1cc4e17536bb57 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 29 Jun 2022 15:27:11 -0700 Subject: [PATCH] feat: accept PLAYWRIGHT_JAVA_SRC in Playwright.create (#980) --- .../playwright/impl/BrowserTypeImpl.java | 2 +- .../microsoft/playwright/impl/Connection.java | 6 ++- .../playwright/impl/PlaywrightImpl.java | 2 +- .../playwright/impl/StackTraceCollector.java | 13 ++++-- .../com/microsoft/playwright/TestBase.java | 6 ++- .../TestJavaSourceLocationInConstructor.java | 46 +++++++++++++++++++ 6 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 playwright/src/test/java/com/microsoft/playwright/TestJavaSourceLocationInConstructor.java diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java index 370f7d8d..97141391 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java @@ -82,7 +82,7 @@ class BrowserTypeImpl extends ChannelOwner implements BrowserType { JsonObject json = sendMessage("connect", params).getAsJsonObject(); JsonPipe pipe = connection.getExistingObject(json.getAsJsonObject("pipe").get("guid").getAsString()); - Connection connection = new Connection(pipe); + Connection connection = new Connection(pipe, this.connection.env); PlaywrightImpl playwright = connection.initializePlaywright(); if (!playwright.initializer.has("preLaunchedBrowser")) { try { diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java b/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java index 4008b979..5ffce5d1 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/Connection.java @@ -65,6 +65,7 @@ public class Connection { isLogging = (debug != null) && debug.contains("pw:channel"); } LocalUtils localUtils; + final Map env; class Root extends ChannelOwner { Root(Connection connection) { @@ -79,13 +80,14 @@ public class Connection { } } - Connection(Transport transport) { + Connection(Transport transport, Map env) { + this.env = env; if (isLogging) { transport = new TransportLogger(transport); } this.transport = transport; root = new Root(this); - stackTraceCollector = StackTraceCollector.createFromEnv(); + stackTraceCollector = StackTraceCollector.createFromEnv(env); } boolean isCollectingStacks() { diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java index 80542ca3..3ca06b61 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/PlaywrightImpl.java @@ -43,7 +43,7 @@ public class PlaywrightImpl extends ChannelOwner implements Playwright { pb.environment().putAll(env); Driver.setRequiredEnvironmentVariables(pb); Process p = pb.start(); - Connection connection = new Connection(new PipeTransport(p.getInputStream(), p.getOutputStream())); + Connection connection = new Connection(new PipeTransport(p.getInputStream(), p.getOutputStream()), env); PlaywrightImpl result = connection.initializePlaywright(); result.driverProcess = p; result.initSharedSelectors(null); diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/StackTraceCollector.java b/playwright/src/main/java/com/microsoft/playwright/impl/StackTraceCollector.java index d2a7b9f8..f137b8ac 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/StackTraceCollector.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/StackTraceCollector.java @@ -28,18 +28,25 @@ import java.util.*; import java.util.stream.Collectors; class StackTraceCollector { + static final String PLAYWRIGHT_JAVA_SRC = "PLAYWRIGHT_JAVA_SRC"; private final List srcDirs; private final Map classToSourceCache = new HashMap<>(); - static StackTraceCollector createFromEnv() { - String srcRoots = System.getenv("PLAYWRIGHT_JAVA_SRC"); + static StackTraceCollector createFromEnv(Map env) { + String srcRoots = null; + if (env != null) { + srcRoots = env.get(PLAYWRIGHT_JAVA_SRC); + } + if (srcRoots == null) { + srcRoots = System.getenv(PLAYWRIGHT_JAVA_SRC); + } if (srcRoots == null) { return null; } List srcDirs = Arrays.stream(srcRoots.split(File.pathSeparator)).map(p -> Paths.get(p)).collect(Collectors.toList()); for (Path srcDir: srcDirs) { if (!Files.exists(srcDir.toAbsolutePath())) { - throw new PlaywrightException("Source location specified in PLAYWRIGHT_JAVA_SRC doesn't exist: '" + srcDir.toAbsolutePath() + "'"); + throw new PlaywrightException("Source location specified in " + PLAYWRIGHT_JAVA_SRC + " doesn't exist: '" + srcDir.toAbsolutePath() + "'"); } } return new StackTraceCollector(srcDirs); diff --git a/playwright/src/test/java/com/microsoft/playwright/TestBase.java b/playwright/src/test/java/com/microsoft/playwright/TestBase.java index a9a1a8e5..03da057a 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestBase.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestBase.java @@ -72,8 +72,12 @@ public class TestBase { return options; } + Playwright.CreateOptions playwrightOptions() { + return null; + } + void initBrowserType() { - playwright = Playwright.create(); + playwright = Playwright.create(playwrightOptions()); browserType = Utils.getBrowserTypeFromEnv(playwright); } diff --git a/playwright/src/test/java/com/microsoft/playwright/TestJavaSourceLocationInConstructor.java b/playwright/src/test/java/com/microsoft/playwright/TestJavaSourceLocationInConstructor.java new file mode 100644 index 00000000..b2a6dc32 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/TestJavaSourceLocationInConstructor.java @@ -0,0 +1,46 @@ +package com.microsoft.playwright; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.microsoft.playwright.Utils.mapOf; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TestJavaSourceLocationInConstructor extends TestBase { + private static final String SRC_DIRS = System.getenv("PLAYWRIGHT_JAVA_SRC") == null ? "src/test/java" : System.getenv("PLAYWRIGHT_JAVA_SRC"); + + @Override + Playwright.CreateOptions playwrightOptions() { + return new Playwright.CreateOptions().setEnv(mapOf("PLAYWRIGHT_JAVA_SRC", SRC_DIRS)); + } + + @Test + void shouldSupportSourcesLocationPassedToPlaywrightCreate(@TempDir Path tmpDir) throws IOException { + context.tracing().start(new Tracing.StartOptions().setSources(true)); + page.navigate(server.EMPTY_PAGE); + page.setContent(""); + page.click("'Click'"); + Path trace = tmpDir.resolve("trace1.zip"); + context.tracing().stop(new Tracing.StopOptions().setPath(trace)); + + Map entries = Utils.parseZip(trace); + Map sources = entries.entrySet().stream().filter(e -> e.getKey().endsWith(".txt")).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + assertEquals(1, sources.size()); + + String path = getClass().getName().replace('.', File.separatorChar); + String[] srcRoots = SRC_DIRS.split(File.pathSeparator); + // Resolve in the last specified source dir. + Path sourceFile = Paths.get(srcRoots[srcRoots.length - 1], path + ".java"); + byte[] thisFile = Files.readAllBytes(sourceFile); + assertEquals(new String(thisFile, UTF_8), new String(sources.values().iterator().next(), UTF_8)); + } +}