Skip to content

Commit

Permalink
[bazel] Use the new test suites for selenium test suites
Browse files Browse the repository at this point in the history
In the java tree, at least. This dramatically improves clean build
time, with critical path times going from 825s to 263s on my machine.

We still achieve good parallelism in the test execution times.
  • Loading branch information
shs96c committed Nov 30, 2020
1 parent aac21d3 commit 26efaf6
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 96 deletions.
27 changes: 12 additions & 15 deletions common/private/selenium_test.bzl
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
_DEFAULT_BROWSER = "firefox"
DEFAULT_BROWSER = "firefox"

_COMMON_TAGS = [
"browser-test",
"no-sandbox",
"requires-network",
]

_BROWSERS = {
BROWSERS = {
"chrome": {
"deps": ["//java/client/src/org/openqa/selenium/chrome"],
"jvm_flags": ["-Dselenium.browser=chrome"],
Expand Down Expand Up @@ -53,14 +53,13 @@ _BROWSERS = {

def selenium_test(name, test_class, size = "medium", browsers = None, **kwargs):
if browsers == None:
browsers = _BROWSERS.keys()
browsers = BROWSERS.keys()

if len(browsers) == 0:
fail("At least one browser must be specified.")

default_browser = _DEFAULT_BROWSER if _DEFAULT_BROWSER in browsers else browsers[0]
default_browser = DEFAULT_BROWSER if DEFAULT_BROWSER in browsers else browsers[0]

tests = []
test_name = test_class.rpartition(".")[2]

data = kwargs["data"] if "data" in kwargs else []
Expand All @@ -72,39 +71,37 @@ def selenium_test(name, test_class, size = "medium", browsers = None, **kwargs):
stripped_args.pop("jvm_flags", None)
stripped_args.pop("tags", None)


for browser in browsers:
if not browser in _BROWSERS:
if not browser in BROWSERS:
fail("Unrecognized browser: " + browser)

test = test_name if browser == default_browser else "%s-%s" % (test_name, browser)
test = "%s-%s" % (name, browser)

native.java_test(
name = test,
test_class = test_class,
size = size,
jvm_flags = _BROWSERS[browser]["jvm_flags"] + jvm_flags,
tags = _BROWSERS[browser]["tags"] + tags,
jvm_flags = BROWSERS[browser]["jvm_flags"] + jvm_flags,
tags = BROWSERS[browser]["tags"] + tags,
data = data,
**stripped_args
)
tests.append(test)

if not "no-remote" in tags:
native.java_test(
name = "%s-remote" % test,
test_class = test_class,
size = size,
jvm_flags = _BROWSERS[browser]["jvm_flags"] + jvm_flags + [
jvm_flags = BROWSERS[browser]["jvm_flags"] + jvm_flags + [
"-Dselenium.browser.remote=true",
"-Dselenium.browser.remote.path=$(location //java/server/src/org/openqa/selenium/grid:selenium_server_deploy.jar)",
],
tags = _BROWSERS[browser]["tags"] + tags + ["remote"],
tags = BROWSERS[browser]["tags"] + tags + ["remote"],
data = data + [
"//java/server/src/org/openqa/selenium/grid:selenium_server_deploy.jar",
],
**stripped_args
)
tests.append("%s-remote" % test)

native.test_suite(name = "%s-all" % test_name, tests = tests, tags = ["manual"])
# Handy way to run everything
native.test_suite(name = name, tests = [":%s-%s" % (name, default_browser)], tags = tags + ["manual"])
2 changes: 1 addition & 1 deletion java/defs.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ load("//java/private:javadoc.bzl", _javadoc = "javadoc")
load("//java/private:module.bzl", _java_module = "java_module")
load("//java/private:spotbugs_config.bzl", _spotbugs_config = "spotbugs_config")
load("//java/private:suite.bzl", _java_test_suite = "java_test_suite")
load("//java/private:test.bzl", _java_selenium_test_suite = "java_selenium_test_suite")
load("//java/private:selenium_suite.bzl", _java_selenium_test_suite = "java_selenium_test_suite")

java_binary = _java_binary
java_dist_zip = _java_dist_zip
Expand Down
15 changes: 15 additions & 0 deletions java/private/package.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Common package prefixes, in the order we want to check for them
_PREFIXES = (".com.", ".org.", ".net.", ".io.")

# By default bazel computes the name of test classes based on the
# standard Maven directory structure, which we may not always use,
# so try to compute the correct package name.
def package_name():
pkg = native.package_name().replace("/", ".")

for prefix in _PREFIXES:
idx = pkg.find(prefix)
if idx != -1:
return pkg[idx + 1:] + "."

return ""
39 changes: 39 additions & 0 deletions java/private/selenium_suite.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
load("//common/private:selenium_test.bzl", "BROWSERS", "DEFAULT_BROWSER", "selenium_test")
load(":package.bzl", "package_name")
load(":suite.bzl", "java_test_suite")

def java_selenium_test_suite(
name,
browsers = BROWSERS.keys(),
srcs = None,
deps = None,
data = [],
jvm_flags = [],
tags = [],
**kwargs):
suite_name = "".join([p.capitalize() for p in name.replace("-", " ").replace("_", " ").split(" ")])

# Build a single suite that everyone can use
java_test_suite(
name = "%s-suite" % name,
srcs = srcs,
suite_name = suite_name,
data = data,
deps = deps,
tags = tags + ["manual"],
**kwargs,
)

suite_class = package_name() + suite_name

selenium_test(
name = name,
test_class = suite_class,
browsers = browsers,
size = "large",
runtime_deps = deps + [
":%s-suite" % name,
":%s-suite-suite-lib" % name,
],
shard_count = len(srcs),
)
25 changes: 6 additions & 19 deletions java/private/suite.bzl
Original file line number Diff line number Diff line change
@@ -1,25 +1,10 @@
load(":library.bzl", "java_library")

# Common package prefixes, in the order we want to check for them
_PREFIXES = (".com.", ".org.", ".net.", ".io.")

# By default bazel computes the name of test classes based on the
# standard Maven directory structure, which we may not always use,
# so try to compute the correct package name.
def _package_name():
pkg = native.package_name().replace("/", ".")

for prefix in _PREFIXES:
idx = pkg.find(prefix)
if idx != -1:
return pkg[idx + 1:] + "."

return ""
load(":package.bzl", "package_name")

def _test_class_name(src_file):
test_name = src_file[:-len(".java")]

pkg = _package_name()
pkg = package_name()
if pkg != None:
return pkg + "." + test_name.replace("/", ".")
return test_name.replace("/", ".")
Expand Down Expand Up @@ -82,13 +67,15 @@ def java_test_suite(
name,
srcs,
size = None,
suite_name = None,
test_identifiers = ["Test.java"],
deps = [],
tags = [],
**kwargs):
suite_name = "".join([p.capitalize() for p in name.replace("-", " ").replace("_", " ").split(" ")])
if not suite_name:
suite_name = "".join([p.capitalize() for p in name.replace("-", " ").replace("_", " ").split(" ")])

pkg = _package_name()
pkg = package_name()
test_classes = [pkg + src[:-len(".java")].replace("/", ".") for src in srcs if _matches(test_identifiers, src)]

additional_tags = [] if size == "small" else ["no-sandbox"]
Expand Down
61 changes: 0 additions & 61 deletions java/private/test.bzl

This file was deleted.

0 comments on commit 26efaf6

Please sign in to comment.