| # Copyright 2023 The Pigweed Authors |
| # |
| # 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 |
| # |
| # https://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 pw_ide.cpp which require fake envs""" |
| |
| import os |
| from pathlib import Path |
| import sys |
| import tempfile |
| import unittest |
| |
| import pw_cli.env |
| from pw_cli.env import pigweed_environment |
| import pw_ide.cpp |
| from pw_ide.cpp import find_cipd_installed_exe_path |
| |
| |
| class PwFindCipdInstalledExeTests(unittest.TestCase): |
| """A test case for testing `find_cipd_installed_exe_path`. |
| |
| Test case hacks environment value `PW_PIGWEED_CIPD_INSTALL_DIR` and |
| `PW_FAKE_PROJ_CIPD_INSTALL_DIR` to point to temporary directories. It checks |
| that executable file search through these CIPD defined environment variables |
| are working properly. |
| """ |
| |
| def setUp(self) -> None: |
| self.temp_dir = tempfile.TemporaryDirectory() |
| self.temp_dir_path = Path(self.temp_dir.name) |
| |
| self.envs_saves: dict[str, str | None] = { |
| "PW_FAKE_PROJ_CIPD_INSTALL_DIR": None, |
| "PW_PIGWEED_CIPD_INSTALL_DIR": None, |
| } |
| |
| for env_name in self.envs_saves: |
| self.envs_saves[env_name] = os.environ.get(env_name, None) |
| |
| self.setup_test_files_and_fake_envs() |
| |
| # Environment variables are cached in each modules as global variables. |
| # In order to override them, caches need to be reset. |
| # pylint: disable=protected-access |
| pw_cli.env._memoized_environment = None |
| # pylint: enable=protected-access |
| pw_ide.cpp.env = pigweed_environment() |
| |
| return super().setUp() |
| |
| def tearDown(self) -> None: |
| for env_var_name, env_var in self.envs_saves.items(): |
| if env_var is not None: |
| os.environ[env_var_name] = env_var |
| else: |
| os.environ.pop(env_var_name) |
| |
| self.temp_dir.cleanup() |
| |
| return super().tearDown() |
| |
| def setup_test_files_and_fake_envs(self) -> None: |
| """Create necessary temporaries file and sets corresponding envs.""" |
| os.environ["PW_FAKE_PROJ_CIPD_INSTALL_DIR"] = str( |
| self.touch_temp_exe_file( |
| Path("proj_install") / "bin" / "exe_in_proj_install" |
| ).parent.parent |
| ) |
| |
| os.environ["PW_PIGWEED_CIPD_INSTALL_DIR"] = str( |
| self.touch_temp_exe_file( |
| Path("pigweed_install") / "bin" / "exe_in_pigweed_install" |
| ).parent.parent |
| ) |
| |
| def touch_temp_exe_file(self, exe_path: Path) -> Path: |
| """Create a temporary executable file given a path.""" |
| if sys.platform.lower() in ("win32", "cygwin"): |
| exe_path = Path(str(exe_path) + ".exe") |
| |
| file_path = self.temp_dir_path / exe_path |
| |
| os.makedirs(os.path.dirname(file_path), exist_ok=True) |
| with open(file_path, "w") as f: |
| f.write("aaa") |
| |
| return file_path |
| |
| def test_find_from_pigweed_cipd_install(self): |
| env_vars = vars(pigweed_environment()) |
| |
| self.assertTrue( |
| str( |
| find_cipd_installed_exe_path("exe_in_pigweed_install") |
| ).startswith(env_vars.get("PW_PIGWEED_CIPD_INSTALL_DIR")) |
| ) |
| |
| def test_find_from_project_defined_cipd_install(self): |
| env_vars = vars(pigweed_environment()) |
| |
| self.assertTrue( |
| str(find_cipd_installed_exe_path("exe_in_proj_install")).startswith( |
| env_vars.get("PW_FAKE_PROJ_CIPD_INSTALL_DIR") |
| ) |
| ) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |