blob: a959138235a4fd08b3726b4e244ab8c7eae84bf8 [file]
import os
import pathlib
import tempfile
import unittest
from python.runfiles import runfiles
class PathlibTest(unittest.TestCase):
def setUp(self) -> None:
self.tmpdir = tempfile.TemporaryDirectory(dir=os.environ.get("TEST_TMPDIR"))
# Runfiles paths are expected to be posix paths internally when we
# construct the strings for assertions
self.root_path = pathlib.Path(self.tmpdir.name).resolve()
self.root_dir = self.root_path.as_posix()
# Create dummy files for I/O tests
self.repo_dir = self.root_path / "my_repo"
self.repo_dir.mkdir()
self.test_file = self.repo_dir / "data.txt"
self.test_file.write_text("hello runfiles", encoding="utf-8")
self.sub_dir = self.repo_dir / "subdir"
self.sub_dir.mkdir()
(self.sub_dir / "other.txt").write_text("other content", encoding="utf-8")
def _create_runfiles(self) -> runfiles.Runfiles:
r = runfiles.Create({"RUNFILES_DIR": self.root_dir})
assert r is not None
return r
def tearDown(self) -> None:
self.tmpdir.cleanup()
def test_path_api(self) -> None:
r = self._create_runfiles()
root = r.root()
# Test basic joining
p = root / "repo/pkg/file.txt"
self.assertEqual(str(p), f"{self.root_dir}/repo/pkg/file.txt")
# Test PurePath API
self.assertEqual(p.name, "file.txt")
self.assertEqual(p.suffix, ".txt")
self.assertEqual(p.parent.name, "pkg")
self.assertEqual(p.parts, ("repo", "pkg", "file.txt"))
self.assertEqual(p.stem, "file")
self.assertEqual(p.suffixes, [".txt"])
# Test multiple joins
p2 = root / "repo" / "pkg" / "file.txt"
self.assertEqual(p, p2)
# Test joins with pathlib objects
p3 = root / pathlib.PurePath("repo/pkg/file.txt")
self.assertEqual(p, p3)
def test_root(self) -> None:
r = self._create_runfiles()
self.assertEqual(str(r.root()), self.root_dir)
def test_runfiles_root_method(self) -> None:
r = self._create_runfiles()
p = r.root() / "foo/bar"
self.assertEqual(p.runfiles_root(), r.root())
self.assertEqual(str(p.runfiles_root()), self.root_dir)
def test_os_path_like(self) -> None:
r = self._create_runfiles()
p = r.root() / "foo"
self.assertEqual(os.fspath(p), f"{self.root_dir}/foo")
def test_equality_and_hash(self) -> None:
r = self._create_runfiles()
p1 = r.root() / "foo"
p2 = r.root() / "foo"
p3 = r.root() / "bar"
self.assertEqual(p1, p2)
self.assertNotEqual(p1, p3)
self.assertEqual(hash(p1), hash(p2))
def test_join_path(self) -> None:
r = self._create_runfiles()
p = r.root().joinpath("repo", "file")
self.assertEqual(str(p), f"{self.root_dir}/repo/file")
def test_parents(self) -> None:
r = self._create_runfiles()
p = r.root() / "a/b/c"
parents = list(p.parents)
self.assertEqual(len(parents), 3)
self.assertEqual(str(parents[0]), f"{self.root_dir}/a/b")
self.assertEqual(str(parents[1]), f"{self.root_dir}/a")
self.assertEqual(str(parents[2]), self.root_dir)
def test_with_methods(self) -> None:
r = self._create_runfiles()
p = r.root() / "foo/bar.txt"
self.assertEqual(str(p.with_name("baz.py")), f"{self.root_dir}/foo/baz.py")
self.assertEqual(str(p.with_suffix(".dat")), f"{self.root_dir}/foo/bar.dat")
def test_match(self) -> None:
r = self._create_runfiles()
p = r.root() / "foo/bar.txt"
self.assertTrue(p.match("*.txt"))
self.assertTrue(p.match("foo/*.txt"))
self.assertFalse(p.match("bar/*.txt"))
def test_reading_api(self) -> None:
r = self._create_runfiles()
root = r.root()
p = root / "my_repo/data.txt"
self.assertTrue(p.exists())
self.assertTrue(p.is_file())
self.assertEqual(p.read_text(encoding="utf-8"), "hello runfiles")
self.assertEqual(p.read_bytes(), b"hello runfiles")
with p.open("r", encoding="utf-8") as f:
self.assertEqual(f.read(), "hello runfiles")
def test_stat_api(self) -> None:
r = self._create_runfiles()
root = r.root()
p = root / "my_repo/data.txt"
st = p.stat()
self.assertEqual(st.st_size, len("hello runfiles"))
def test_iteration_api(self) -> None:
r = self._create_runfiles()
root = r.root()
p = root / "my_repo"
self.assertTrue(p.is_dir())
contents = {c.name for c in p.iterdir()}
self.assertEqual(contents, {"data.txt", "subdir"})
# Ensure they are still runfiles.Path
for c in p.iterdir():
self.assertIsInstance(c, runfiles.Path)
def test_glob(self) -> None:
r = self._create_runfiles()
root = r.root()
p = root / "my_repo"
glob_results = {
pathlib.PurePath(c).relative_to(pathlib.PurePath(p)).as_posix()
for c in p.glob("*.txt")
}
self.assertEqual(glob_results, {"data.txt"})
rglob_results = {
pathlib.PurePath(c).relative_to(pathlib.PurePath(p)).as_posix()
for c in p.rglob("*.txt")
}
self.assertEqual(rglob_results, {"data.txt", "subdir/other.txt"})
for c in p.rglob("*.txt"):
self.assertIsInstance(c, runfiles.Path)
def test_resolve_and_absolute(self) -> None:
r = self._create_runfiles()
root = r.root()
p = root / "my_repo/data.txt"
resolved = p.resolve()
self.assertIsInstance(resolved, runfiles.Path)
self.assertTrue(resolved.exists())
self.assertEqual(resolved.read_text(encoding="utf-8"), "hello runfiles")
absoluted = p.absolute()
self.assertIsInstance(absoluted, runfiles.Path)
self.assertTrue(absoluted.exists())
self.assertEqual(absoluted.read_text(encoding="utf-8"), "hello runfiles")
def test_runfile_path(self) -> None:
r = self._create_runfiles()
root = r.root()
p = root / "my_repo/data.txt"
self.assertEqual(p.runfile_path, "my_repo/data.txt")
p2 = root / "foo" / "bar.txt"
self.assertEqual(p2.runfile_path, "foo/bar.txt")
self.assertEqual(root.runfile_path, "")
self.assertEqual(repr(root), "runfiles.Path('')")
self.assertEqual(repr(p), "runfiles.Path('my_repo/data.txt')")
if __name__ == "__main__":
unittest.main()