root / test / ganeti.tools.ensure_dirs_unittest.py @ 98dfcaff
History | View | Annotate | Download (6.5 kB)
1 | 0d2bf835 | René Nussbaumer | #!/usr/bin/python
|
---|---|---|---|
2 | 0d2bf835 | René Nussbaumer | #
|
3 | 0d2bf835 | René Nussbaumer | |
4 | 0d2bf835 | René Nussbaumer | # Copyright (C) 2011 Google Inc.
|
5 | 0d2bf835 | René Nussbaumer | #
|
6 | 0d2bf835 | René Nussbaumer | # This program is free software; you can redistribute it and/or modify
|
7 | 0d2bf835 | René Nussbaumer | # it under the terms of the GNU General Public License as published by
|
8 | 0d2bf835 | René Nussbaumer | # the Free Software Foundation; either version 2 of the License, or
|
9 | 0d2bf835 | René Nussbaumer | # (at your option) any later version.
|
10 | 0d2bf835 | René Nussbaumer | #
|
11 | 0d2bf835 | René Nussbaumer | # This program is distributed in the hope that it will be useful, but
|
12 | 0d2bf835 | René Nussbaumer | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 0d2bf835 | René Nussbaumer | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 0d2bf835 | René Nussbaumer | # General Public License for more details.
|
15 | 0d2bf835 | René Nussbaumer | #
|
16 | 0d2bf835 | René Nussbaumer | # You should have received a copy of the GNU General Public License
|
17 | 0d2bf835 | René Nussbaumer | # along with this program; if not, write to the Free Software
|
18 | 0d2bf835 | René Nussbaumer | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | 0d2bf835 | René Nussbaumer | # 02110-1301, USA.
|
20 | 0d2bf835 | René Nussbaumer | |
21 | 0d2bf835 | René Nussbaumer | |
22 | 0d2bf835 | René Nussbaumer | """Script for testing ganeti.tools.ensure_dirs"""
|
23 | 0d2bf835 | René Nussbaumer | |
24 | 0d2bf835 | René Nussbaumer | import errno |
25 | 0d2bf835 | René Nussbaumer | import stat |
26 | 0d2bf835 | René Nussbaumer | import unittest |
27 | 0d2bf835 | René Nussbaumer | import os.path |
28 | 0d2bf835 | René Nussbaumer | |
29 | 0d2bf835 | René Nussbaumer | from ganeti.tools import ensure_dirs |
30 | 0d2bf835 | René Nussbaumer | |
31 | 0d2bf835 | René Nussbaumer | import testutils |
32 | 0d2bf835 | René Nussbaumer | |
33 | 0d2bf835 | René Nussbaumer | |
34 | c3f54085 | Michael Hanselmann | def _MockStatResult(cb, mode, uid, gid): |
35 | c3f54085 | Michael Hanselmann | def _fn(path): |
36 | c3f54085 | Michael Hanselmann | if cb:
|
37 | c3f54085 | Michael Hanselmann | cb() |
38 | c3f54085 | Michael Hanselmann | return {
|
39 | c3f54085 | Michael Hanselmann | stat.ST_MODE: mode, |
40 | c3f54085 | Michael Hanselmann | stat.ST_UID: uid, |
41 | c3f54085 | Michael Hanselmann | stat.ST_GID: gid, |
42 | c3f54085 | Michael Hanselmann | } |
43 | c3f54085 | Michael Hanselmann | return _fn
|
44 | c3f54085 | Michael Hanselmann | |
45 | c3f54085 | Michael Hanselmann | |
46 | c3f54085 | Michael Hanselmann | def _RaiseNoEntError(): |
47 | c3f54085 | Michael Hanselmann | raise EnvironmentError(errno.ENOENT, "not found") |
48 | c3f54085 | Michael Hanselmann | |
49 | c3f54085 | Michael Hanselmann | |
50 | c3f54085 | Michael Hanselmann | def _OtherStatRaise(): |
51 | c3f54085 | Michael Hanselmann | raise EnvironmentError() |
52 | c3f54085 | Michael Hanselmann | |
53 | c3f54085 | Michael Hanselmann | |
54 | 0d2bf835 | René Nussbaumer | class TestEnsureDirsFunctions(unittest.TestCase): |
55 | c3f54085 | Michael Hanselmann | UID_A = 16024
|
56 | c3f54085 | Michael Hanselmann | UID_B = 25850
|
57 | c3f54085 | Michael Hanselmann | GID_A = 14028
|
58 | c3f54085 | Michael Hanselmann | GID_B = 29801
|
59 | 0d2bf835 | René Nussbaumer | |
60 | c3f54085 | Michael Hanselmann | def setUp(self): |
61 | c3f54085 | Michael Hanselmann | self._chown_calls = []
|
62 | c3f54085 | Michael Hanselmann | self._chmod_calls = []
|
63 | c3f54085 | Michael Hanselmann | self._mkdir_calls = []
|
64 | c3f54085 | Michael Hanselmann | |
65 | c3f54085 | Michael Hanselmann | def tearDown(self): |
66 | c3f54085 | Michael Hanselmann | self.assertRaises(IndexError, self._mkdir_calls.pop) |
67 | c3f54085 | Michael Hanselmann | self.assertRaises(IndexError, self._chmod_calls.pop) |
68 | c3f54085 | Michael Hanselmann | self.assertRaises(IndexError, self._chown_calls.pop) |
69 | 0d2bf835 | René Nussbaumer | |
70 | c3f54085 | Michael Hanselmann | def _FakeMkdir(self, path): |
71 | c3f54085 | Michael Hanselmann | self._mkdir_calls.append(path)
|
72 | 0d2bf835 | René Nussbaumer | |
73 | c3f54085 | Michael Hanselmann | def _FakeChown(self, path, uid, gid): |
74 | c3f54085 | Michael Hanselmann | self._chown_calls.append((path, uid, gid))
|
75 | 0d2bf835 | René Nussbaumer | |
76 | c3f54085 | Michael Hanselmann | def _ChmodWrapper(self, cb): |
77 | 0d2bf835 | René Nussbaumer | def _fn(path, mode): |
78 | c3f54085 | Michael Hanselmann | self._chmod_calls.append((path, mode))
|
79 | c3f54085 | Michael Hanselmann | if cb:
|
80 | c3f54085 | Michael Hanselmann | cb() |
81 | 0d2bf835 | René Nussbaumer | return _fn
|
82 | 0d2bf835 | René Nussbaumer | |
83 | c3f54085 | Michael Hanselmann | def _VerifyEnsure(self, path, mode, uid=-1, gid=-1): |
84 | c3f54085 | Michael Hanselmann | self.assertEqual(path, "/ganeti-qa-non-test") |
85 | c3f54085 | Michael Hanselmann | self.assertEqual(mode, 0700) |
86 | c3f54085 | Michael Hanselmann | self.assertEqual(uid, self.UID_A) |
87 | c3f54085 | Michael Hanselmann | self.assertEqual(gid, self.GID_A) |
88 | 0d2bf835 | René Nussbaumer | |
89 | 0d2bf835 | René Nussbaumer | def testEnsureDir(self): |
90 | c3f54085 | Michael Hanselmann | is_dir_stat = _MockStatResult(None, stat.S_IFDIR, 0, 0) |
91 | c3f54085 | Michael Hanselmann | ensure_dirs.EnsureDir("/ganeti-qa-non-test", 0700, self.UID_A, self.GID_A, |
92 | c3f54085 | Michael Hanselmann | _lstat_fn=is_dir_stat, _ensure_fn=self._VerifyEnsure)
|
93 | 0d2bf835 | René Nussbaumer | |
94 | c3f54085 | Michael Hanselmann | def testEnsureDirErrors(self): |
95 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsureDir,
|
96 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0700, 0, 0, |
97 | c3f54085 | Michael Hanselmann | _lstat_fn=_MockStatResult(None, 0, 0, 0)) |
98 | c3f54085 | Michael Hanselmann | self.assertRaises(IndexError, self._mkdir_calls.pop) |
99 | c3f54085 | Michael Hanselmann | |
100 | c3f54085 | Michael Hanselmann | other_stat_raise = _MockStatResult(_OtherStatRaise, stat.S_IFDIR, 0, 0) |
101 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsureDir,
|
102 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0700, 0, 0, |
103 | d00a730d | Michael Hanselmann | _lstat_fn=other_stat_raise) |
104 | c3f54085 | Michael Hanselmann | self.assertRaises(IndexError, self._mkdir_calls.pop) |
105 | c3f54085 | Michael Hanselmann | |
106 | c3f54085 | Michael Hanselmann | non_exist_stat = _MockStatResult(_RaiseNoEntError, stat.S_IFDIR, 0, 0) |
107 | c3f54085 | Michael Hanselmann | ensure_dirs.EnsureDir("/ganeti-qa-non-test", 0700, self.UID_A, self.GID_A, |
108 | c3f54085 | Michael Hanselmann | _lstat_fn=non_exist_stat, _mkdir_fn=self._FakeMkdir,
|
109 | 0d2bf835 | René Nussbaumer | _ensure_fn=self._VerifyEnsure)
|
110 | c3f54085 | Michael Hanselmann | self.assertEqual(self._mkdir_calls.pop(0), "/ganeti-qa-non-test") |
111 | 0d2bf835 | René Nussbaumer | |
112 | c3f54085 | Michael Hanselmann | def testEnsurePermissionNoEnt(self): |
113 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsurePermission,
|
114 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0600, |
115 | c3f54085 | Michael Hanselmann | _chmod_fn=NotImplemented, _chown_fn=NotImplemented, |
116 | c3f54085 | Michael Hanselmann | _stat_fn=_MockStatResult(_RaiseNoEntError, 0, 0, 0)) |
117 | c3f54085 | Michael Hanselmann | |
118 | c3f54085 | Michael Hanselmann | def testEnsurePermissionNoEntMustNotExist(self): |
119 | 0d2bf835 | René Nussbaumer | ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600, must_exist=False, |
120 | c3f54085 | Michael Hanselmann | _chmod_fn=NotImplemented,
|
121 | c3f54085 | Michael Hanselmann | _chown_fn=NotImplemented,
|
122 | c3f54085 | Michael Hanselmann | _stat_fn=_MockStatResult(_RaiseNoEntError, |
123 | c3f54085 | Michael Hanselmann | 0, 0, 0)) |
124 | c3f54085 | Michael Hanselmann | |
125 | c3f54085 | Michael Hanselmann | def testEnsurePermissionOtherErrorMustNotExist(self): |
126 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsurePermission,
|
127 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0600, must_exist=False, |
128 | c3f54085 | Michael Hanselmann | _chmod_fn=NotImplemented, _chown_fn=NotImplemented, |
129 | c3f54085 | Michael Hanselmann | _stat_fn=_MockStatResult(_OtherStatRaise, 0, 0, 0)) |
130 | c3f54085 | Michael Hanselmann | |
131 | c3f54085 | Michael Hanselmann | def testEnsurePermissionNoChanges(self): |
132 | c3f54085 | Michael Hanselmann | ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600, |
133 | c3f54085 | Michael Hanselmann | _stat_fn=_MockStatResult(None, 0600, 0, 0), |
134 | c3f54085 | Michael Hanselmann | _chmod_fn=self._ChmodWrapper(None), |
135 | c3f54085 | Michael Hanselmann | _chown_fn=self._FakeChown)
|
136 | c3f54085 | Michael Hanselmann | |
137 | c3f54085 | Michael Hanselmann | def testEnsurePermissionChangeMode(self): |
138 | c3f54085 | Michael Hanselmann | ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0444, |
139 | c3f54085 | Michael Hanselmann | _stat_fn=_MockStatResult(None, 0600, 0, 0), |
140 | c3f54085 | Michael Hanselmann | _chmod_fn=self._ChmodWrapper(None), |
141 | c3f54085 | Michael Hanselmann | _chown_fn=self._FakeChown)
|
142 | c3f54085 | Michael Hanselmann | self.assertEqual(self._chmod_calls.pop(0), ("/ganeti-qa-non-test", 0444)) |
143 | c3f54085 | Michael Hanselmann | |
144 | c3f54085 | Michael Hanselmann | def testEnsurePermissionSetUidGid(self): |
145 | 0d2bf835 | René Nussbaumer | ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600, |
146 | c3f54085 | Michael Hanselmann | uid=self.UID_B, gid=self.GID_B, |
147 | c3f54085 | Michael Hanselmann | _stat_fn=_MockStatResult(None, 0600, |
148 | c3f54085 | Michael Hanselmann | self.UID_A,
|
149 | c3f54085 | Michael Hanselmann | self.GID_A),
|
150 | c3f54085 | Michael Hanselmann | _chmod_fn=self._ChmodWrapper(None), |
151 | c3f54085 | Michael Hanselmann | _chown_fn=self._FakeChown)
|
152 | c3f54085 | Michael Hanselmann | self.assertEqual(self._chown_calls.pop(0), |
153 | c3f54085 | Michael Hanselmann | ("/ganeti-qa-non-test", self.UID_B, self.GID_B)) |
154 | 0d2bf835 | René Nussbaumer | |
155 | 0d2bf835 | René Nussbaumer | def testPaths(self): |
156 | 0d2bf835 | René Nussbaumer | paths = [(path[0], path[1]) for path in ensure_dirs.GetPaths()] |
157 | 0d2bf835 | René Nussbaumer | |
158 | 0d2bf835 | René Nussbaumer | seen = [] |
159 | 0d2bf835 | René Nussbaumer | last_dirname = ""
|
160 | 0d2bf835 | René Nussbaumer | for path, pathtype in paths: |
161 | 0d2bf835 | René Nussbaumer | self.assertTrue(pathtype in ensure_dirs.ALL_TYPES) |
162 | 0d2bf835 | René Nussbaumer | dirname = os.path.dirname(path) |
163 | 0d2bf835 | René Nussbaumer | if dirname != last_dirname or pathtype == ensure_dirs.DIR: |
164 | 0d2bf835 | René Nussbaumer | if pathtype == ensure_dirs.FILE:
|
165 | 0d2bf835 | René Nussbaumer | self.assertFalse(dirname in seen, |
166 | 0d2bf835 | René Nussbaumer | msg="path %s; dirname %s seen in %s" % (path,
|
167 | 0d2bf835 | René Nussbaumer | dirname, |
168 | 0d2bf835 | René Nussbaumer | seen)) |
169 | 0d2bf835 | René Nussbaumer | last_dirname = dirname |
170 | 0d2bf835 | René Nussbaumer | seen.append(dirname) |
171 | 0d2bf835 | René Nussbaumer | elif pathtype == ensure_dirs.DIR:
|
172 | 0d2bf835 | René Nussbaumer | self.assertFalse(path in seen) |
173 | 0d2bf835 | René Nussbaumer | last_dirname = path |
174 | 0d2bf835 | René Nussbaumer | seen.append(path) |
175 | 0d2bf835 | René Nussbaumer | |
176 | 0d2bf835 | René Nussbaumer | |
177 | 0d2bf835 | René Nussbaumer | if __name__ == "__main__": |
178 | 0d2bf835 | René Nussbaumer | testutils.GanetiTestProgram() |