Statistics
| Branch: | Tag: | Revision:

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()