diff --git a/WORKSPACE b/WORKSPACE index 3775ab4b70aa31..45aea1960c7655 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -20,7 +20,10 @@ http_archive( name = "build_bazel_rules_nodejs", patch_args = ["-p1"], # Patch https://github.com/bazelbuild/rules_nodejs/pull/903 - patches = ["//tools:rollup_bundle_commonjs_ignoreGlobal.patch"], + patches = [ + "//tools:rules_nodejs_pull_1320.patch", + "//tools:rollup_bundle_commonjs_ignoreGlobal.patch", + ], sha256 = "3d7296d834208792fa3b2ded8ec04e75068e3de172fae79db217615bd75a6ff7", urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.39.1/rules_nodejs-0.39.1.tar.gz"], ) @@ -113,12 +116,9 @@ load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories" web_test_repositories() -load("@io_bazel_rules_webtesting//web/versioned:browsers-0.3.2.bzl", "browser_repositories") +load("//tools/browsers:browser_repositories.bzl", "browser_repositories") -browser_repositories( - chromium = True, - firefox = True, -) +browser_repositories() # Setup the rules_typescript tooolchain load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") diff --git a/modules/benchmarks/benchmark_test.bzl b/modules/benchmarks/benchmark_test.bzl index b5d7c7419d4bf0..1c48ea441ce4fb 100644 --- a/modules/benchmarks/benchmark_test.bzl +++ b/modules/benchmarks/benchmark_test.bzl @@ -1,4 +1,4 @@ -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") +load("//tools:defaults.bzl", "protractor_web_test_suite") """ Macro that can be used to define a benchmark test. This differentiates from diff --git a/modules/playground/e2e_test/example_test.bzl b/modules/playground/e2e_test/example_test.bzl index 719512a2704aa1..45781f923cca08 100644 --- a/modules/playground/e2e_test/example_test.bzl +++ b/modules/playground/e2e_test/example_test.bzl @@ -1,5 +1,4 @@ -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") -load("//tools:defaults.bzl", "ts_library") +load("//tools:defaults.bzl", "protractor_web_test_suite", "ts_library") def example_test(name, srcs, server, data = [], **kwargs): ts_library( diff --git a/package.json b/package.json index 944cd8641c9109..93cf588021496a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "bazel:lint": "yarn bazel:format --lint=warn", "bazel:lint-fix": "yarn bazel:format --lint=fix", "preinstall": "node tools/yarn/check-yarn.js", - "postinstall": "yarn update-webdriver && node --preserve-symlinks --preserve-symlinks-main ./tools/postinstall-patches.js", + "postinstall": "yarn update-webdriver && patch-package && node --preserve-symlinks --preserve-symlinks-main ./tools/postinstall-patches.js", "update-webdriver": "webdriver-manager update --gecko false $CI_CHROMEDRIVER_VERSION_ARG", "check-env": "gulp check-env", "commitmsg": "node ./scripts/git/commit-msg.js", @@ -159,6 +159,7 @@ "karma-sourcemap-loader": "^0.3.7", "madge": "0.5.0", "mutation-observer": "^1.0.3", + "patch-package": "^6.2.0", "rewire": "2.5.2", "sauce-connect": "https://saucelabs.com/downloads/sc-4.5.1-linux.tar.gz", "semver": "^6.3.0", diff --git a/packages/compiler-cli/integrationtest/test.js b/packages/compiler-cli/integrationtest/test.js index e8b9da6b83fccc..c30bb482c6179b 100644 --- a/packages/compiler-cli/integrationtest/test.js +++ b/packages/compiler-cli/integrationtest/test.js @@ -34,8 +34,8 @@ function nodejs_repository() { const nodejsBinaryExt = os.platform() === 'win32' ? '.bat' : '.sh'; const ngcBin = require.resolve(`./ngc_bin${nodejsBinaryExt}`); const xi18nBin = require.resolve(`./ng_xi18n${nodejsBinaryExt}`); -const nodeBin = - require.resolve(`${nodejs_repository()}/bin/node${(os.platform() === 'win32' ? '.cmd' : '')}`); +const nodeBin = require.resolve( + `${nodejs_repository()}/${(os.platform() === 'win32' ? 'bin/nodejs/node.exe' : 'bin/nodejs/bin/node')}`); const jasmineBin = require.resolve('npm/node_modules/jasmine/bin/jasmine.js'); // Prepare the test directory before building the integration test output. This ensures that diff --git a/packages/examples/common/BUILD.bazel b/packages/examples/common/BUILD.bazel index 15b1efb8eef5b9..552dc825efed8f 100644 --- a/packages/examples/common/BUILD.bazel +++ b/packages/examples/common/BUILD.bazel @@ -1,7 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") +load("//tools:defaults.bzl", "ng_module", "protractor_web_test_suite", "ts_library") load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( diff --git a/packages/examples/core/BUILD.bazel b/packages/examples/core/BUILD.bazel index 8105dae426df9f..7b74d1738a1e5e 100644 --- a/packages/examples/core/BUILD.bazel +++ b/packages/examples/core/BUILD.bazel @@ -1,7 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ts_library") -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") +load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "protractor_web_test_suite", "ts_library") load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( diff --git a/packages/examples/forms/BUILD.bazel b/packages/examples/forms/BUILD.bazel index 1d88fded72367e..367aa52f2ddeee 100644 --- a/packages/examples/forms/BUILD.bazel +++ b/packages/examples/forms/BUILD.bazel @@ -1,7 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") +load("//tools:defaults.bzl", "ng_module", "protractor_web_test_suite", "ts_library") load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( diff --git a/packages/examples/service-worker/push/BUILD.bazel b/packages/examples/service-worker/push/BUILD.bazel index b670a4566a78f7..fc0d1673959bff 100644 --- a/packages/examples/service-worker/push/BUILD.bazel +++ b/packages/examples/service-worker/push/BUILD.bazel @@ -1,7 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") +load("//tools:defaults.bzl", "ng_module", "protractor_web_test_suite", "ts_library") load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( diff --git a/packages/examples/service-worker/registration-options/BUILD.bazel b/packages/examples/service-worker/registration-options/BUILD.bazel index 5b3c4c0657094b..ad62153d4ee768 100644 --- a/packages/examples/service-worker/registration-options/BUILD.bazel +++ b/packages/examples/service-worker/registration-options/BUILD.bazel @@ -1,7 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") +load("//tools:defaults.bzl", "ng_module", "protractor_web_test_suite", "ts_library") load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( diff --git a/packages/examples/upgrade/upgrade_example.bzl b/packages/examples/upgrade/upgrade_example.bzl index 940a6141871e49..51928ead15d1c0 100644 --- a/packages/examples/upgrade/upgrade_example.bzl +++ b/packages/examples/upgrade/upgrade_example.bzl @@ -1,5 +1,4 @@ -load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_protractor//:index.bzl", "protractor_web_test_suite") +load("//tools:defaults.bzl", "ng_module", "protractor_web_test_suite", "ts_library") load("@npm_bazel_typescript//:index.bzl", "ts_devserver") """ diff --git a/packages/zone.js/test/karma_test.bzl b/packages/zone.js/test/karma_test.bzl index bb03db6de7f8d3..81ed5e01f521ec 100644 --- a/packages/zone.js/test/karma_test.bzl +++ b/packages/zone.js/test/karma_test.bzl @@ -101,6 +101,7 @@ def karma_test(name, env_srcs, env_deps, env_entry_point, test_srcs, test_deps, ":" + name + "_env_trim_map", ] + bootstrap + _karma_test_required_dist_files, + browsers = ["//tools/browsers:chromium"], static_files = [ ":assets/sample.json", ":assets/worker.js", @@ -123,6 +124,7 @@ def karma_test(name, env_srcs, env_deps, env_entry_point, test_srcs, test_deps, ":" + name + "_env_trim_map", "//packages/zone.js/dist:zone-testing-bundle-dist-test", ] + _karma_test_required_dist_files, + browsers = ["//tools/browsers:chromium"], config_file = "//:karma-js.conf.js", configuration_env_vars = ["KARMA_WEB_TEST_MODE"], data = [ diff --git a/patches/@bazel+protractor+0.39.1.patch b/patches/@bazel+protractor+0.39.1.patch new file mode 100644 index 00000000000000..4e304949e3e973 --- /dev/null +++ b/patches/@bazel+protractor+0.39.1.patch @@ -0,0 +1,108 @@ +diff --git a/node_modules/@bazel/protractor/protractor.conf.js b/node_modules/@bazel/protractor/protractor.conf.js +index 6f81d40..9f960b8 100755 +--- a/node_modules/@bazel/protractor/protractor.conf.js ++++ b/node_modules/@bazel/protractor/protractor.conf.js +@@ -15,6 +15,7 @@ + * limitations under the License. + */ + const path = require('path'); ++const child_process = require('child_process'); + + function log_verbose(...m) { + // This is a template file so we use __filename to output the actual filename +@@ -43,6 +44,49 @@ function setConf(conf, name, value, msg) { + conf[name] = value; + } + ++/** ++ * Helper function to find a particular namedFile ++ * within the webTestMetadata webTestFiles ++ */ ++function findNamedFile(webTestMetadata, key) { ++ let result; ++ webTestMetadata['webTestFiles'].forEach(entry => { ++ const webTestNamedFiles = entry['namedFiles']; ++ if (webTestNamedFiles && webTestNamedFiles[key]) { ++ if (entry['archiveFile']) { ++ const extractExe = findNamedFile(webTestMetadata, 'EXTRACT_EXE'); ++ result = extractWebArchive(extractExe, entry['archiveFile'], webTestNamedFiles[key]); ++ } else { ++ result = require.resolve(webTestNamedFiles[key]); ++ } ++ } ++ }); ++ return result; ++} ++ ++/** ++ * Helper function to extract a browser archive ++ * and return the path to extracted executable ++ */ ++function extractWebArchive(extractExe, archiveFile, executablePath) { ++ try { ++ if (!extractExe) { ++ throw new Error('No EXTRACT_EXE found'); ++ } ++ extractExe = require.resolve(extractExe); ++ archiveFile = require.resolve(archiveFile); ++ const extractedExecutablePath = path.join(process.cwd(), executablePath); ++ child_process.execFileSync( ++ extractExe, [archiveFile, '.'], {stdio: [process.stdin, process.stdout, process.stderr]}); ++ log_verbose( ++ `Extracting web archive ${archiveFile} with ${extractExe} to ${extractedExecutablePath}`); ++ return extractedExecutablePath; ++ } catch (e) { ++ console.error(`Failed to extract ${archiveFile}`); ++ throw e; ++ } ++} ++ + function mergeCapabilities(conf, capabilities) { + if (conf.capabilities) { + if (conf.capabilities.browserName === capabilities.browserName) { +@@ -139,12 +183,11 @@ if (process.env['WEB_TEST_METADATA']) { + // "@io_bazel_rules_webtesting//browsers:firefox-local" + // then the 'environment' will equal 'local' and + // 'webTestFiles' will contain the path to the binary to use +- const webTestNamedFiles = webTestMetadata['webTestFiles'][0]['namedFiles']; + const headless = !process.env['DISPLAY']; +- if (webTestNamedFiles['CHROMIUM']) { +- const chromeBin = require.resolve(webTestNamedFiles['CHROMIUM']); +- const chromeDriver = require.resolve(webTestNamedFiles['CHROMEDRIVER']); +- ++ const chromeBin = findNamedFile(webTestMetadata, 'CHROMIUM'); ++ const chromeDriver = findNamedFile(webTestMetadata, 'CHROMEDRIVER'); ++ console.error(JSON.stringify(webTestMetadata, null, 2)) ++ if (chromeBin && chromeDriver) { + // The sandbox needs to be disabled, because it causes Chrome to crash on some environments. + // See: http://chromedriver.chromium.org/help/chrome-doesn-t-start + const args = ['--no-sandbox']; +@@ -161,25 +204,9 @@ if (process.env['WEB_TEST_METADATA']) { + } + }); + } +- if (webTestNamedFiles['FIREFOX']) { +- // TODO(gmagolan): implement firefox support for protractor +- throw new Error('Firefox not yet support by protractor_web_test_suite'); +- +- // const firefoxBin = require.resolve(webTestNamedFiles['FIREFOX']) +- // const args = []; +- // if (headless) { +- // args.push("--headless") +- // args.push("--marionette") +- // } +- // setConf(conf, 'seleniumAddress', process.env.WEB_TEST_HTTP_SERVER.trim() + "/wd/hub", 'is +- // configured by Bazel for firefox browser') +- // mergeCapabilities(conf, { +- // browserName: "firefox", +- // 'moz:firefoxOptions': { +- // binary: firefoxBin, +- // args: args, +- // } +- // }, 'is determined by the browsers attribute'); ++ else { ++ // TODO(gmagolan): implement support for other browsers ++ throw new Error('Only chrome supported by protractor_web_test_suite'); + } + } else { + console.warn(`Unknown WEB_TEST_METADATA environment '${webTestMetadata['environment']}'`); diff --git a/tools/browsers/BUILD.bazel b/tools/browsers/BUILD.bazel new file mode 100644 index 00000000000000..883a3c7202ab64 --- /dev/null +++ b/tools/browsers/BUILD.bazel @@ -0,0 +1,68 @@ +# Copyright 2016 Google Inc. +# +# 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. +# +################################################################################ +# +load("@io_bazel_rules_webtesting//web:web.bzl", "browser", "web_test_archive") + +# Override of chromium web_test_archive so that the archive is selected based on platform +web_test_archive( + name = "chromium_archive", + testonly = True, + archive = select({ + "@io_bazel_rules_webtesting//common/conditions:linux": "@org_chromium_chromium_amd64//file", + "@io_bazel_rules_webtesting//common/conditions:mac": "@org_chromium_chromium_macos//file", + "@io_bazel_rules_webtesting//common/conditions:windows": "@org_chromium_chromium_windows//file", + }), + named_files = select({ + "@io_bazel_rules_webtesting//common/conditions:linux": {"CHROMIUM": "chrome-linux/chrome"}, + "@io_bazel_rules_webtesting//common/conditions:mac": {"CHROMIUM": "chrome-mac/Chromium.app/Contents/MacOS/chromium"}, + "@io_bazel_rules_webtesting//common/conditions:windows": {"CHROMIUM": "chrome-win/chrome.exe"}, + }), + visibility = ["//tools/browsers:__subpackages__"], +) + +# Override of chromedriver web_test_archive so that the archive is selected based on platform +web_test_archive( + name = "chromedriver_archive", + testonly = True, + archive = select({ + "@io_bazel_rules_webtesting//common/conditions:linux": "@org_chromium_chromedriver_amd64//file", + "@io_bazel_rules_webtesting//common/conditions:mac": "@org_chromium_chromedriver_macos//file", + "@io_bazel_rules_webtesting//common/conditions:windows": "@org_chromium_chromedriver_windows//file", + }), + named_files = select({ + "@io_bazel_rules_webtesting//common/conditions:linux": { + "CHROMEDRIVER": "chromedriver_linux64/chromedriver", + }, + "@io_bazel_rules_webtesting//common/conditions:mac": { + "CHROMEDRIVER": "chromedriver_mac64/chromedriver", + }, + "@io_bazel_rules_webtesting//common/conditions:windows": { + "CHROMEDRIVER": "chromedriver_win32/chromedriver.exe", + }, + }), + visibility = ["//tools/browsers:__subpackages__"], +) + +browser( + name = "chromium", + metadata = "chromium.json", + visibility = ["//visibility:public"], + deps = [ + ":chromedriver_archive", + ":chromium_archive", + "@io_bazel_rules_webtesting//go/wsl", + ], +) diff --git a/tools/browsers/browser_repositories.bzl b/tools/browsers/browser_repositories.bzl new file mode 100644 index 00000000000000..244de68df3c656 --- /dev/null +++ b/tools/browsers/browser_repositories.bzl @@ -0,0 +1,87 @@ +# Copyright 2018 The Bazel Authors. All rights reserved. +# +# 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. + +"""Pinned browser versions. + +This function is here to make browser repositories work with cross-platform RBE. +Unlike the rules_webtesting browser_repositories, this function defines +separate repositories for each platform +""" + +load("@io_bazel_rules_webtesting//web/internal:platform_http_file.bzl", _platform_http_file = "platform_http_file") + +def platform_http_file(name, licenses, sha256, urls): + """Platform spepcific browser repository. + + This works around a dificiency in io_bazel_rules_webtesting platform_http_file in that + it selects the platform when the repository rule is executed. This limits browsers + tests to run on the local user platform only. For cross-platform RBE we want a repository + to be defined per platform so the correct one can be selected. + """ + + _platform_http_file( + name = name, + amd64_sha256 = sha256, + amd64_urls = urls, + licenses = licenses, + macos_sha256 = sha256, + macos_urls = urls, + windows_sha256 = sha256, + windows_urls = urls, + ) + +def browser_repositories(): + """Load pinned rules_webtesting browser versions.""" + + platform_http_file( + name = "org_chromium_chromium_amd64", + licenses = ["notice"], # BSD 3-clause (maybe more?) + sha256 = "b1e30c4dec8a451f8fe10d1f2d3c71e491d0333425f32247fe5c80a0a354303d", + urls = ["https://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/664981/chrome-linux.zip"], + ) + + platform_http_file( + name = "org_chromium_chromium_macos", + licenses = ["notice"], # BSD 3-clause (maybe more?) + sha256 = "7c0ba93616f44a421330b1c1262e8899fbdf7916bed8b04c775e0426f6f35ec6", + urls = ["https://commondatastorage.googleapis.com/chromium-browser-snapshots/Mac/665002/chrome-mac.zip"], + ) + + platform_http_file( + name = "org_chromium_chromium_windows", + licenses = ["notice"], # BSD 3-clause (maybe more?) + sha256 = "f2facd0066270078d0e8999e684595274c359cac3946299a1ceedba2a5de1c63", + urls = ["https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win/664999/chrome-win.zip"], + ) + + platform_http_file( + name = "org_chromium_chromedriver_amd64", + licenses = ["reciprocal"], # BSD 3-clause, ICU, MPL 1.1, libpng (BSD/MIT-like), Academic Free License v. 2.0, BSD 2-clause, MIT + sha256 = "0ead02145854b60a3317b59031205b362fb4cfdb680fef20e95c89582e6e38be", + urls = ["https://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/664981/chromedriver_linux64.zip"], + ) + + platform_http_file( + name = "org_chromium_chromedriver_macos", + licenses = ["reciprocal"], # BSD 3-clause, ICU, MPL 1.1, libpng (BSD/MIT-like), Academic Free License v. 2.0, BSD 2-clause, MIT + sha256 = "8dd159e27b13b16262afa6993b15321e736c3b484da363c0e03bb050d72522c9", + urls = ["https://commondatastorage.googleapis.com/chromium-browser-snapshots/Mac/665002/chromedriver_mac64.zip"], + ) + + platform_http_file( + name = "org_chromium_chromedriver_windows", + licenses = ["reciprocal"], # BSD 3-clause, ICU, MPL 1.1, libpng (BSD/MIT-like), Academic Free License v. 2.0, BSD 2-clause, MIT + sha256 = "1cc881364974102182257a5c5c2b9cfed513689dee28924ca44df082bdf9fd60", + urls = ["https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win/664999/chromedriver_win32.zip"], + ) diff --git a/tools/browsers/chromium.json b/tools/browsers/chromium.json new file mode 100644 index 00000000000000..7fb23d3486695c --- /dev/null +++ b/tools/browsers/chromium.json @@ -0,0 +1,20 @@ +{ + "environment" : "local", + "capabilities" : { + "browserName" : "chrome", + "goog:chromeOptions" : { + "binary" : "%FILE:CHROMIUM%", + "args" : [ + "--headless", + "--use-gl=swiftshader-webgl" + ] + }, + "google:wslConfig": { + "binary": "%FILE:CHROMEDRIVER%", + "port":"%WSLPORT:WSL%", + "args": ["--port=%WSLPORT:WSL%"], + "status": true, + "shutdown": true + } + } +} diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 19f6501fd21fa1..daae9be1d09e84 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -4,6 +4,7 @@ load("@build_bazel_rules_nodejs//:index.bzl", _nodejs_binary = "nodejs_binary", load("@npm_bazel_jasmine//:index.bzl", _jasmine_node_test = "jasmine_node_test") load("@npm_bazel_karma//:index.bzl", _karma_web_test = "karma_web_test", _karma_web_test_suite = "karma_web_test_suite", _ts_web_test = "ts_web_test", _ts_web_test_suite = "ts_web_test_suite") load("@npm_bazel_typescript//:index.bzl", _ts_library = "ts_library") +load("@npm_bazel_protractor//:index.bzl", _protractor_web_test_suite = "protractor_web_test_suite") load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_package") load("//tools/ng_rollup_bundle:ng_rollup_bundle.bzl", _ng_rollup_bundle = "ng_rollup_bundle") load("//tools:ng_benchmark.bzl", _ng_benchmark = "ng_benchmark") @@ -194,12 +195,6 @@ def ts_web_test_suite(bootstrap = [], deps = [], runtime_deps = [], **kwargs): "//tools/testing:browser", ] + runtime_deps - tags = kwargs.pop("tags", []) - - # rules_webtesting has a required_tag "native" for `chromium-local` browser - if not "native" in tags: - tags = tags + ["native"] - _ts_web_test_suite( runtime_deps = local_runtime_deps, bootstrap = bootstrap, @@ -207,15 +202,7 @@ def ts_web_test_suite(bootstrap = [], deps = [], runtime_deps = [], **kwargs): # Run unit tests on local Chromium by default. # You can exclude tests based on tags, e.g. to skip Firefox testing, # `yarn bazel test --test_tag_filters=-browser:firefox-local [targets]` - browsers = [ - "@io_bazel_rules_webtesting//browsers:chromium-local", - # Don't test on local Firefox by default, for faster builds. - # We think that bugs in Angular tend to be caught the same in any - # evergreen browser. - # "@io_bazel_rules_webtesting//browsers:firefox-local", - # TODO(alexeagle): add remote browsers on SauceLabs - ], - tags = tags, + browsers = ["//tools/browsers:chromium"], **kwargs ) @@ -255,27 +242,21 @@ def karma_web_test_suite(bootstrap = [], deps = [], **kwargs): "//tools/rxjs:rxjs_umd_modules", ] + deps - tags = kwargs.pop("tags", []) - - # rules_webtesting has a required_tag "native" for `chromium-local` browser - if not "native" in tags: - tags = tags + ["native"] - _karma_web_test_suite( bootstrap = bootstrap, deps = local_deps, # Run unit tests on local Chromium by default. # You can exclude tests based on tags, e.g. to skip Firefox testing, # `yarn bazel test --test_tag_filters=-browser:firefox-local [targets]` - browsers = [ - "@io_bazel_rules_webtesting//browsers:chromium-local", - # Don't test on local Firefox by default, for faster builds. - # We think that bugs in Angular tend to be caught the same in any - # evergreen browser. - # "@io_bazel_rules_webtesting//browsers:firefox-local", - # TODO(alexeagle): add remote browsers on SauceLabs - ], - tags = tags, + browsers = ["//tools/browsers:chromium"], + **kwargs + ) + +def protractor_web_test_suite(**kwargs): + """Default values for protractor_web_test_suite""" + + _protractor_web_test_suite( + browsers = ["//tools/browsers:chromium"], **kwargs ) diff --git a/tools/rules_nodejs_pull_1320.patch b/tools/rules_nodejs_pull_1320.patch new file mode 100644 index 00000000000000..efde72dfff968a --- /dev/null +++ b/tools/rules_nodejs_pull_1320.patch @@ -0,0 +1,274 @@ +diff --git a/internal/node/node.bzl b/internal/node/node.bzl +index ed135aec..0a90a26f 100644 +--- a/internal/node/node.bzl ++++ b/internal/node/node.bzl +@@ -139,6 +139,9 @@ def _to_execroot_path(ctx, file): + + return (" _to_execroot_path not yet implemented for " + file.path) + ++def _strip_external(path): ++ return path[len("external/"):] if path.startswith("external/") or path.startswith("external\\") else path ++ + def _nodejs_binary_impl(ctx): + node_modules = depset(ctx.files.node_modules) + +@@ -173,16 +176,8 @@ def _nodejs_binary_impl(ctx): + if hasattr(ctx.attr, "expected_exit_code"): + expected_exit_code = ctx.attr.expected_exit_code + +- node_tool_info = ctx.toolchains["@build_bazel_rules_nodejs//toolchains/node:toolchain_type"].nodeinfo +- +- # Make a copy so we don't try to mutate a frozen object +- node_tool_files = node_tool_info.tool_files[:] +- if node_tool_info.target_tool_path == "": +- # If tool_path is empty and tool_target is None then there is no local +- # node tool, we will just print a nice error message if the user +- # attempts to do bazel run +- fail("The node toolchain was not properly configured so %s cannot be executed. Make sure that target_tool_path or target_tool is set." % ctx.attr.name) +- ++ node_tool_files = ctx.files._node[:] ++ node_tool_files.extend(ctx.toolchains["@build_bazel_rules_nodejs//toolchains/node:toolchain_type"].nodeinfo.tool_files) + node_tool_files.append(ctx.file._link_modules_script) + node_tool_files.append(ctx.file._bazel_require_script) + +@@ -211,6 +206,8 @@ def _nodejs_binary_impl(ctx): + # also be sure to include the params file in the program inputs + node_tool_files.append(ctx.outputs.templated_args_file) + ++ is_vendored_node = (ctx.attr._node.label.workspace_name != "nodejs_darwin_amd64" and ctx.attr._node.label.workspace_name != "nodenodejs_linux_amd64js_darwin_amd64" and ctx.attr._node.label.workspace_name != "nodejs_windows_amd64") ++ + substitutions = { + "TEMPLATED_args": " ".join([ + expand_location_into_runfiles(ctx, a) +@@ -221,9 +218,9 @@ def _nodejs_binary_impl(ctx): + "TEMPLATED_expected_exit_code": str(expected_exit_code), + "TEMPLATED_link_modules_script": _to_manifest_path(ctx, ctx.file._link_modules_script), + "TEMPLATED_loader_path": script_path, +- "TEMPLATED_node": node_tool_info.target_tool_path, + "TEMPLATED_repository_args": _to_manifest_path(ctx, ctx.file._repository_args), + "TEMPLATED_script_path": _to_execroot_path(ctx, ctx.file.entry_point), ++ "TEMPLATED_vendored_node": _strip_external(ctx.file._node.path) if is_vendored_node else "", + } + ctx.actions.expand_template( + template = ctx.file._launcher_template, +@@ -466,6 +463,10 @@ jasmine_node_test( + default = Label("//internal/node:node_loader.js"), + allow_single_file = True, + ), ++ "_node": attr.label( ++ default = Label("@nodejs//:node_bin"), ++ allow_single_file = True, ++ ), + "_repository_args": attr.label( + default = Label("@nodejs//:bin/node_repo_args.sh"), + allow_single_file = True, +diff --git a/internal/node/node_launcher.sh b/internal/node/node_launcher.sh +index 6e4b4ca5..3f7c06e9 100644 +--- a/internal/node/node_launcher.sh ++++ b/internal/node/node_launcher.sh +@@ -114,7 +114,32 @@ TEMPLATED_env_vars + # This redirects to stderr so it doesn't interfere with Bazel's worker protocol + # find . -name thingImLookingFor 1>&2 + +-readonly node=$(rlocation "TEMPLATED_node") ++readonly vendored_node="TEMPLATED_vendored_node" ++ ++if [ -n "$vendored_node" ]; then ++ # Use the vendored node path ++ readonly node=$(rlocation "$vendored_node") ++else ++ # Check environment for which node path to use ++ unameOut="$(uname -s)" ++ case "${unameOut}" in ++ Linux*) machine=linux;; ++ Darwin*) machine=darwin;; ++ CYGWIN*) machine=windows;; ++ MINGW*) machine=windows;; ++ MSYS_NT*) machine=windows;; ++ *) machine=linux;; ++ esac ++ ++ case "${machine}" in ++ # The following paths must match up with _download_node in node_repositories ++ linux) readonly node=$(rlocation "nodejs_linux_amd64/bin/nodejs/bin/node");; ++ darwin) readonly node=$(rlocation "nodejs_darwin_amd64/bin/nodejs/bin/node");; ++ windows) readonly node=$(rlocation "nodejs_windows_amd64/bin/nodejs/node.exe");; ++ *) readonly node=$(rlocation "nodejs_linux_amd64/bin/nodejs/bin/node");; ++ esac ++fi ++ + readonly repository_args=$(rlocation "TEMPLATED_repository_args") + MAIN=$(rlocation "TEMPLATED_loader_path") + readonly link_modules_script=$(rlocation "TEMPLATED_link_modules_script") +diff --git a/internal/node/node_repositories.bzl b/internal/node/node_repositories.bzl +index 63a5074a..390c7c13 100644 +--- a/internal/node/node_repositories.bzl ++++ b/internal/node/node_repositories.bzl +@@ -243,8 +243,8 @@ and expect the file to have sha256sum `09bea8f4ec41e9079fa03093d3b2db7ac5c533185 + ), + } + +-NODE_DIR = "bin/nodejs" +-YARN_DIR = "bin/yarnpkg" ++NODE_EXTRACT_DIR = "bin/nodejs" ++YARN_EXTRACT_DIR = "bin/yarnpkg" + + GET_SCRIPT_DIR = """ + # From stackoverflow.com +@@ -268,24 +268,27 @@ def _download_node(repository_ctx): + """ + if repository_ctx.attr.vendored_node: + return +- if repository_ctx.name == "nodejs": +- host = os_name(repository_ctx) +- else: +- host = repository_ctx.name.split("nodejs_", 1)[1] ++ ++ # The host is baked into the repository name by design. ++ # Current these workspaces are: ++ # @nodejs_darwin_amd64 ++ # @nodejs_linux_amd64 ++ # @nodejs_windows_amd64 ++ host_os = repository_ctx.name.split("nodejs_", 1)[1] ++ + node_version = repository_ctx.attr.node_version + node_repositories = repository_ctx.attr.node_repositories + node_urls = repository_ctx.attr.node_urls + + # Download node & npm +- node_host_version = "{}-{}".format(node_version, host) +- if node_host_version in node_repositories: +- filename, strip_prefix, sha256 = node_repositories[node_host_version] +- else: +- fail("Unknown NodeJS host/version {}".format(node_host_version)) ++ version_host_os = "%s-%s" % (node_version, host_os) ++ if not version_host_os in node_repositories: ++ fail("Unknown NodeJS version-host %s" % version_host_os) ++ filename, strip_prefix, sha256 = node_repositories[version_host_os] + + repository_ctx.download_and_extract( + url = [url.format(version = node_version, filename = filename) for url in node_urls], +- output = NODE_DIR, ++ output = NODE_EXTRACT_DIR, + stripPrefix = strip_prefix, + sha256 = sha256, + ) +@@ -306,11 +309,11 @@ def _download_yarn(repository_ctx): + if yarn_version in yarn_repositories: + filename, strip_prefix, sha256 = yarn_repositories[yarn_version] + else: +- fail("Unknown Yarn version {}".format(yarn_version)) ++ fail("Unknown Yarn version %s" % yarn_version) + + repository_ctx.download_and_extract( + url = [url.format(version = yarn_version, filename = filename) for url in yarn_urls], +- output = YARN_DIR, ++ output = YARN_EXTRACT_DIR, + stripPrefix = strip_prefix, + sha256 = sha256, + ) +@@ -353,8 +356,8 @@ def _prepare_node(repository_ctx): + "lib/node_modules/npm/bin/npm-cli.js" if not is_windows else "node_modules/npm/bin/npm-cli.js", + ] if f]) + else: +- node_exec = "{}/bin/node".format(NODE_DIR) if not is_windows else "{}/node.exe".format(NODE_DIR) +- npm_script = "{}/lib/node_modules/npm/bin/npm-cli.js".format(NODE_DIR) if not is_windows else "{}/node_modules/npm/bin/npm-cli.js".format(NODE_DIR) ++ node_exec = ("%s/bin/node" % NODE_EXTRACT_DIR) if not is_windows else ("%s/node.exe" % NODE_EXTRACT_DIR) ++ npm_script = ("%s/lib/node_modules/npm/bin/npm-cli.js" % NODE_EXTRACT_DIR) if not is_windows else ("%s/node_modules/npm/bin/npm-cli.js" % NODE_EXTRACT_DIR) + node_exec_label = node_exec + if repository_ctx.attr.vendored_yarn: + yarn_script = "/".join([f for f in [ +@@ -365,7 +368,7 @@ def _prepare_node(repository_ctx): + "bin/yarn.js", + ] if f]) + else: +- yarn_script = "{}/bin/yarn.js".format(YARN_DIR) ++ yarn_script = "%s/bin/yarn.js" % YARN_EXTRACT_DIR + node_entry = "bin/node" if not is_windows else "bin/node.cmd" + npm_node_repositories_entry = "bin/npm_node_repositories" if not is_windows else "bin/npm_node_repositories.cmd" + yarn_node_repositories_entry = "bin/yarn_node_repositories" if not is_windows else "bin/yarn_node_repositories.cmd" +@@ -420,8 +423,8 @@ CALL "%SCRIPT_DIR%\\{node}" {args} %* + # Immediately exit if any command fails. + set -e + # Generated by node_repositories.bzl +-export NODE_REPOSITORY_ARGS={} +-""".format(node_repo_args), executable = True) ++export NODE_REPOSITORY_ARGS={args} ++""".format(args = node_repo_args), executable = True) + + # The entry points for npm for osx/linux and windows + # Runs npm using appropriate node entry point +@@ -609,18 +612,29 @@ node_repositories_rule = repository_rule( + ) + + def _nodejs_host_os_alias_impl(repository_ctx): +- host_os = os_name(repository_ctx) +- node_repository = "@nodejs_%s" % host_os + is_windows_host = is_windows_os(repository_ctx) + file_ending = ".cmd" if is_windows_host else "" +- actual_node_bin = "bin/nodejs/node.exe" if is_windows_host else "bin/nodejs/bin/node" ++ node_repository = "@nodejs_%s" % os_name(repository_ctx) ++ if repository_ctx.attr.vendored_node: ++ node_bin_repository = "@%s" % repository_ctx.attr.vendored_node.workspace_name ++ actual_node_bin = "/".join([f for f in [ ++ repository_ctx.attr.vendored_node.package, ++ repository_ctx.attr.vendored_node.name, ++ "bin/node" if not is_windows_host else "node.exe", ++ ] if f]) ++ else: ++ node_bin_repository = node_repository ++ actual_node_bin = "%s/%s" % ( ++ NODE_EXTRACT_DIR, ++ "node.exe" if is_windows_host else "bin/node", ++ ) + repository_ctx.template( + "BUILD.bazel", + Label("@build_bazel_rules_nodejs//internal/node:BUILD.nodejs_host_os_alias.tpl"), + substitutions = { + "TEMPLATE__npm_node_repositories": "%s//:bin/npm_node_repositories%s" % (node_repository, file_ending), + "TEMPLATE__yarn_node_repositories": "%s//:bin/yarn_node_repositories%s" % (node_repository, file_ending), +- "TEMPLATE_actual_node_bin": "%s//:%s" % (node_repository, actual_node_bin), ++ "TEMPLATE_actual_node_bin": "%s//:%s" % (node_bin_repository, actual_node_bin), + "TEMPLATE_node_repo_args": "%s//:bin/node_repo_args.sh" % node_repository, + "TEMPLATE_npm": "%s//:bin/npm%s" % (node_repository, file_ending), + "TEMPLATE_run_npm": "%s//:run_npm.sh.template" % node_repository, +@@ -632,9 +646,12 @@ def _nodejs_host_os_alias_impl(repository_ctx): + + _nodejs_repo_host_os_alias = repository_rule( + _nodejs_host_os_alias_impl, ++ attrs = { ++ "vendored_node": attr.label(allow_single_file = True), ++ }, + ) + +-def node_repositories(package_json = [], **kwargs): ++def node_repositories(**kwargs): + """ + Wrapper macro around node_repositories_rule to call it for each platform, register bazel toolchains, + and make other convenience repositories. +@@ -652,6 +669,8 @@ def node_repositories(package_json = [], **kwargs): + minimum_bazel_version = "0.21.0", + ) + ++ vendored_node = kwargs.pop("vendored_node", None) ++ + # This needs to be setup so toolchains can access nodejs for all different versions + for os_arch_name in OS_ARCH_NAMES: + os_name = "_".join(os_arch_name) +@@ -659,7 +678,7 @@ def node_repositories(package_json = [], **kwargs): + _maybe( + node_repositories_rule, + name = node_repository_name, +- package_json = package_json, ++ vendored_node = vendored_node, + **kwargs + ) + native.register_toolchains("@build_bazel_rules_nodejs//toolchains/node:node_%s_toolchain" % os_arch_name[0]) +@@ -673,6 +692,7 @@ def node_repositories(package_json = [], **kwargs): + _maybe( + _nodejs_repo_host_os_alias, + name = "nodejs", ++ vendored_node = vendored_node, + ) + + _maybe( diff --git a/yarn.lock b/yarn.lock index 07fc96b9d999e0..1693dc16b773fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,10 @@ # yarn lockfile v1 + + + + "@angular-devkit/architect@0.900.0-rc.0", "@angular-devkit/architect@^0.900.0-rc.0": version "0.900.0-rc.0" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.900.0-rc.0.tgz#e37b21dcbc631ddc615860571685194522478fef" @@ -895,7 +899,7 @@ resolved "https://registry.yarnpkg.com/@webcomponents/custom-elements/-/custom-elements-1.1.2.tgz#041e4c20df35245f4d160b50d044b8cff192962c" integrity sha512-gVhuQHLTrQ28v1qMp0WGPSCBukFL7qAlemxCf19TnuNZ0bO9KPF72bfhH6Hpuwdu9TptIMGNlqrr9PzqrzfZFQ== -"@yarnpkg/lockfile@1.1.0": +"@yarnpkg/lockfile@1.1.0", "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== @@ -2250,6 +2254,11 @@ ci-info@^1.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" integrity sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + circular-json@^0.5.5: version "0.5.9" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" @@ -4321,6 +4330,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-yarn-workspace-root@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== + dependencies: + fs-extra "^4.0.3" + micromatch "^3.1.4" + findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" @@ -4626,6 +4643,15 @@ fs-extra@^0.23.1: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^7.0.1, fs-extra@~7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -5968,6 +5994,13 @@ is-ci@^1.0.10: dependencies: ci-info "^1.0.0" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6917,6 +6950,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -8812,6 +8852,25 @@ passerror@1.1.1, passerror@^1.1.1: resolved "https://registry.yarnpkg.com/passerror/-/passerror-1.1.1.tgz#a25b88dbdd910a29603aec7dcb96e9a7a97687b4" integrity sha1-oluI292RCilgOux9y5bpp6l2h7Q= +patch-package@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.0.tgz#677de858e352b6ca4e6cb48a6efde2cec9fde566" + integrity sha512-HWlQflaBBMjLBfOWomfolF8aqsFDeNbSNro1JDUgYqnVvPM5OILJ9DQdwIRiKmGaOsmHvhkl1FYkvv1I9r2ZJw== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^1.2.1" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + update-notifier "^2.5.0" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" @@ -10357,6 +10416,11 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + "slice-stream@>= 1.0.0 < 2": version "1.0.0" resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0"