From 47935dd5cdd6ad4353b0463eb6df54b81a7fc1d6 Mon Sep 17 00:00:00 2001 From: Jason Choi Date: Fri, 19 Aug 2016 23:52:51 -0700 Subject: [PATCH] bazel: karma (watch is broken) --- BUILD | 59 +++++++++++++++++ build_defs/BUILD | 1 + build_defs/karma.bzl | 75 ++++++++++++++++++++++ build_defs/karma_launcher_template.sh | 21 ++++++ karma-js.conf.js | 18 +++--- modules/@angular/router/karma-test-shim.js | 7 +- modules/@angular/router/karma.conf.js | 42 ++++++------ test-main.js | 22 +++---- tools/karma/reporter.js | 2 +- 9 files changed, 195 insertions(+), 52 deletions(-) create mode 100644 build_defs/karma.bzl create mode 100644 build_defs/karma_launcher_template.sh diff --git a/BUILD b/BUILD index fe62b84a90..4c0c16ac07 100644 --- a/BUILD +++ b/BUILD @@ -3,6 +3,7 @@ package(default_visibility=["//visibility:public"]) load("//build_defs:nodejs.bzl", "nodejs_binary", "nodejs_test") load("//build_defs:typescript.bzl", "ts_library", "ts_ext_library") load("//build_defs:jasmine.bzl", "jasmine_node_test") +load("//build_defs:karma.bzl", "karma_test") # This imports node_modules targets from a generated file. load("//build_defs:node_modules_index.bzl", "node_modules_index") node_modules_index(glob) @@ -607,3 +608,61 @@ test_suite( name = "jasmine_tests", tests = [":{}_test".format(p) for p in JASMINE_TESTABLE], ) + +ts_library( + name = "empty_module", + srcs = ["modules/empty.ts"], + tsconfig = "modules/tsconfig.json", +) + +KARMA_DATA = [ + ":es6-shim", + ":karma-browserstack-launcher", + ":karma-chrome-launcher", + ":karma-jasmine", + ":karma-sauce-launcher", + ":karma-sourcemap-loader", + ":reflect-metadata", + ":source-map", + ":systemjs", +] + +karma_test( + name = "karma_test", + srcs = [ + ":core_test_module", + ":common_test_module", + ":compiler_test_module", + ":compiler_test_codegen_js", + ":forms_test_module", + ":http_test_module", + ":platform-browser_test_module", + ":platform-browser-dynamic_test_module", + ":platform-server_test_module", + ":upgrade_test_module", + ":empty_module", + "shims_for_IE.js", + "test-main.js", + ], + data = KARMA_DATA + [ + ":angular", + "browser-providers.conf.js", + "tools/karma/reporter.js", + ], + config = "karma-js.conf.js", + local = True, +) + +karma_test( + name = "router_karma_test", + srcs = [ + ":router_test_module", + "modules/@angular/router/karma-test-shim.js", + ], + data = KARMA_DATA + [ + "browser-providers.conf.js", + ], + config = "modules/@angular/router/karma.conf.js", + size = "small", + local = True, +) diff --git a/build_defs/BUILD b/build_defs/BUILD index 2298318c14..fc356de56f 100644 --- a/build_defs/BUILD +++ b/build_defs/BUILD @@ -1,4 +1,5 @@ exports_files([ "nodejs_launcher_template.sh", "jasmine_launcher_template.sh", + "karma_launcher_template.sh", ]) diff --git a/build_defs/karma.bzl b/build_defs/karma.bzl new file mode 100644 index 0000000000..55df72e591 --- /dev/null +++ b/build_defs/karma.bzl @@ -0,0 +1,75 @@ +_KARMA_TEST_ATTRS = { + "srcs": attr.label_list(allow_files=True), + "deps": attr.label_list(), + "data": attr.label_list(allow_files=True, cfg=DATA_CFG), + "config": attr.label(allow_files=True, single_file=True, mandatory=True), + + "_karma": attr.label(default=Label("//:karma_bin"), executable=True), + "_launcher_template": attr.label( + default = Label("//build_defs:karma_launcher_template.sh"), + allow_files = True, + single_file = True, + ), +} + +def _karma_test_impl(ctx, karma_args="--single-run"): + """ + Rule for running Karma tests. + + Args: + srcs: The targets containing the spec files. + deps: JavaScript targets which the tests depend on. + data: Data files which the tests depend on. + config: Required. Karma config file to use. + + Due to the complexity of Karma config files, this rule does not do the heavy + lifting of creating that config file. Instead, the user has to point to the + right files. Files specified in Karma must be a subset of files depended upon + in the karma_test definition. + + This rule additionally creates a _local target, which runs Karma in + watch mode. This can be combined with ibazel for incremental development. + """ + ctx.template_action( + template = ctx.file._launcher_template, + output = ctx.outputs.executable, + substitutions = { + "{{karma}}": ctx.executable._karma.short_path, + "{{config}}": ctx.file.config.short_path, + "{{args}}": karma_args, + }, + executable = True, + ) + + return struct( + files = set([ctx.outputs.executable]), + runfiles = ctx.runfiles( + files = ctx.files.srcs + ctx.files._karma + ctx.files.config, + transitive_files = set(ctx.attr._karma.default_runfiles.files), + collect_data = True, + collect_default = True, + ), + ) + +_karma_test = rule( + implementation = _karma_test_impl, + executable = True, + test = True, + attrs = _KARMA_TEST_ATTRS, +) + +def _karma_test_local_impl(ctx): + return _karma_test_impl(ctx, karma_args = "") + +_karma_test_local = rule( + implementation = _karma_test_local_impl, + executable = True, + attrs = _KARMA_TEST_ATTRS, +) + +def karma_test(*, name, timeout=None, size=None, flaky=None, shard_count=None, local=None, + tags=None, **kwargs): + tags = tags or [] + _karma_test(name=name, timeout=timeout, size=size, flaky=flaky, shard_count=shard_count, + local=local, tags=tags, **kwargs) + _karma_test_local(name=name + "_local", tags=tags + ["ibazel_notify_changes"], **kwargs) diff --git a/build_defs/karma_launcher_template.sh b/build_defs/karma_launcher_template.sh new file mode 100644 index 0000000000..53cfa2805d --- /dev/null +++ b/build_defs/karma_launcher_template.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -e + +if [[ -z "${RUNFILES}" ]]; then + case "${0}" in + /*) self="${0}" ;; + *) self="${PWD}/${0}" ;; + esac + + if [[ -n "${TEST_SRCDIR}" ]]; then + export RUNFILES="${TEST_SRCDIR}/angular" + elif [[ -d "${self}.runfiles" ]]; then + export RUNFILES="${self}.runfiles/angular" + else + echo "Runfiles directory not found." >&2 + exit 1 + fi +fi + +cd "${RUNFILES}" && "${RUNFILES}/{{karma}}" start "${RUNFILES}/{{config}}" {{args}} "$@" diff --git a/karma-js.conf.js b/karma-js.conf.js index 83e4e57ce3..c8e8fdc88b 100644 --- a/karma-js.conf.js +++ b/karma-js.conf.js @@ -11,7 +11,8 @@ module.exports = function(config) { files: [ // Sources and specs. // Loaded through the System loader, in `test-main.js`. - {pattern: 'dist/all/@angular/**/*.js', included: false, watched: true}, + {pattern: 'modules/@angular/**/*.js', included: false, watched: true}, + {pattern: 'modules/@angular/**/*.js.map', included: false, watched: true}, 'node_modules/core-js/client/core.js', // include Angular v1 for upgrade module testing @@ -30,20 +31,19 @@ module.exports = function(config) { 'node_modules/systemjs/dist/system.src.js', {pattern: 'node_modules/rxjs/**', included: false, watched: false, served: true}, 'node_modules/reflect-metadata/Reflect.js', - 'tools/build/file2modulename.js', + // 'tools/build/file2modulename.js', 'test-main.js', - {pattern: 'dist/all/empty.*', included: false, watched: false}, + {pattern: 'modules/empty.*', included: false, watched: false}, {pattern: 'modules/@angular/platform-browser/test/static_assets/**', included: false, watched: false}, {pattern: 'modules/@angular/platform-browser/test/browser/static_assets/**', included: false, watched: false} ], exclude: [ - 'dist/all/@angular/**/e2e_test/**', - 'dist/all/@angular/examples/**', - 'dist/all/@angular/router/**', - 'dist/all/@angular/compiler-cli/**', - 'dist/all/angular1_router.js', - 'dist/all/@angular/platform-browser/testing/e2e_util.js' + 'modules/@angular/**/e2e_test/**', + 'modules/@angular/examples/**', + 'modules/@angular/compiler-cli/**', + 'modules/angular1_router.js', + 'modules/@angular/platform-browser/testing/e2e_util.js' ], customLaunchers: browserProvidersConf.customLaunchers, diff --git a/modules/@angular/router/karma-test-shim.js b/modules/@angular/router/karma-test-shim.js index 75a2e5ddff..d4278f793e 100644 --- a/modules/@angular/router/karma-test-shim.js +++ b/modules/@angular/router/karma-test-shim.js @@ -14,8 +14,7 @@ function isSpecFile(path) { } function isBuiltFile(path) { - var builtPath = '/base/dist/'; - return isJsFile(path) && (path.substr(0, builtPath.length) == builtPath); + return isJsFile(path); } var allSpecFiles = Object.keys(window.__karma__.files) @@ -31,7 +30,7 @@ System.config( { map: { 'rxjs': 'node_modules/rxjs', - '@angular': 'dist/all/@angular' + '@angular': 'modules/@angular' }, packages: { '@angular/core': { @@ -83,4 +82,4 @@ Promise.all([ allSpecFiles.map(function (moduleName) { return System.import(moduleName); })); -}).then(__karma__.start, __karma__.error); \ No newline at end of file +}).then(__karma__.start, __karma__.error); diff --git a/modules/@angular/router/karma.conf.js b/modules/@angular/router/karma.conf.js index 4188df437a..4bd4c0100c 100644 --- a/modules/@angular/router/karma.conf.js +++ b/modules/@angular/router/karma.conf.js @@ -12,7 +12,6 @@ module.exports = function(config) { // Polyfills. 'node_modules/core-js/client/core.js', 'node_modules/reflect-metadata/Reflect.js', - 'shims_for_IE.js', // System.js for module loading 'node_modules/systemjs/dist/system-polyfills.js', @@ -35,28 +34,28 @@ module.exports = function(config) { {pattern: 'modules/@angular/router/karma-test-shim.js', included: true, watched: true }, // Angular modules - {pattern: 'dist/all/@angular/core/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/core/src/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/core/testing/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/core/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/core/src/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/core/testing/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/common/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/common/src/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/common/testing/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/common/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/common/src/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/common/testing/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/compiler/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/compiler/src/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/compiler/testing/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/compiler/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/compiler/src/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/compiler/testing/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/platform-browser/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/platform-browser/src/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/platform-browser/testing/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/platform-browser/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/platform-browser/src/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/platform-browser/testing/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/platform-browser-dynamic/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/platform-browser-dynamic/src/**/*.js', included: false, watched: false}, - {pattern: 'dist/all/@angular/platform-browser-dynamic/testing/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/platform-browser-dynamic/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/platform-browser-dynamic/src/**/*.js', included: false, watched: false}, + {pattern: 'modules/@angular/platform-browser-dynamic/testing/**/*.js', included: false, watched: false}, // Router - {pattern: 'dist/all/@angular/router/**/*.js', included: false, watched: true} + {pattern: 'modules/@angular/router/**/*.js', included: false, watched: true} ], customLaunchers: browserProvidersConf.customLaunchers, @@ -77,12 +76,7 @@ module.exports = function(config) { port: 9876, colors: true, logLevel: config.LOG_INFO, - autoWatch: true, browsers: ['Chrome'], - singleRun: false, - captureTimeout: 60000, - browserDisconnectTimeout : 60000, - browserDisconnectTolerance : 3, - browserNoActivityTimeout : 60000 - }); + singleRun: false + }) }; diff --git a/test-main.js b/test-main.js index 3db385b8f9..16eefa3654 100644 --- a/test-main.js +++ b/test-main.js @@ -11,13 +11,11 @@ System.config({ baseURL: '/base', defaultJSExtensions: true, map: { - 'benchpress/*': 'dist/js/dev/es5/benchpress/*.js', - '@angular': 'dist/all/@angular', + // 'benchpress/*': 'modules/benchpress/*.js', + '@angular': 'modules/@angular', 'rxjs': 'node_modules/rxjs', - 'parse5/index': 'dist/all/empty.js', - '@angular/platform-server/src/parse5_adapter': 'dist/all/empty.js', - 'angular2/*': 'dist/all/angular2/*.js', - 'angular2/src/alt_router/router_testing_providers': 'dist/all/angular2/src/alt_router/router_testing_providers.js' + 'parse5/index': 'modules/empty.js', + '@angular/platform-server/src/parse5_adapter': 'modules/empty.js' }, packages: { '@angular/core': { @@ -41,7 +39,7 @@ System.config({ main: 'index.js', defaultExtension: 'js' }, - '@angular/router': { + '@angular/router-deprecated': { main: 'index.js', defaultExtension: 'js' }, @@ -65,7 +63,8 @@ System.config({ main: 'index.js', defaultExtension: 'js' } - } + }, + transpiler: null, }); @@ -84,14 +83,9 @@ System.import('@angular/core/testing') return Promise.all( Object.keys(window.__karma__.files) // All files served by Karma. .filter(onlySpecFiles) - .map(window.file2moduleName) // Normalize paths to module names. + // .map(window.file2moduleName) // Normalize paths to module names. .map(function(path) { return System.import(path).then(function(module) { - if (module.hasOwnProperty('main')) { - module.main(); - } else { - throw new Error('Module ' + path + ' does not implement main() method.'); - } }); })); }) diff --git a/tools/karma/reporter.js b/tools/karma/reporter.js index ecc0b85eb2..32ad7fa4b2 100644 --- a/tools/karma/reporter.js +++ b/tools/karma/reporter.js @@ -33,7 +33,7 @@ var createErrorFormatter = function (basePath, emitter, SourceMapConsumer) { line: line, column: column }); - return process.cwd() + "/modules/" + original.source + ":" + original.line + ":" + original.column; + return "modules/" + original.source + ":" + original.line + ":" + original.column; } catch (e) { console.warn('SourceMap position not found for trace: %s', msg); }