| # Copyright 2022 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. | |
| import os | |
| import subprocess | |
| import unittest | |
| import pathlib | |
| class TestPythonVersion(unittest.TestCase): | |
| @classmethod | |
| def setUpClass(cls): | |
| os.chdir("%test_location%") | |
| test_srcdir = os.environ["TEST_SRCDIR"] | |
| # When bzlmod is enabled, the name of the directory in runfiles changes | |
| # to _main instead of rules_python | |
| if os.path.exists(os.path.join(test_srcdir, "_main")): | |
| rules_python_path = os.path.join(test_srcdir, "_main") | |
| else: | |
| rules_python_path = os.path.join(test_srcdir, "rules_python") | |
| test_tmpdir = os.environ["TEST_TMPDIR"] | |
| if %is_windows%: | |
| home = os.path.join(test_tmpdir, "HOME") | |
| os.mkdir(home) | |
| os.environ["HOME"] = home | |
| local_app_data = os.path.join(test_tmpdir, "LocalAppData") | |
| os.mkdir(local_app_data) | |
| os.environ["LocalAppData"] = local_app_data | |
| # Bazelisk requires a cache directory be set | |
| os.environ["XDG_CACHE_HOME"] = os.path.join(test_tmpdir, "xdg-cache-home") | |
| # Unset this so this works when called by Bazel's latest Bazel build | |
| # pipeline. It sets the following combination, which interfere with each other: | |
| # * --sandbox_tmpfs_path=/tmp | |
| # * --test_env=USE_BAZEL_VERSION | |
| # * USE_BAZEL_VERSION=/tmp/<something> | |
| os.environ.pop("USE_BAZEL_VERSION", None) | |
| bazelrc_lines = [ | |
| "build --test_output=errors", | |
| ] | |
| if %is_bzlmod%: | |
| bazelrc_lines.extend( | |
| [ | |
| 'build --override_module rules_python="{}"'.format( | |
| rules_python_path.replace("\\", "/") | |
| ), | |
| "common --enable_bzlmod", | |
| ] | |
| ) | |
| else: | |
| bazelrc_lines.extend( | |
| [ | |
| 'build --override_repository rules_python="{}"'.format( | |
| rules_python_path.replace("\\", "/") | |
| ), | |
| "common --noexperimental_enable_bzlmod", | |
| ] | |
| ) | |
| bazelrc = pathlib.Path(".bazelrc") | |
| bazelrc.write_text(os.linesep.join(bazelrc_lines)) | |
| def test_match_toolchain(self): | |
| output = subprocess.check_output( | |
| f"bazel run --announce_rc @python//:python3 -- --version", | |
| shell = True, # Shell needed to look up via PATH | |
| text=True, | |
| ).strip() | |
| self.assertEqual(output, "Python %python_version%") | |
| subprocess.run("bazel test --announce_rc //...", shell=True, check=True) | |
| if __name__ == "__main__": | |
| unittest.main() |