| # | |
| # Copyright (C) 2023 The Android Open Source Project | |
| # | |
| # 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. | |
| # | |
| """Unit tests for fileutils.""" | |
| import contextlib | |
| import unittest | |
| from pathlib import Path | |
| from tempfile import TemporaryDirectory | |
| import fileutils | |
| class ResolveCommandLinePathsTest(unittest.TestCase): | |
| """Unit tests for resolve_command_line_paths.""" | |
| def test_empty_paths(self) -> None: | |
| """Tests that an empty argument returns an empty list.""" | |
| self.assertListEqual([], fileutils.resolve_command_line_paths([])) | |
| def test_absolute_paths(self) -> None: | |
| """Tests that absolute paths are resolved correctly.""" | |
| with TemporaryDirectory() as temp_dir_str: | |
| temp_dir = Path(temp_dir_str) | |
| a = temp_dir / "a" | |
| b = temp_dir / "external" / "b" | |
| a.mkdir() | |
| b.mkdir(parents=True) | |
| self.assertListEqual( | |
| [a, b], | |
| fileutils.resolve_command_line_paths( | |
| [str(a), str(b), "/does/not/exist"] | |
| ), | |
| ) | |
| def test_relative_paths(self) -> None: | |
| """Tests that relative paths are resolved correctly.""" | |
| with TemporaryDirectory() as temp_dir_str: | |
| # Make this absolute so the CWD change later doesn't break it. | |
| temp_dir = Path(temp_dir_str).resolve() | |
| external = temp_dir / "external" | |
| external.mkdir() | |
| a = external / "a" | |
| a.mkdir() | |
| working_dir = temp_dir / "cwd" | |
| working_dir.mkdir() | |
| b = working_dir / "b" | |
| b.mkdir() | |
| with contextlib.chdir(working_dir): | |
| self.assertListEqual( | |
| [a, working_dir, b], | |
| fileutils.resolve_command_line_paths( | |
| [ | |
| # These will all be resolved as absolute paths and returned. | |
| "../external/a", | |
| ".", | |
| "b", | |
| # This one doesn't exist. It will be pruned from the result. | |
| "c", | |
| ] | |
| ), | |
| ) | |
| class FindTreeContainingTest(unittest.TestCase): | |
| """Unit tests for find_tree_containing.""" | |
| def setUp(self) -> None: | |
| self._temp_dir = TemporaryDirectory() | |
| self.temp_dir = Path(self._temp_dir.name) | |
| self.repo_tree = self.temp_dir / "tree" | |
| (self.repo_tree / ".repo").mkdir(parents=True) | |
| def tearDown(self) -> None: | |
| self._temp_dir.cleanup() | |
| def test_cwd_is_in_tree(self) -> None: | |
| """Tests that the root is found when the CWD is in the same tree.""" | |
| (self.repo_tree / "external/a").mkdir(parents=True) | |
| (self.repo_tree / "external/b").mkdir(parents=True) | |
| with contextlib.chdir(self.repo_tree / "external/a"): | |
| self.assertEqual( | |
| fileutils.find_tree_containing(self.repo_tree / "external/b"), | |
| self.repo_tree, | |
| ) | |
| def test_cwd_is_in_other_tree(self) -> None: | |
| """Tests that the root is found when the CWD is in another tree.""" | |
| tree_a = self.temp_dir / "a" | |
| (tree_a / ".repo").mkdir(parents=True) | |
| (tree_a / "external/a").mkdir(parents=True) | |
| tree_b = self.temp_dir / "b" | |
| (tree_b / ".repo").mkdir(parents=True) | |
| (tree_b / "external/b").mkdir(parents=True) | |
| with contextlib.chdir(tree_a / "external/a"): | |
| self.assertEqual( | |
| fileutils.find_tree_containing(tree_b / "external/b"), tree_b | |
| ) | |
| def test_no_root(self) -> None: | |
| """Tests that an error is raised when no tree is found.""" | |
| with self.assertRaises(FileNotFoundError): | |
| fileutils.find_tree_containing(self.temp_dir) | |
| if __name__ == "__main__": | |
| unittest.main(verbosity=2) |