# 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()
