diff --git a/acceptance-tests/build.gradle.kts b/acceptance-tests/build.gradle.kts index 2d67312c..3320c315 100644 --- a/acceptance-tests/build.gradle.kts +++ b/acceptance-tests/build.gradle.kts @@ -79,8 +79,11 @@ jenkinsVersions .withNormalizer(ClasspathNormalizer::class) onlyIf { + // Do not run on Jenkins since acceptance tests don't work there for some reason, one of them: + // https://github.com/jenkinsci/acceptance-test-harness/issues/1170 + // // Do not run on Windows as written here: https://github.com/jenkinsci/acceptance-test-harness/blob/master/docs/EXTERNAL.md - !OperatingSystem.current().isWindows + !ciJenkinsBuild && !OperatingSystem.current().isWindows } javaLauncher.set(javaToolchains.launcherFor { @@ -98,7 +101,7 @@ jenkinsVersions mapOf( "JENKINS_WAR" to downloadJenkinsTask.get().outputs.files.singleFile, "LOCAL_JARS" to gradlePlugin.singleFile, - "BROWSER" to if (ciJenkinsBuild) "firefox-container" else "chrome" + "BROWSER" to "chrome" ) ) } diff --git a/acceptance-tests/src/main/java/hudson/plugin/gradle/ath/config/GradleAcceptanceTestsModule.java b/acceptance-tests/src/main/java/hudson/plugin/gradle/ath/config/GradleAcceptanceTestsModule.java index d8f4d738..b5d297e1 100644 --- a/acceptance-tests/src/main/java/hudson/plugin/gradle/ath/config/GradleAcceptanceTestsModule.java +++ b/acceptance-tests/src/main/java/hudson/plugin/gradle/ath/config/GradleAcceptanceTestsModule.java @@ -8,8 +8,10 @@ import hudson.plugin.gradle.ath.updatecenter.VersionOverridesDecorator; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; +import org.jenkinsci.test.acceptance.guice.TestScope; import org.jenkinsci.test.acceptance.update_center.UpdateCenterMetadata; import org.jenkinsci.test.acceptance.update_center.UpdateCenterMetadataProvider; +import org.openqa.selenium.WebDriver; import java.io.File; import java.util.function.Consumer; @@ -31,6 +33,7 @@ protected void configure() { Matchers.returns(Matchers.subclassesOf(UpdateCenterMetadata.class)), new ResultDecoratingAdapter<>(new VersionOverridesDecorator()) ); + bind(WebDriver.class).toProvider(WebDriverProvider.class).in(TestScope.class); } private static class ResultDecoratingAdapter implements MethodInterceptor { diff --git a/acceptance-tests/src/main/java/hudson/plugin/gradle/ath/config/WebDriverProvider.java b/acceptance-tests/src/main/java/hudson/plugin/gradle/ath/config/WebDriverProvider.java new file mode 100644 index 00000000..782a97c9 --- /dev/null +++ b/acceptance-tests/src/main/java/hudson/plugin/gradle/ath/config/WebDriverProvider.java @@ -0,0 +1,97 @@ +package hudson.plugin.gradle.ath.config; + +import com.google.common.collect.ImmutableMap; +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.jenkinsci.test.acceptance.FallbackConfig; +import org.jenkinsci.test.acceptance.guice.TestCleaner; +import org.jenkinsci.test.acceptance.guice.TestName; +import org.jenkinsci.test.acceptance.selenium.Scroller; +import org.jenkinsci.test.acceptance.utils.ElasticTime; +import org.junit.runners.model.Statement; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.UnsupportedCommandException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.support.events.EventFiringWebDriver; + +import java.io.IOException; +import java.time.Duration; +import java.util.Locale; +import java.util.logging.Logger; + +class WebDriverProvider implements Provider { + + private static final Logger LOGGER = Logger.getLogger(FallbackConfig.class.getName()); + private final TestCleaner testCleaner; + private final FallbackConfig fallbackConfig; + private final TestName testName; + private final ElasticTime time; + + @Inject + public WebDriverProvider( + TestCleaner testCleaner, + FallbackConfig fallbackConfig, + TestName testName, + ElasticTime time) { + this.testCleaner = testCleaner; + this.fallbackConfig = fallbackConfig; + this.testName = testName; + this.time = time; + } + + private String getBrowser() { + String browser = System.getenv("BROWSER"); + if (browser == null) browser = "chrome-container"; + browser = browser.toLowerCase(Locale.ENGLISH); + return browser; + } + + @Override + public WebDriver get() { + if ("chrome".equals(getBrowser())) { + return createChromeWebDriver(); + } + try { + return fallbackConfig.createWebDriver(testCleaner, testName, time); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private WebDriver createChromeWebDriver() { + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.setBinary("/usr/bin/google-chrome-for-testing"); + chromeOptions.addArguments("--window-position=0,0"); + chromeOptions.addArguments("--window-size=1280,720"); + chromeOptions.addArguments("--lang=en_US"); + chromeOptions.setExperimentalOption("prefs", ImmutableMap.of("intl.accept_languages", "en_US")); + ChromeDriver d = new ChromeDriver(chromeOptions); + Dimension oldSize = d.manage().window().getSize(); + if (oldSize.height < 1050 || oldSize.width < 1680) { + d.manage().window().setSize(new Dimension(1680, 1050)); + } + final EventFiringWebDriver driver = new EventFiringWebDriver(d); + driver.register(new Scroller()); + try { + driver.manage().timeouts().pageLoadTimeout(Duration.ofMillis(time.seconds(FallbackConfig.PAGE_LOAD_TIMEOUT))); + driver.manage().timeouts().implicitlyWait(Duration.ofMillis(time.seconds(FallbackConfig.IMPLICIT_WAIT_TIMEOUT))); + } catch (UnsupportedCommandException e) { + // sauce labs RemoteWebDriver doesn't support this + LOGGER.info(d + " doesn't support page load timeout"); + } + testCleaner.addTask(new Statement() { + @Override + public void evaluate() { + driver.quit(); + } + + @Override + public String toString() { + return "Close WebDriver after test"; + } + }); + return driver; + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 19638285..20b77f8c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -198,6 +198,7 @@ tasks.test { maxRetries.set(2) maxFailures.set(5) } + failOnPassedAfterRetry.set(false) } useJUnitPlatform() }