Use Docker Java API to manage container for WebDriver

Previously we had a few customized Gradle build task to manage
the Docker container for provisioning browser and ChromeDriverService
used by WebDriver tests. This CL changed to use a java library
from testcontainers.org to achieve the same purpose. The main
benefit of it is that we can expect to run the WebDriver tests
from IDE going forward.

Also, this CL refactored the structure of WebDriver related classes
to have JUnit rule to manage the lifecycle of WebDriver instance,
this is also compatible with the API from testcontainers library.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=241539861
This commit is contained in:
shicong 2019-04-02 09:07:55 -07:00 committed by jianglai
parent f7dbaf1f81
commit aae1e42da8
29 changed files with 376 additions and 177 deletions

View file

@ -11,10 +11,6 @@ def screenshotsForGoldensDir = "${project.buildDir}/screenshots_for_goldens"
def newGoldensDir = "${project.buildDir}/new_golden_images"
def goldensDir =
"${javatestsDir}/google/registry/webdriver/goldens/chrome-linux"
def chromeWebdriverServicePort = 4444
// Url to the Chrome Webdriver service used by class ChromeWebDriverPlusScreenDiffer
def chromeWebdriverServiceUrl =
"http://localhost:${chromeWebdriverServicePort}/wd/hub"
// Tests that conflict with (mostly unidentified) members of the main test
// suite. It is unclear if they are offenders (i.e., those that pollute global
@ -240,6 +236,7 @@ dependencies {
testCompile deps['org.seleniumhq.selenium:selenium-java']
testCompile deps['org.seleniumhq.selenium:selenium-remote-driver']
maybeRuntime deps['org.slf4j:slf4j-api']
testCompile deps['org.testcontainers:selenium']
maybeRuntime deps['org.tukaani:xz']
maybeRuntime deps['org.xerial.snappy:snappy-java']
compile deps['xerces:xmlParserAPIs']
@ -584,30 +581,6 @@ task outcastTest(type: Test) {
maxParallelForks 5
}
task dockerStopAtStart(type: Exec) {
ignoreExitValue true
commandLine 'docker', 'stop', 'chrome-plus-chromedriver'
}
task dockerStopAtEnd(type: Exec) {
ignoreExitValue true
commandLine 'docker', 'stop', 'chrome-plus-chromedriver'
}
task dockerRun(type: Exec) {
dependsOn dockerStopAtStart
def runCommand = []
runCommand << 'docker'
runCommand << 'run' << '--detach'
runCommand << '--name' << 'chrome-plus-chromedriver'
runCommand << '--publish'
runCommand << "${chromeWebdriverServicePort}:${chromeWebdriverServicePort}"
runCommand << '--volume' << '/dev/shm:/dev/shm'
runCommand << '--network' << 'host'
runCommand << '--rm'
runCommand << 'selenium/standalone-chrome:3.141.59-gold'
commandLine runCommand
}
task findGoldenImages(type: JavaExec) {
classpath = sourceSets.test.runtimeClasspath
main = 'google.registry.webdriver.GoldenImageFinder'
@ -623,7 +596,6 @@ task findGoldenImages(type: JavaExec) {
}
task generateGoldenImages(type: Test) {
dependsOn dockerRun
// Common exclude pattern. See README in parent directory for explanation.
exclude "**/*TestCase.*", "**/*TestSuite.*"
include "**/webdriver/*"
@ -634,13 +606,12 @@ task generateGoldenImages(type: Test) {
systemProperty 'test.screenshot.dir', screenshotsForGoldensDir
systemProperty 'test.screenshot.runAllAttempts', 'true'
systemProperty 'test.screenshot.maxAttempts', '5'
systemProperty 'webdriver.chromeDriverServiceUrl', chromeWebdriverServiceUrl
doFirst {
new File(screenshotsForGoldensDir).deleteDir()
}
}
generateGoldenImages.finalizedBy(dockerStopAtEnd, findGoldenImages)
generateGoldenImages.finalizedBy(findGoldenImages)
test {
// Common exclude pattern. See README in parent directory for explanation.
@ -648,8 +619,6 @@ test {
exclude fragileTestPatterns
exclude outcastTestPatterns
dependsOn dockerRun
// Run every test class in its own process.
// Uncomment to unblock build while troubleshooting inexplicable test errors.
// This setting makes the build take 35 minutes, without it it takes about 10.
@ -658,14 +627,10 @@ test {
// Sets the maximum number of test executors that may exist at the same time.
maxParallelForks 5
systemProperty 'webdriver.chromeDriverServiceUrl', chromeWebdriverServiceUrl
doFirst {
new File(screenshotsDir).deleteDir()
}
}.dependsOn(fragileTest, outcastTest)
test.finalizedBy(dockerStopAtEnd)
task nomulus(type: Jar) {
manifest {

View file

@ -116,6 +116,8 @@ com.googlecode.java-diff-utils:diffutils:1.3.0
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:57.1
com.jcraft:jsch:0.1.55
com.kohlschutter.junixsocket:junixsocket-common:2.0.4
com.kohlschutter.junixsocket:junixsocket-native-common:2.0.4
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okhttp:okhttp:2.5.0
com.squareup.okio:okio:1.14.0
@ -155,7 +157,8 @@ io.opencensus:opencensus-contrib-grpc-util:0.17.0
io.opencensus:opencensus-contrib-http-util:0.18.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.annotation:javax.annotation-api:1.2
javax.activation:javax.activation-api:1.2.0
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
javax.jdo:jdo2-api:2.3-eb
@ -163,12 +166,14 @@ javax.mail:mail:1.4
javax.servlet:servlet-api:2.5
javax.transaction:transaction-api:1.1
javax.validation:validation-api:1.0.0.GA
javax.xml.bind:jaxb-api:2.3.0
javax.xml.bind:jaxb-api:2.3.1
jline:jline:1.0
joda-time:joda-time:2.9.2
junit:junit:4.12
net.bytebuddy:byte-buddy-agent:1.9.7
net.bytebuddy:byte-buddy:1.9.7
net.java.dev.jna:jna-platform:5.2.0
net.java.dev.jna:jna:5.2.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-job-management:2.11.0
org.apache.beam:beam-model-pipeline:2.11.0
@ -181,7 +186,7 @@ org.apache.beam:beam-sdks-java-extensions-protobuf:2.11.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.11.0
org.apache.beam:beam-vendor-grpc-1_13_1:0.2
org.apache.beam:beam-vendor-guava-20_0:0.1
org.apache.commons:commons-compress:1.8.1
org.apache.commons:commons-compress:1.18
org.apache.commons:commons-exec:1.3
org.apache.commons:commons-lang3:3.8.1
org.apache.commons:commons-text:1.6
@ -206,6 +211,7 @@ org.easymock:easymock:3.0
org.hamcrest:hamcrest-all:1.3
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest-library:1.3
org.jetbrains:annotations:17.0.0
org.joda:joda-money:0.10.0
org.json:json:20160810
org.mockito:mockito-core:2.25.0
@ -217,6 +223,10 @@ org.ow2.asm:asm-commons:6.0
org.ow2.asm:asm-tree:6.0
org.ow2.asm:asm-util:6.0
org.ow2.asm:asm:6.0
org.rnorth.duct-tape:duct-tape:1.0.7
org.rnorth.visible-assertions:visible-assertions:2.1.2
org.rnorth:tcp-unix-socket-proxy:1.0.2
org.scijava:native-lib-loader:2.0.2
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
org.seleniumhq.selenium:selenium-edge-driver:3.141.59
@ -227,7 +237,9 @@ org.seleniumhq.selenium:selenium-opera-driver:3.141.59
org.seleniumhq.selenium:selenium-remote-driver:3.141.59
org.seleniumhq.selenium:selenium-safari-driver:3.141.59
org.seleniumhq.selenium:selenium-support:3.141.59
org.slf4j:slf4j-api:1.7.25
org.slf4j:slf4j-api:1.7.26
org.testcontainers:selenium:1.10.7
org.testcontainers:testcontainers:1.10.7
org.threeten:threetenbp:1.3.3
org.tukaani:xz:1.8
org.w3c.css:sac:1.3

View file

@ -115,6 +115,8 @@ com.googlecode.java-diff-utils:diffutils:1.3.0
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:57.1
com.jcraft:jsch:0.1.55
com.kohlschutter.junixsocket:junixsocket-common:2.0.4
com.kohlschutter.junixsocket:junixsocket-native-common:2.0.4
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okhttp:okhttp:2.5.0
com.squareup.okio:okio:1.14.0
@ -153,7 +155,8 @@ io.opencensus:opencensus-contrib-grpc-util:0.17.0
io.opencensus:opencensus-contrib-http-util:0.18.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.annotation:javax.annotation-api:1.2
javax.activation:javax.activation-api:1.2.0
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
javax.jdo:jdo2-api:2.3-eb
@ -161,12 +164,14 @@ javax.mail:mail:1.4
javax.servlet:servlet-api:2.5
javax.transaction:transaction-api:1.1
javax.validation:validation-api:1.0.0.GA
javax.xml.bind:jaxb-api:2.3.0
javax.xml.bind:jaxb-api:2.3.1
jline:jline:1.0
joda-time:joda-time:2.9.2
junit:junit:4.12
net.bytebuddy:byte-buddy-agent:1.9.7
net.bytebuddy:byte-buddy:1.9.7
net.java.dev.jna:jna-platform:5.2.0
net.java.dev.jna:jna:5.2.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-job-management:2.11.0
org.apache.beam:beam-model-pipeline:2.11.0
@ -179,7 +184,7 @@ org.apache.beam:beam-sdks-java-extensions-protobuf:2.11.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.11.0
org.apache.beam:beam-vendor-grpc-1_13_1:0.2
org.apache.beam:beam-vendor-guava-20_0:0.1
org.apache.commons:commons-compress:1.8.1
org.apache.commons:commons-compress:1.18
org.apache.commons:commons-exec:1.3
org.apache.commons:commons-lang3:3.8.1
org.apache.commons:commons-text:1.6
@ -204,6 +209,7 @@ org.easymock:easymock:3.0
org.hamcrest:hamcrest-all:1.3
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest-library:1.3
org.jetbrains:annotations:17.0.0
org.joda:joda-money:0.10.0
org.json:json:20160810
org.mockito:mockito-core:2.25.0
@ -215,6 +221,10 @@ org.ow2.asm:asm-commons:6.0
org.ow2.asm:asm-tree:6.0
org.ow2.asm:asm-util:6.0
org.ow2.asm:asm:6.0
org.rnorth.duct-tape:duct-tape:1.0.7
org.rnorth.visible-assertions:visible-assertions:2.1.2
org.rnorth:tcp-unix-socket-proxy:1.0.2
org.scijava:native-lib-loader:2.0.2
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
org.seleniumhq.selenium:selenium-edge-driver:3.141.59
@ -225,7 +235,9 @@ org.seleniumhq.selenium:selenium-opera-driver:3.141.59
org.seleniumhq.selenium:selenium-remote-driver:3.141.59
org.seleniumhq.selenium:selenium-safari-driver:3.141.59
org.seleniumhq.selenium:selenium-support:3.141.59
org.slf4j:slf4j-api:1.7.25
org.slf4j:slf4j-api:1.7.26
org.testcontainers:selenium:1.10.7
org.testcontainers:testcontainers:1.10.7
org.threeten:threetenbp:1.3.3
org.tukaani:xz:1.8
org.w3c.css:sac:1.3

View file

@ -116,6 +116,8 @@ com.googlecode.java-diff-utils:diffutils:1.3.0
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:57.1
com.jcraft:jsch:0.1.55
com.kohlschutter.junixsocket:junixsocket-common:2.0.4
com.kohlschutter.junixsocket:junixsocket-native-common:2.0.4
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okhttp:okhttp:2.5.0
com.squareup.okio:okio:1.14.0
@ -157,7 +159,8 @@ io.opencensus:opencensus-contrib-grpc-util:0.17.0
io.opencensus:opencensus-contrib-http-util:0.18.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.annotation:javax.annotation-api:1.2
javax.activation:javax.activation-api:1.2.0
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
javax.jdo:jdo2-api:2.3-eb
@ -165,12 +168,14 @@ javax.mail:mail:1.4
javax.servlet:servlet-api:2.5
javax.transaction:transaction-api:1.1
javax.validation:validation-api:1.0.0.GA
javax.xml.bind:jaxb-api:2.3.0
javax.xml.bind:jaxb-api:2.3.1
jline:jline:1.0
joda-time:joda-time:2.9.2
junit:junit:4.12
net.bytebuddy:byte-buddy-agent:1.9.7
net.bytebuddy:byte-buddy:1.9.7
net.java.dev.jna:jna-platform:5.2.0
net.java.dev.jna:jna:5.2.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-job-management:2.11.0
org.apache.beam:beam-model-pipeline:2.11.0
@ -183,7 +188,7 @@ org.apache.beam:beam-sdks-java-extensions-protobuf:2.11.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.11.0
org.apache.beam:beam-vendor-grpc-1_13_1:0.2
org.apache.beam:beam-vendor-guava-20_0:0.1
org.apache.commons:commons-compress:1.8.1
org.apache.commons:commons-compress:1.18
org.apache.commons:commons-exec:1.3
org.apache.commons:commons-lang3:3.8.1
org.apache.commons:commons-text:1.6
@ -211,6 +216,7 @@ org.glassfish.jaxb:txw2:2.3.0
org.hamcrest:hamcrest-all:1.3
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest-library:1.3
org.jetbrains:annotations:17.0.0
org.joda:joda-money:0.10.0
org.json:json:20160810
org.jvnet.staxex:stax-ex:1.7.8
@ -223,6 +229,10 @@ org.ow2.asm:asm-commons:6.0
org.ow2.asm:asm-tree:6.0
org.ow2.asm:asm-util:6.0
org.ow2.asm:asm:6.0
org.rnorth.duct-tape:duct-tape:1.0.7
org.rnorth.visible-assertions:visible-assertions:2.1.2
org.rnorth:tcp-unix-socket-proxy:1.0.2
org.scijava:native-lib-loader:2.0.2
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
org.seleniumhq.selenium:selenium-edge-driver:3.141.59
@ -233,7 +243,9 @@ org.seleniumhq.selenium:selenium-opera-driver:3.141.59
org.seleniumhq.selenium:selenium-remote-driver:3.141.59
org.seleniumhq.selenium:selenium-safari-driver:3.141.59
org.seleniumhq.selenium:selenium-support:3.141.59
org.slf4j:slf4j-api:1.7.25
org.slf4j:slf4j-api:1.7.26
org.testcontainers:selenium:1.10.7
org.testcontainers:testcontainers:1.10.7
org.threeten:threetenbp:1.3.3
org.tukaani:xz:1.8
org.w3c.css:sac:1.3

View file

@ -116,6 +116,8 @@ com.googlecode.java-diff-utils:diffutils:1.3.0
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:57.1
com.jcraft:jsch:0.1.55
com.kohlschutter.junixsocket:junixsocket-common:2.0.4
com.kohlschutter.junixsocket:junixsocket-native-common:2.0.4
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okhttp:okhttp:2.5.0
com.squareup.okio:okio:1.14.0
@ -157,7 +159,8 @@ io.opencensus:opencensus-contrib-grpc-util:0.17.0
io.opencensus:opencensus-contrib-http-util:0.18.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.annotation:javax.annotation-api:1.2
javax.activation:javax.activation-api:1.2.0
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
javax.jdo:jdo2-api:2.3-eb
@ -165,12 +168,14 @@ javax.mail:mail:1.4
javax.servlet:servlet-api:2.5
javax.transaction:transaction-api:1.1
javax.validation:validation-api:1.0.0.GA
javax.xml.bind:jaxb-api:2.3.0
javax.xml.bind:jaxb-api:2.3.1
jline:jline:1.0
joda-time:joda-time:2.9.2
junit:junit:4.12
net.bytebuddy:byte-buddy-agent:1.9.7
net.bytebuddy:byte-buddy:1.9.7
net.java.dev.jna:jna-platform:5.2.0
net.java.dev.jna:jna:5.2.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-job-management:2.11.0
org.apache.beam:beam-model-pipeline:2.11.0
@ -183,7 +188,7 @@ org.apache.beam:beam-sdks-java-extensions-protobuf:2.11.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.11.0
org.apache.beam:beam-vendor-grpc-1_13_1:0.2
org.apache.beam:beam-vendor-guava-20_0:0.1
org.apache.commons:commons-compress:1.8.1
org.apache.commons:commons-compress:1.18
org.apache.commons:commons-exec:1.3
org.apache.commons:commons-lang3:3.8.1
org.apache.commons:commons-text:1.6
@ -211,6 +216,7 @@ org.glassfish.jaxb:txw2:2.3.0
org.hamcrest:hamcrest-all:1.3
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest-library:1.3
org.jetbrains:annotations:17.0.0
org.joda:joda-money:0.10.0
org.json:json:20160810
org.jvnet.staxex:stax-ex:1.7.8
@ -223,6 +229,10 @@ org.ow2.asm:asm-commons:6.0
org.ow2.asm:asm-tree:6.0
org.ow2.asm:asm-util:6.0
org.ow2.asm:asm:6.0
org.rnorth.duct-tape:duct-tape:1.0.7
org.rnorth.visible-assertions:visible-assertions:2.1.2
org.rnorth:tcp-unix-socket-proxy:1.0.2
org.scijava:native-lib-loader:2.0.2
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
org.seleniumhq.selenium:selenium-edge-driver:3.141.59
@ -233,7 +243,9 @@ org.seleniumhq.selenium:selenium-opera-driver:3.141.59
org.seleniumhq.selenium:selenium-remote-driver:3.141.59
org.seleniumhq.selenium:selenium-safari-driver:3.141.59
org.seleniumhq.selenium:selenium-support:3.141.59
org.slf4j:slf4j-api:1.7.25
org.slf4j:slf4j-api:1.7.26
org.testcontainers:selenium:1.10.7
org.testcontainers:testcontainers:1.10.7
org.threeten:threetenbp:1.3.3
org.tukaani:xz:1.8
org.w3c.css:sac:1.3