Pytest: fix the build-as-test mode on Windows

This mode (enabled with `--codeql=build-as-test` or setting
`PYTEST_CODEQL=build-as-test` in the environment) is an experimental
mode that makes the pytest dist installation run as a test. This
allows to avoid running the installation in case nothing changed in the
dist, leveraging bazel's test caching mechanism, and accelrating the
dev loop when working on integration test code. This mode might become
the default for devs in the future.

Up until now, this mode was only working on POSIX systems. This commit
fixes it on Windows. The issue was `native_test` being unable to wrap
a `py_binary` target because of an `.exe` suffix mismatch. Turning the
`native_test` into a full-fledged `py_test` solves the issue.
This commit is contained in:
Paolo Tranquilli
2025-10-14 14:52:22 +02:00
parent c2309a9aca
commit b6aee67b42

View File

@@ -3,12 +3,11 @@ Wrappers and helpers around `rules_pkg` to build codeql packs.
"""
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@bazel_skylib//rules:native_binary.bzl", "native_test")
load("@rules_pkg//pkg:install.bzl", "pkg_install")
load("@rules_pkg//pkg:mappings.bzl", "pkg_attributes", "pkg_filegroup", "pkg_files", _strip_prefix = "strip_prefix")
load("@rules_pkg//pkg:pkg.bzl", "pkg_zip")
load("@rules_pkg//pkg:providers.bzl", "PackageFilegroupInfo", "PackageFilesInfo")
load("@rules_python//python:defs.bzl", "py_binary")
load("@rules_python//python:defs.bzl", "py_binary", "py_test")
load("//misc/bazel:os.bzl", "OS_DETECTION_ATTRS", "os_select")
def _make_internal(name):
@@ -366,28 +365,29 @@ def _codeql_pack_install(name, srcs, install_dest = None, build_file_label = Non
] if build_file_label else []) + (
["--destdir", "\"%s\"" % install_dest] if install_dest else []
)
py_binary(
name = name,
installer_args = dict(
srcs = [Label("//misc/bazel/internal:install.py")],
main = Label("//misc/bazel/internal:install.py"),
deps = ["@rules_python//python/runfiles"],
data = data,
args = args,
)
py_binary(
name = name,
**installer_args
)
# this hack is meant to be an optimization when using install for tests, where
# the install step is skipped if nothing changed. If the installation directory
# is somehow messed up, `bazel run` can be used to force install
native_test(
py_test(
name = internal("as", "test"),
src = name,
tags = [
"manual", # avoid having this picked up by `...`, `:all` or `:*`
"local", # make sure installation does not run sandboxed
],
data = data,
args = args,
size = "small",
**installer_args
)
def codeql_pack_group(name, srcs, visibility = None, skip_installer = False, prefix = "", install_dest = None, build_file_label = None, compression_level = 6):