diff --git a/playwright/pom.xml b/playwright/pom.xml index e97c92a24..2362d86f2 100644 --- a/playwright/pom.xml +++ b/playwright/pom.xml @@ -89,6 +89,11 @@ org.junit.jupiter junit-jupiter-engine + + org.junit.platform + junit-platform-launcher + test + org.junit.jupiter junit-jupiter-params diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/junit/PlaywrightExtension.java b/playwright/src/main/java/com/microsoft/playwright/impl/junit/PlaywrightExtension.java index d1873bb61..37ad373b8 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/junit/PlaywrightExtension.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/junit/PlaywrightExtension.java @@ -55,6 +55,9 @@ Playwright createPlaywright(Playwright.CreateOptions options) { return playwright; } + boolean owns(Playwright playwright) { + return playwrightList.contains(playwright); + } // This is a workaround for JUnit's lack of an "AfterTestRun" hook // This will be called once after all tests have completed. @@ -85,13 +88,14 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte * @return The Playwright that belongs to the current test. */ public static Playwright getOrCreatePlaywright(ExtensionContext extensionContext) { + PlaywrightRegistry registry = PlaywrightRegistry.getOrCreateFor(extensionContext); Playwright playwright = threadLocalPlaywright.get(); - if (playwright != null) { + // A previous launcher run on this thread (e.g. a surefire rerun) has already closed its Playwright. + if (playwright != null && registry.owns(playwright)) { return playwright; } Options options = OptionsExtension.getOptions(extensionContext); - PlaywrightRegistry registry = PlaywrightRegistry.getOrCreateFor(extensionContext); playwright = registry.createPlaywright(options.playwrightCreateOptions); threadLocalPlaywright.set(playwright); diff --git a/playwright/src/test/java/com/microsoft/playwright/junit/RerunFixture.java b/playwright/src/test/java/com/microsoft/playwright/junit/RerunFixture.java new file mode 100644 index 000000000..d03aa89e4 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/junit/RerunFixture.java @@ -0,0 +1,33 @@ +/* + * 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.junit; + +import com.microsoft.playwright.Page; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +// Not picked up by surefire; TestFixturesRerun runs it through the launcher. +@UsePlaywright +public class RerunFixture { + @Test + void usesPage(Page page) { + page.setContent("rerun"); + assertEquals("rerun", page.title()); + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/junit/TestFixturesRerun.java b/playwright/src/test/java/com/microsoft/playwright/junit/TestFixturesRerun.java new file mode 100644 index 000000000..99f17106c --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/junit/TestFixturesRerun.java @@ -0,0 +1,64 @@ +/* + * 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.junit; + +import org.junit.jupiter.api.Test; +import org.junit.platform.launcher.LauncherDiscoveryRequest; +import org.junit.platform.launcher.core.LauncherFactory; +import org.junit.platform.launcher.listeners.SummaryGeneratingListener; +import org.junit.platform.launcher.listeners.TestExecutionSummary; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; +import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; + +public class TestFixturesRerun { + // Surefire's rerunFailingTestsCount runs the launcher again on the same thread after + // the first run has already closed every Playwright it created. + @Test + void shouldCreateNewPlaywrightForEachLauncherRun() throws Exception { + ExecutorService thread = Executors.newSingleThreadExecutor(); + try { + for (int run = 1; run <= 2; run++) { + Future summary = thread.submit(() -> runOnLauncher(RerunFixture.class)); + assertEquals(1, summary.get().getTestsSucceededCount(), "run " + run + ": " + describeFailures(summary.get())); + } + } finally { + thread.shutdownNow(); + } + } + + private static String describeFailures(TestExecutionSummary summary) { + StringWriter out = new StringWriter(); + summary.printFailuresTo(new PrintWriter(out)); + return out.toString(); + } + + private static TestExecutionSummary runOnLauncher(Class testClass) { + LauncherDiscoveryRequest request = request().selectors(selectClass(testClass)).build(); + SummaryGeneratingListener listener = new SummaryGeneratingListener(); + LauncherFactory.create().execute(request, listener); + return listener.getSummary(); + } +} diff --git a/pom.xml b/pom.xml index 6e33592e8..4a4bbfa2e 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,13 @@ + + org.junit + junit-bom + ${junit.version} + pom + import + com.microsoft.playwright driver diff --git a/tools/test-local-installation/pom.xml b/tools/test-local-installation/pom.xml index 88fb2c63a..987dcb4db 100644 --- a/tools/test-local-installation/pom.xml +++ b/tools/test-local-installation/pom.xml @@ -11,6 +11,7 @@ 1.8 2.11.0 5.11.0 + 1.11.0 UTF-8 1.5.7 @@ -44,6 +45,12 @@ ${junit.version} test + + org.junit.platform + junit-platform-launcher + ${junit.platform.version} + test + org.java-websocket Java-WebSocket