root / test / ganeti.tools.ensure_dirs_unittest.py @ 2e5eb96a
History | View | Annotate | Download (5.1 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 | 0d2bf835 | René Nussbaumer | class TestEnsureDirsFunctions(unittest.TestCase): |
35 | 0d2bf835 | René Nussbaumer | def _NoopMkdir(self, _): |
36 | 0d2bf835 | René Nussbaumer | self.mkdir_called = True |
37 | 0d2bf835 | René Nussbaumer | |
38 | 0d2bf835 | René Nussbaumer | @staticmethod
|
39 | 0d2bf835 | René Nussbaumer | def _MockStatResult(mode, pre_fn=lambda: 0): |
40 | 0d2bf835 | René Nussbaumer | def _fn(path): |
41 | 0d2bf835 | René Nussbaumer | pre_fn() |
42 | 0d2bf835 | René Nussbaumer | return {stat.ST_MODE: mode}
|
43 | 0d2bf835 | René Nussbaumer | return _fn
|
44 | 0d2bf835 | René Nussbaumer | |
45 | 0d2bf835 | René Nussbaumer | def _VerifyEnsure(self, path, mode, uid=-1, gid=-1): |
46 | 0d2bf835 | René Nussbaumer | self.assertEqual(path, "/ganeti-qa-non-test") |
47 | 0d2bf835 | René Nussbaumer | self.assertEqual(mode, 0700) |
48 | 0d2bf835 | René Nussbaumer | self.assertEqual(uid, 0) |
49 | 0d2bf835 | René Nussbaumer | self.assertEqual(gid, 0) |
50 | 0d2bf835 | René Nussbaumer | |
51 | 0d2bf835 | René Nussbaumer | @staticmethod
|
52 | 0d2bf835 | René Nussbaumer | def _RaiseNoEntError(): |
53 | 0d2bf835 | René Nussbaumer | noent_error = EnvironmentError()
|
54 | 0d2bf835 | René Nussbaumer | noent_error.errno = errno.ENOENT |
55 | 0d2bf835 | René Nussbaumer | raise noent_error
|
56 | 0d2bf835 | René Nussbaumer | |
57 | 0d2bf835 | René Nussbaumer | @staticmethod
|
58 | 0d2bf835 | René Nussbaumer | def _OtherStatRaise(): |
59 | 0d2bf835 | René Nussbaumer | raise EnvironmentError() |
60 | 0d2bf835 | René Nussbaumer | |
61 | 0d2bf835 | René Nussbaumer | def _ChmodWrapper(self, pre_fn=lambda: 0): |
62 | 0d2bf835 | René Nussbaumer | def _fn(path, mode): |
63 | 0d2bf835 | René Nussbaumer | self.chmod_called = True |
64 | 0d2bf835 | René Nussbaumer | pre_fn() |
65 | 0d2bf835 | René Nussbaumer | return _fn
|
66 | 0d2bf835 | René Nussbaumer | |
67 | 0d2bf835 | René Nussbaumer | def _NoopChown(self, path, uid, gid): |
68 | 0d2bf835 | René Nussbaumer | self.chown_called = True |
69 | 0d2bf835 | René Nussbaumer | |
70 | 0d2bf835 | René Nussbaumer | def testEnsureDir(self): |
71 | 0d2bf835 | René Nussbaumer | is_dir_stat = self._MockStatResult(stat.S_IFDIR)
|
72 | 0d2bf835 | René Nussbaumer | not_dir_stat = self._MockStatResult(0) |
73 | 0d2bf835 | René Nussbaumer | non_exist_stat = self._MockStatResult(stat.S_IFDIR,
|
74 | 0d2bf835 | René Nussbaumer | pre_fn=self._RaiseNoEntError)
|
75 | 0d2bf835 | René Nussbaumer | other_stat_raise = self._MockStatResult(stat.S_IFDIR,
|
76 | 0d2bf835 | René Nussbaumer | pre_fn=self._OtherStatRaise)
|
77 | 0d2bf835 | René Nussbaumer | |
78 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsureDir,
|
79 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0700, 0, 0, |
80 | 0d2bf835 | René Nussbaumer | _stat_fn=not_dir_stat) |
81 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsureDir,
|
82 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0700, 0, 0, |
83 | 0d2bf835 | René Nussbaumer | _stat_fn=other_stat_raise) |
84 | 0d2bf835 | René Nussbaumer | self.mkdir_called = False |
85 | 0d2bf835 | René Nussbaumer | ensure_dirs.EnsureDir("/ganeti-qa-non-test", 0700, 0, 0, |
86 | 0d2bf835 | René Nussbaumer | _stat_fn=non_exist_stat, _mkdir_fn=self._NoopMkdir,
|
87 | 0d2bf835 | René Nussbaumer | _ensure_fn=self._VerifyEnsure)
|
88 | 0d2bf835 | René Nussbaumer | self.assertTrue(self.mkdir_called) |
89 | 0d2bf835 | René Nussbaumer | self.mkdir_called = False |
90 | 0d2bf835 | René Nussbaumer | ensure_dirs.EnsureDir("/ganeti-qa-non-test", 0700, 0, 0, |
91 | 0d2bf835 | René Nussbaumer | _stat_fn=is_dir_stat, _ensure_fn=self._VerifyEnsure)
|
92 | 0d2bf835 | René Nussbaumer | self.assertFalse(self.mkdir_called) |
93 | 0d2bf835 | René Nussbaumer | |
94 | 0d2bf835 | René Nussbaumer | def testEnsurePermission(self): |
95 | 0d2bf835 | René Nussbaumer | noent_chmod_fn = self._ChmodWrapper(pre_fn=self._RaiseNoEntError) |
96 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsurePermission,
|
97 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0600, |
98 | 0d2bf835 | René Nussbaumer | _chmod_fn=noent_chmod_fn) |
99 | 0d2bf835 | René Nussbaumer | self.chmod_called = False |
100 | 0d2bf835 | René Nussbaumer | ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600, must_exist=False, |
101 | 0d2bf835 | René Nussbaumer | _chmod_fn=noent_chmod_fn) |
102 | 0d2bf835 | René Nussbaumer | self.assertTrue(self.chmod_called) |
103 | 0d2bf835 | René Nussbaumer | self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsurePermission,
|
104 | 0d2bf835 | René Nussbaumer | "/ganeti-qa-non-test", 0600, must_exist=False, |
105 | 0d2bf835 | René Nussbaumer | _chmod_fn=self._ChmodWrapper(pre_fn=self._OtherStatRaise)) |
106 | 0d2bf835 | René Nussbaumer | self.chmod_called = False |
107 | 0d2bf835 | René Nussbaumer | self.chown_called = False |
108 | 0d2bf835 | René Nussbaumer | ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600, |
109 | 0d2bf835 | René Nussbaumer | _chmod_fn=self._ChmodWrapper(),
|
110 | 0d2bf835 | René Nussbaumer | _chown_fn=self._NoopChown)
|
111 | 0d2bf835 | René Nussbaumer | self.assertTrue(self.chmod_called) |
112 | 0d2bf835 | René Nussbaumer | self.assertFalse(self.chown_called) |
113 | 0d2bf835 | René Nussbaumer | self.chmod_called = False |
114 | 0d2bf835 | René Nussbaumer | ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600, uid=1, gid=1, |
115 | 0d2bf835 | René Nussbaumer | _chmod_fn=self._ChmodWrapper(),
|
116 | 0d2bf835 | René Nussbaumer | _chown_fn=self._NoopChown)
|
117 | 0d2bf835 | René Nussbaumer | self.assertTrue(self.chmod_called) |
118 | 0d2bf835 | René Nussbaumer | self.assertTrue(self.chown_called) |
119 | 0d2bf835 | René Nussbaumer | |
120 | 0d2bf835 | René Nussbaumer | def testPaths(self): |
121 | 0d2bf835 | René Nussbaumer | paths = [(path[0], path[1]) for path in ensure_dirs.GetPaths()] |
122 | 0d2bf835 | René Nussbaumer | |
123 | 0d2bf835 | René Nussbaumer | seen = [] |
124 | 0d2bf835 | René Nussbaumer | last_dirname = ""
|
125 | 0d2bf835 | René Nussbaumer | for path, pathtype in paths: |
126 | 0d2bf835 | René Nussbaumer | self.assertTrue(pathtype in ensure_dirs.ALL_TYPES) |
127 | 0d2bf835 | René Nussbaumer | dirname = os.path.dirname(path) |
128 | 0d2bf835 | René Nussbaumer | if dirname != last_dirname or pathtype == ensure_dirs.DIR: |
129 | 0d2bf835 | René Nussbaumer | if pathtype == ensure_dirs.FILE:
|
130 | 0d2bf835 | René Nussbaumer | self.assertFalse(dirname in seen, |
131 | 0d2bf835 | René Nussbaumer | msg="path %s; dirname %s seen in %s" % (path,
|
132 | 0d2bf835 | René Nussbaumer | dirname, |
133 | 0d2bf835 | René Nussbaumer | seen)) |
134 | 0d2bf835 | René Nussbaumer | last_dirname = dirname |
135 | 0d2bf835 | René Nussbaumer | seen.append(dirname) |
136 | 0d2bf835 | René Nussbaumer | elif pathtype == ensure_dirs.DIR:
|
137 | 0d2bf835 | René Nussbaumer | self.assertFalse(path in seen) |
138 | 0d2bf835 | René Nussbaumer | last_dirname = path |
139 | 0d2bf835 | René Nussbaumer | seen.append(path) |
140 | 0d2bf835 | René Nussbaumer | |
141 | 0d2bf835 | René Nussbaumer | |
142 | 0d2bf835 | René Nussbaumer | if __name__ == "__main__": |
143 | 0d2bf835 | René Nussbaumer | testutils.GanetiTestProgram() |