blob: e0eb8134a903c1d15547fc9ccf8fa66a7d8eeb28 [file] [log] [blame]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001from unittest.case import TestCase
2import oe, oe.path
3import tempfile
4import os
5import errno
6import shutil
7
8class TestRealPath(TestCase):
9 DIRS = [ "a", "b", "etc", "sbin", "usr", "usr/bin", "usr/binX", "usr/sbin", "usr/include", "usr/include/gdbm" ]
10 FILES = [ "etc/passwd", "b/file" ]
11 LINKS = [
12 ( "bin", "/usr/bin", "/usr/bin" ),
13 ( "binX", "usr/binX", "/usr/binX" ),
14 ( "c", "broken", "/broken" ),
15 ( "etc/passwd-1", "passwd", "/etc/passwd" ),
16 ( "etc/passwd-2", "passwd-1", "/etc/passwd" ),
17 ( "etc/passwd-3", "/etc/passwd-1", "/etc/passwd" ),
18 ( "etc/shadow-1", "/etc/shadow", "/etc/shadow" ),
19 ( "etc/shadow-2", "/etc/shadow-1", "/etc/shadow" ),
20 ( "prog-A", "bin/prog-A", "/usr/bin/prog-A" ),
21 ( "prog-B", "/bin/prog-B", "/usr/bin/prog-B" ),
22 ( "usr/bin/prog-C", "../../sbin/prog-C", "/sbin/prog-C" ),
23 ( "usr/bin/prog-D", "/sbin/prog-D", "/sbin/prog-D" ),
24 ( "usr/binX/prog-E", "../sbin/prog-E", None ),
25 ( "usr/bin/prog-F", "../../../sbin/prog-F", "/sbin/prog-F" ),
26 ( "loop", "a/loop", None ),
27 ( "a/loop", "../loop", None ),
28 ( "b/test", "file/foo", "/b/file/foo" ),
29 ]
30
31 LINKS_PHYS = [
32 ( "./", "/", "" ),
33 ( "binX/prog-E", "/usr/sbin/prog-E", "/sbin/prog-E" ),
34 ]
35
36 EXCEPTIONS = [
37 ( "loop", errno.ELOOP ),
38 ( "b/test", errno.ENOENT ),
39 ]
40
Brad Bishopd7bf8c12018-02-25 22:55:05 -050041 def setUp(self):
42 self.tmpdir = tempfile.mkdtemp(prefix = "oe-test_path")
43 self.root = os.path.join(self.tmpdir, "R")
44
45 os.mkdir(os.path.join(self.tmpdir, "_real"))
46 os.symlink("_real", self.root)
47
48 for d in self.DIRS:
49 os.mkdir(os.path.join(self.root, d))
50 for f in self.FILES:
51 open(os.path.join(self.root, f), "w")
52 for l in self.LINKS:
53 os.symlink(l[1], os.path.join(self.root, l[0]))
54
Brad Bishopf86d0552018-12-04 14:18:15 -080055 def tearDown(self):
56 shutil.rmtree(self.tmpdir)
57
Brad Bishopd7bf8c12018-02-25 22:55:05 -050058 def __realpath(self, file, use_physdir, assume_dir = True):
59 return oe.path.realpath(os.path.join(self.root, file), self.root,
60 use_physdir, assume_dir = assume_dir)
61
62 def test_norm(self):
63 for l in self.LINKS:
64 if l[2] == None:
65 continue
66
67 target_p = self.__realpath(l[0], True)
68 target_l = self.__realpath(l[0], False)
69
70 if l[2] != False:
71 self.assertEqual(target_p, target_l)
72 self.assertEqual(l[2], target_p[len(self.root):])
73
74 def test_phys(self):
75 for l in self.LINKS_PHYS:
76 target_p = self.__realpath(l[0], True)
77 target_l = self.__realpath(l[0], False)
78
79 self.assertEqual(l[1], target_p[len(self.root):])
80 self.assertEqual(l[2], target_l[len(self.root):])
81
82 def test_loop(self):
83 for e in self.EXCEPTIONS:
84 self.assertRaisesRegex(OSError, r'\[Errno %u\]' % e[1],
85 self.__realpath, e[0], False, False)