From 43bb4e331c9fa7a195ac9451591e36ace31557f0 Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Wed, 31 Mar 2021 16:49:30 -0700 Subject: [PATCH] WIP: attempt to hook node runner script into bazel --- tools/webdriver/BUILD.bazel | 14 ++++- tools/webdriver/run-webdriver-test.ts | 13 +++-- tools/webdriver/tsconfig.json | 17 ++++++ tools/webdriver/webdriver.bzl | 75 +++++++++++++++++++++++---- 4 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 tools/webdriver/tsconfig.json diff --git a/tools/webdriver/BUILD.bazel b/tools/webdriver/BUILD.bazel index b837965017cf..9d8e676a3e6d 100644 --- a/tools/webdriver/BUILD.bazel +++ b/tools/webdriver/BUILD.bazel @@ -1,4 +1,5 @@ load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary") +load("//tools:defaults.bzl", "ts_library") package(default_visibility = ["//visibility:public"]) @@ -7,7 +8,18 @@ sh_library( srcs = ["run-webdriver-test.sh"], ) +ts_library( + name = "sources", + srcs = ["run-webdriver-test.ts"], + deps = ["@npm//@types/node"], + tsconfig = ":tsconfig.json", +) + nodejs_binary( name = "run-webdriver-test-platform-independent", - entry_point = "run-webdriver-test.ts", + entry_point = ":run-webdriver-test.ts", + data = [":sources"], + # TODO(josephperrott): update dependency usages to no longer need bazel patch module resolver + # See: https://github.com/bazelbuild/rules_nodejs/wiki#--bazel_patch_module_resolver-now-defaults-to-false-2324 + templated_args = ["--bazel_patch_module_resolver"], ) diff --git a/tools/webdriver/run-webdriver-test.ts b/tools/webdriver/run-webdriver-test.ts index b8e9fa1c8844..df9e9895bd01 100644 --- a/tools/webdriver/run-webdriver-test.ts +++ b/tools/webdriver/run-webdriver-test.ts @@ -58,8 +58,8 @@ async function waitForPortBound(port: number, timeout: number): Promise async function runTest(serverTarget: string, testTarget: string) { let server: child_process.ChildProcess | null = null; return new Promise(async (resolve, reject) => { - const serverPath = runfiles.resolve(`angular_material/${serverTarget}`); - const testPath = runfiles.resolve(`angular_material/${testTarget}`); + const serverPath = runfiles.resolve(`/${serverTarget}`); + const testPath = runfiles.resolve(`/${testTarget}`); const port = await getRandomFreePort(); process.env['E2E_APP_PORT'] = `${port}`; @@ -83,6 +83,9 @@ async function runTest(serverTarget: string, testTarget: string) { }).finally(() => server?.kill()); } -runTest(process.argv[0], process.argv[1]) - .then(() => process.exit()) - .catch(() => process.exit(1)); +if (require.main === module) { + console.error(process.argv); + runTest(process.argv[2], process.argv[3]) + .then(() => process.exit()) + .catch(() => process.exit(1)); +} diff --git a/tools/webdriver/tsconfig.json b/tools/webdriver/tsconfig.json new file mode 100644 index 000000000000..3f90d95156ec --- /dev/null +++ b/tools/webdriver/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "noUnusedParameters": false, + "noUnusedLocals": false, + "lib": ["es2015", "dom", "es2016.array.include"], + "moduleResolution": "node", + "strictNullChecks": true, + "noImplicitReturns": true, + "strictFunctionTypes": true, + "noImplicitThis": true, + "noImplicitAny": true, + "target": "es2015", + "types": [ + "node" + ] + } +} diff --git a/tools/webdriver/webdriver.bzl b/tools/webdriver/webdriver.bzl index a60b6743eea8..09d23fb0c47e 100644 --- a/tools/webdriver/webdriver.bzl +++ b/tools/webdriver/webdriver.bzl @@ -1,6 +1,51 @@ load("//tools:defaults.bzl", "jasmine_node_test") load("@io_bazel_rules_webtesting//web:web.bzl", "web_test") +def _webdriver_test_impl(ctx): + executable = ctx.actions.declare_file(ctx.label.name) + args = ctx.actions.args() + args.add(ctx.executable.server) + args.add(ctx.executable.test) + tools = [ + ctx.executable.server, + ctx.executable.test, + ctx.executable._runner, + ] + + ctx.actions.run( + outputs = [executable], + tools = [ctx.executable.server, ctx.executable.test, ctx.executable._runner], + arguments = [args], + executable = ctx.executable._runner, + ) + + return [ + DefaultInfo( + executable = executable, + runfiles = ctx.runfiles(files = tools) + ), + ] + +webdriver_test = rule( + implementation = _webdriver_test_impl, + test = True, + attrs = { + "server": attr.label( + executable = True, + cfg = "exec", + ), + "test": attr.label( + executable = True, + cfg = "exec", + ), + "_runner": attr.label( + executable = True, + cfg = "exec", + default = Label("//tools/webdriver:run-webdriver-test-platform-independent"), + ), + }, +) + def webdriver_e2e_test(name, deps, browser, tags = [], **kwargs): jasmine_node_test( name = "%s_jasmine_node_test" % name, @@ -19,18 +64,26 @@ def webdriver_e2e_test(name, deps, browser, tags = [], **kwargs): test = ":%s_jasmine_node_test" % name, ) - native.sh_test( + webdriver_test( name = name, testonly = True, - srcs = ["//tools/webdriver:run-webdriver-test"], - args = [ - "$(location //src/e2e-app:devserver)", - "$(location :%s_web_test)" % name, - ], - data = [ - ":%s_web_test" % name, - "//src/e2e-app:devserver", - ], + server = "//src/e2e-app:devserver", + test = ":%s_web_test" % name, tags = tags + ["e2e"], - deps = ["@bazel_tools//tools/bash/runfiles"], ) + +# native.sh_test( +# name = name, +# testonly = True, +# srcs = ["//tools/webdriver:run-webdriver-test"], +# args = [ +# "$(location //src/e2e-app:devserver)", +# "$(location :%s_web_test)" % name, +# ], +# data = [ +# ":%s_web_test" % name, +# "//src/e2e-app:devserver", +# ], +# tags = tags + ["e2e"], +# deps = ["@bazel_tools//tools/bash/runfiles"], +# )