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