blob: b1b2e062f90a676ce13db0d20ea7ea120e0fa60f [file] [log] [blame]
# Copyright 2024 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.
"""Tests for construction of Python version matching config settings."""
load("@//python:versions.bzl", "MINOR_MAPPING")
load("@rules_testing//lib:analysis_test.bzl", "analysis_test")
load("@rules_testing//lib:test_suite.bzl", "test_suite")
load("@rules_testing//lib:truth.bzl", "subjects")
load("@rules_testing//lib:util.bzl", rt_util = "util")
load("//python/config_settings:config_settings.bzl", "is_python_config_setting")
_tests = []
def _subject_impl(ctx):
_ = ctx # @unused
return [DefaultInfo()]
_subject = rule(
implementation = _subject_impl,
attrs = {
"match_cpu": attr.string(),
"match_micro": attr.string(),
"match_minor": attr.string(),
"match_os": attr.string(),
"match_os_cpu": attr.string(),
"no_match": attr.string(),
"no_match_micro": attr.string(),
},
)
def _test_minor_version_matching(name):
minor_matches = {
# Having it here ensures that we can mix and match config settings defined in
# the repo and elsewhere
str(Label("//python/config_settings:is_python_3.11")): "matched-3.11",
"//conditions:default": "matched-default",
}
minor_cpu_matches = {
str(Label(":is_python_3.11_aarch64")): "matched-3.11-aarch64",
str(Label(":is_python_3.11_ppc")): "matched-3.11-ppc",
str(Label(":is_python_3.11_s390x")): "matched-3.11-s390x",
str(Label(":is_python_3.11_x86_64")): "matched-3.11-x86_64",
}
minor_os_matches = {
str(Label(":is_python_3.11_linux")): "matched-3.11-linux",
str(Label(":is_python_3.11_osx")): "matched-3.11-osx",
str(Label(":is_python_3.11_windows")): "matched-3.11-windows",
}
minor_os_cpu_matches = {
str(Label(":is_python_3.11_linux_aarch64")): "matched-3.11-linux-aarch64",
str(Label(":is_python_3.11_linux_ppc")): "matched-3.11-linux-ppc",
str(Label(":is_python_3.11_linux_s390x")): "matched-3.11-linux-s390x",
str(Label(":is_python_3.11_linux_x86_64")): "matched-3.11-linux-x86_64",
str(Label(":is_python_3.11_osx_aarch64")): "matched-3.11-osx-aarch64",
str(Label(":is_python_3.11_osx_x86_64")): "matched-3.11-osx-x86_64",
str(Label(":is_python_3.11_windows_x86_64")): "matched-3.11-windows-x86_64",
}
rt_util.helper_target(
_subject,
name = name + "_subject",
match_minor = select(minor_matches),
match_cpu = select(minor_matches | minor_cpu_matches),
match_os = select(minor_matches | minor_os_matches),
match_os_cpu = select(minor_matches | minor_cpu_matches | minor_os_matches | minor_os_cpu_matches),
no_match = select({
"//python/config_settings:is_python_3.12": "matched-3.12",
"//conditions:default": "matched-default",
}),
)
analysis_test(
name = name,
target = name + "_subject",
impl = _test_minor_version_matching_impl,
config_settings = {
str(Label("//python/config_settings:python_version")): "3.11.1",
"//command_line_option:platforms": str(Label("//tests/config_settings:linux_aarch64")),
},
)
def _test_minor_version_matching_impl(env, target):
target = env.expect.that_target(target)
target.attr("match_cpu", factory = subjects.str).equals(
"matched-3.11-aarch64",
)
target.attr("match_minor", factory = subjects.str).equals(
"matched-3.11",
)
target.attr("match_os", factory = subjects.str).equals(
"matched-3.11-linux",
)
target.attr("match_os_cpu", factory = subjects.str).equals(
"matched-3.11-linux-aarch64",
)
target.attr("no_match", factory = subjects.str).equals(
"matched-default",
)
_tests.append(_test_minor_version_matching)
def _test_latest_micro_version_matching(name):
rt_util.helper_target(
_subject,
name = name + "_subject",
match_minor = select({
"//python/config_settings:is_python_3.12": "matched-3.12",
"//conditions:default": "matched-default",
}),
match_micro = select({
"//python/config_settings:is_python_" + MINOR_MAPPING["3.12"]: "matched-3.12",
"//conditions:default": "matched-default",
}),
no_match_micro = select({
"//python/config_settings:is_python_3.12.0": "matched-3.12",
"//conditions:default": "matched-default",
}),
no_match = select({
"//python/config_settings:is_python_" + MINOR_MAPPING["3.11"]: "matched-3.11",
"//conditions:default": "matched-default",
}),
)
analysis_test(
name = name,
target = name + "_subject",
impl = _test_latest_micro_version_matching_impl,
config_settings = {
str(Label("//python/config_settings:python_version")): "3.12",
},
)
def _test_latest_micro_version_matching_impl(env, target):
target = env.expect.that_target(target)
target.attr("match_minor", factory = subjects.str).equals(
"matched-3.12",
)
target.attr("match_micro", factory = subjects.str).equals(
"matched-3.12",
)
target.attr("no_match_micro", factory = subjects.str).equals(
"matched-default",
)
target.attr("no_match", factory = subjects.str).equals(
"matched-default",
)
_tests.append(_test_latest_micro_version_matching)
def construct_config_settings_test_suite(name): # buildifier: disable=function-docstring
# We have CI runners running on a great deal of the platforms from the list below,
# hence use all of them within tests.
for os in ["linux", "osx", "windows"]:
is_python_config_setting(
name = "is_python_3.11_" + os,
constraint_values = [
"@platforms//os:" + os,
],
python_version = "3.11",
)
for cpu in ["s390x", "ppc", "x86_64", "aarch64"]:
is_python_config_setting(
name = "is_python_3.11_" + cpu,
constraint_values = [
"@platforms//cpu:" + cpu,
],
python_version = "3.11",
)
for (os, cpu) in [
("linux", "aarch64"),
("linux", "ppc"),
("linux", "s390x"),
("linux", "x86_64"),
("osx", "aarch64"),
("osx", "x86_64"),
("windows", "x86_64"),
]:
is_python_config_setting(
name = "is_python_3.11_{}_{}".format(os, cpu),
constraint_values = [
"@platforms//cpu:" + cpu,
"@platforms//os:" + os,
],
python_version = "3.11",
)
test_suite(
name = name,
tests = _tests,
)
native.platform(
name = "linux_aarch64",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:aarch64",
],
)