blob: 4e85bd39b3cbec30ac0f060b2cc177432c954382 [file] [log] [blame]
# 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()