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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#!/usr/bin/env python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
import os
import shutil
import tempfile
import unittest
import mozunit
from manifestparser import ManifestParser, convert
class TestSymlinkConversion(unittest.TestCase):
"""
test conversion of a directory tree with symlinks to a manifest structure
"""
def create_stub(self, directory=None):
"""stub out a directory with files in it"""
files = ("foo", "bar", "fleem")
if directory is None:
directory = tempfile.mkdtemp()
for i in files:
open(os.path.join(directory, i), "w").write(i)
subdir = os.path.join(directory, "subdir")
os.mkdir(subdir)
open(os.path.join(subdir, "subfile"), "w").write("baz")
return directory
def test_relpath(self):
"""test convert `relative_to` functionality"""
oldcwd = os.getcwd()
stub = self.create_stub()
try:
# subdir with in-memory manifest
files = ["../bar", "../fleem", "../foo", "subfile"]
subdir = os.path.join(stub, "subdir")
os.chdir(subdir)
parser = convert([stub], relative_to=".")
self.assertEqual([i["name"] for i in parser.tests], files)
except BaseException:
raise
finally:
shutil.rmtree(stub)
os.chdir(oldcwd)
@unittest.skipIf(
not hasattr(os, "symlink"), "symlinks unavailable on this platform"
)
def test_relpath_symlink(self):
"""
Ensure `relative_to` works in a symlink.
Not available on windows.
"""
oldcwd = os.getcwd()
workspace = tempfile.mkdtemp()
try:
tmpdir = os.path.join(workspace, "directory")
os.makedirs(tmpdir)
linkdir = os.path.join(workspace, "link")
os.symlink(tmpdir, linkdir)
self.create_stub(tmpdir)
# subdir with in-memory manifest
files = ["../bar", "../fleem", "../foo", "subfile"]
subdir = os.path.join(linkdir, "subdir")
os.chdir(os.path.realpath(subdir))
for directory in (tmpdir, linkdir):
parser = convert([directory], relative_to=".")
self.assertEqual([i["name"] for i in parser.tests], files)
finally:
shutil.rmtree(workspace)
os.chdir(oldcwd)
# a more complicated example
oldcwd = os.getcwd()
workspace = tempfile.mkdtemp()
try:
tmpdir = os.path.join(workspace, "directory")
os.makedirs(tmpdir)
linkdir = os.path.join(workspace, "link")
os.symlink(tmpdir, linkdir)
self.create_stub(tmpdir)
files = ["../bar", "../fleem", "../foo", "subfile"]
subdir = os.path.join(linkdir, "subdir")
subsubdir = os.path.join(subdir, "sub")
os.makedirs(subsubdir)
linksubdir = os.path.join(linkdir, "linky")
linksubsubdir = os.path.join(subsubdir, "linky")
os.symlink(subdir, linksubdir)
os.symlink(subdir, linksubsubdir)
for dest in (subdir,):
os.chdir(dest)
for directory in (tmpdir, linkdir):
parser = convert([directory], relative_to=".")
self.assertEqual([i["name"] for i in parser.tests], files)
finally:
shutil.rmtree(workspace)
os.chdir(oldcwd)
@unittest.skipIf(
not hasattr(os, "symlink"), "symlinks unavailable on this platform"
)
def test_recursion_symlinks(self):
workspace = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, workspace)
# create two dirs
os.makedirs(os.path.join(workspace, "dir1"))
os.makedirs(os.path.join(workspace, "dir2"))
# create cyclical symlinks
os.symlink(os.path.join("..", "dir1"), os.path.join(workspace, "dir2", "ldir1"))
os.symlink(os.path.join("..", "dir2"), os.path.join(workspace, "dir1", "ldir2"))
# create one file in each dir
open(os.path.join(workspace, "dir1", "f1.txt"), "a").close()
open(os.path.join(workspace, "dir1", "ldir2", "f2.txt"), "a").close()
data = []
def callback(rootdirectory, directory, subdirs, files):
for f in files:
data.append(f)
ManifestParser._walk_directories([workspace], callback)
self.assertEqual(sorted(data), ["f1.txt", "f2.txt"])
if __name__ == "__main__":
mozunit.main()
|