1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
from typing import cast
import pytest
from debputy.exceptions import SymlinkLoopError
from debputy.filesystem_scan import VirtualPathBase
from debputy.plugin.api import virtual_path_def
from debputy.plugin.api.test_api import build_virtual_file_system
def test_symlink_lookup() -> None:
fs = build_virtual_file_system(
[
virtual_path_def("./usr/share/doc/bar", link_target="foo"),
"./usr/share/doc/foo/copyright",
virtual_path_def("./usr/share/bar/data", link_target="../foo/data"),
"./usr/share/foo/data/foo.dat",
virtual_path_def("./usr/share/baz/data", link_target="/usr/share/foo/data"),
virtual_path_def(
"./usr/share/test/loop-a", link_target="/usr/share/test/loop-b"
),
virtual_path_def("./usr/share/test/loop-b", link_target="./loop-c"),
virtual_path_def("./usr/share/test/loop-c", link_target="../test/loop-a"),
]
)
assert fs.lookup("/usr/share/doc/bar/copyright") is not None
assert fs.lookup("/usr/share/bar/data/foo.dat") is not None
assert fs.lookup("/usr/share/baz/data/foo.dat") is not None
vp_fs: VirtualPathBase = cast("VirtualPathBase", fs)
p, missing = vp_fs.attempt_lookup("/usr/share/doc/foo/non-existent")
assert p.path == "./usr/share/doc/foo"
assert missing == ["non-existent"]
p, missing = vp_fs.attempt_lookup("/usr/share/bar/data/non-existent")
assert p.path == "./usr/share/foo/data"
assert missing == ["non-existent"]
p, missing = vp_fs.attempt_lookup("/usr/share/baz/data/non-existent")
assert p.path == "./usr/share/foo/data"
assert missing == ["non-existent"]
# The symlink can be looked up
assert fs.lookup("./usr/share/test/loop-a") is not None
with pytest.raises(SymlinkLoopError):
# But resolving it will cause issues
fs.lookup("./usr/share/test/loop-a/")
|