https://github.com/angular/angular
Raw File
Tip revision: c0a8c8fb4b2410f76c0a4b625b35e52cb2189248 authored by Jessica Janiuk on 24 May 2023, 17:31:37 UTC
release: cut the v16.0.3 release
Tip revision: c0a8c8f
index.bzl
# Copyright Google LLC All Rights Reserved.
#
# Use of this source code is governed by an MIT-style license that can be
# found in the LICENSE file at https://angular.io/license
"""Angular integration testing
"""

load("//integration:npm_package_archives.bzl", "NPM_PACKAGE_ARCHIVES", "npm_package_archive_label")
load("@npm//@angular/build-tooling/bazel/integration:index.bzl", "integration_test")
load("//:packages.bzl", "INTEGRATION_PACKAGES")

def _ng_integration_test(name, setup_chromium = False, **kwargs):
    "Set defaults for the npm_integration_test common to the angular repo"
    pinned_npm_packages = kwargs.pop("pinned_npm_packages", [])
    use_view_engine_packages = kwargs.pop("use_view_engine_packages", [])
    toolchains = kwargs.pop("toolchains", [])
    environment = kwargs.pop("environment", {})
    track_payload_size = kwargs.pop("track_payload_size", None)
    track_payload_paths = kwargs.pop("track_payload_paths", [""])
    data = kwargs.pop("data", [])

    if setup_chromium:
        data.append("@npm//@angular/build-tooling/bazel/browsers/chromium")
        toolchains.append("@npm//@angular/build-tooling/bazel/browsers/chromium:toolchain_alias")
        environment.update({
            "CHROMEDRIVER_BIN": "$(CHROMEDRIVER)",
            "CHROME_BIN": "$(CHROMIUM)",
        })

    # By default run `yarn install` followed by `yarn test` using the tools linked
    # into the integration tests (using the `tool_mappings` attribute).
    commands = kwargs.pop("commands", [
        "yarn install --cache-folder ./.yarn_local_cache",
        "yarn test",
    ])

    if track_payload_size:
        commands += [
            "yarn build",
        ]
        for path in track_payload_paths:
            commands += [
                # TODO: Replace the track payload-size script with a RBE and Windows-compatible script.
                "$(rootpath //:scripts/ci/bazel-payload-size.sh) {bundle}{path} 'dist{path}/*.js' true ${runfiles}/angular/$(rootpath //goldens:size-tracking/integration-payloads.json)".format(bundle = track_payload_size, path = path, runfiles = "${RUNFILES}"),
            ]

        data += [
            "//goldens:size-tracking/integration-payloads.json",
            "//:scripts/ci/bazel-payload-size.sh",
            "//:scripts/ci/payload-size.sh",
            "//:scripts/ci/payload-size.js",
        ]

    # Complete list of npm packages to override in the test's package.json file mapped to
    # tgz archive to use for the replacement. This is the full list for all integration
    # tests. Any given integration does not need to use all of these packages.
    npm_packages = {}
    for pkg in NPM_PACKAGE_ARCHIVES:
        if pkg not in pinned_npm_packages:
            npm_packages["@npm//:" + npm_package_archive_label(pkg)] = pkg
    for pkg in INTEGRATION_PACKAGES:
        # If the generated Angular framework package is listed in the `use_view_engine_packages`
        # list, we will not use the local-built NPM package, but instead map to the
        # corresponding View Engine v12.x package from the `@npm//` workspace.
        if pkg in use_view_engine_packages:
            npm_packages["@npm//:" + npm_package_archive_label("%s-12" % pkg)] = pkg
        else:
            last_segment_name = pkg.split("/")[-1]
            npm_packages["//packages/%s:npm_package_archive" % last_segment_name] = pkg

    integration_test(
        name = name,
        commands = commands,
        npm_packages = npm_packages,
        tags = kwargs.pop("tags", []) + [
            # `integration` tag is used for filtering out these tests from the normal
            # developer workflow
            "integration",
            # Integration tests do not work inside of a sandbox as they may run host applications such
            # as chrome (which is run by ng) that require access to files outside of the sandbox.
            "no-sandbox",
            # Remote doesn't work as it needs network access right now
            "no-remote-exec",
        ],
        data = data,
        environment = environment,
        toolchains = toolchains,
        tool_mappings = {
            "//:yarn_vendored": "yarn",
            "@nodejs_toolchains//:resolved_toolchain": "node",
        },
        # 15-minute timeout
        timeout = "long",
        # Tells bazel that this test should be allocated a large amount of memory.
        # See https://docs.bazel.build/versions/2.0.0/be/common-definitions.html#common-attributes-tests.
        size = "enormous",
        **kwargs
    )

def ng_integration_test(name, **kwargs):
    "Sets up the integration test target based on the test folder name"

    native.filegroup(
        name = "_%s_sources" % name,
        srcs = native.glob(
            include = ["**/*"],
            exclude = [
                "node_modules/**",
                ".yarn_local_cache/**",
            ],
        ),
    )
    _ng_integration_test(
        name = name,
        srcs = kwargs.pop("srcs", ["_%s_sources" % name]),
        **kwargs
    )
back to top