root / test / py / ganeti.utils.wrapper_unittest.py @ 22b7f6f8
History | View | Annotate | Download (5.1 kB)
1 | 7831fc5f | Michael Hanselmann | #!/usr/bin/python
|
---|---|---|---|
2 | 7831fc5f | Michael Hanselmann | #
|
3 | 7831fc5f | Michael Hanselmann | |
4 | 7831fc5f | Michael Hanselmann | # Copyright (C) 2006, 2007, 2010, 2011 Google Inc.
|
5 | 7831fc5f | Michael Hanselmann | #
|
6 | 7831fc5f | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
7 | 7831fc5f | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
8 | 7831fc5f | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
9 | 7831fc5f | Michael Hanselmann | # (at your option) any later version.
|
10 | 7831fc5f | Michael Hanselmann | #
|
11 | 7831fc5f | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
12 | 7831fc5f | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 7831fc5f | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 7831fc5f | Michael Hanselmann | # General Public License for more details.
|
15 | 7831fc5f | Michael Hanselmann | #
|
16 | 7831fc5f | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
17 | 7831fc5f | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
18 | 7831fc5f | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | 7831fc5f | Michael Hanselmann | # 02110-1301, USA.
|
20 | 7831fc5f | Michael Hanselmann | |
21 | 7831fc5f | Michael Hanselmann | |
22 | 7831fc5f | Michael Hanselmann | """Script for testing ganeti.utils.wrapper"""
|
23 | 7831fc5f | Michael Hanselmann | |
24 | 7831fc5f | Michael Hanselmann | import errno |
25 | 7831fc5f | Michael Hanselmann | import fcntl |
26 | 7831fc5f | Michael Hanselmann | import os |
27 | 7831fc5f | Michael Hanselmann | import socket |
28 | 7831fc5f | Michael Hanselmann | import tempfile |
29 | 7831fc5f | Michael Hanselmann | import unittest |
30 | 10b86782 | Michael Hanselmann | import shutil |
31 | 7831fc5f | Michael Hanselmann | |
32 | 7831fc5f | Michael Hanselmann | from ganeti import constants |
33 | 7831fc5f | Michael Hanselmann | from ganeti import utils |
34 | 7831fc5f | Michael Hanselmann | |
35 | 7831fc5f | Michael Hanselmann | import testutils |
36 | 7831fc5f | Michael Hanselmann | |
37 | 7831fc5f | Michael Hanselmann | |
38 | 7831fc5f | Michael Hanselmann | class TestSetCloseOnExecFlag(unittest.TestCase): |
39 | 7831fc5f | Michael Hanselmann | """Tests for SetCloseOnExecFlag"""
|
40 | 7831fc5f | Michael Hanselmann | |
41 | 7831fc5f | Michael Hanselmann | def setUp(self): |
42 | 7831fc5f | Michael Hanselmann | self.tmpfile = tempfile.TemporaryFile()
|
43 | 7831fc5f | Michael Hanselmann | |
44 | 7831fc5f | Michael Hanselmann | def testEnable(self): |
45 | 7831fc5f | Michael Hanselmann | utils.SetCloseOnExecFlag(self.tmpfile.fileno(), True) |
46 | 7831fc5f | Michael Hanselmann | self.failUnless(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFD) & |
47 | 7831fc5f | Michael Hanselmann | fcntl.FD_CLOEXEC) |
48 | 7831fc5f | Michael Hanselmann | |
49 | 7831fc5f | Michael Hanselmann | def testDisable(self): |
50 | 7831fc5f | Michael Hanselmann | utils.SetCloseOnExecFlag(self.tmpfile.fileno(), False) |
51 | 7831fc5f | Michael Hanselmann | self.failIf(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFD) & |
52 | 7831fc5f | Michael Hanselmann | fcntl.FD_CLOEXEC) |
53 | 7831fc5f | Michael Hanselmann | |
54 | 7831fc5f | Michael Hanselmann | |
55 | 7831fc5f | Michael Hanselmann | class TestSetNonblockFlag(unittest.TestCase): |
56 | 7831fc5f | Michael Hanselmann | def setUp(self): |
57 | 7831fc5f | Michael Hanselmann | self.tmpfile = tempfile.TemporaryFile()
|
58 | 7831fc5f | Michael Hanselmann | |
59 | 7831fc5f | Michael Hanselmann | def testEnable(self): |
60 | 7831fc5f | Michael Hanselmann | utils.SetNonblockFlag(self.tmpfile.fileno(), True) |
61 | 7831fc5f | Michael Hanselmann | self.failUnless(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFL) & |
62 | 7831fc5f | Michael Hanselmann | os.O_NONBLOCK) |
63 | 7831fc5f | Michael Hanselmann | |
64 | 7831fc5f | Michael Hanselmann | def testDisable(self): |
65 | 7831fc5f | Michael Hanselmann | utils.SetNonblockFlag(self.tmpfile.fileno(), False) |
66 | 7831fc5f | Michael Hanselmann | self.failIf(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFL) & |
67 | 7831fc5f | Michael Hanselmann | os.O_NONBLOCK) |
68 | 7831fc5f | Michael Hanselmann | |
69 | 7831fc5f | Michael Hanselmann | |
70 | 7831fc5f | Michael Hanselmann | class TestIgnoreProcessNotFound(unittest.TestCase): |
71 | 7831fc5f | Michael Hanselmann | @staticmethod
|
72 | 7831fc5f | Michael Hanselmann | def _WritePid(fd): |
73 | 7831fc5f | Michael Hanselmann | os.write(fd, str(os.getpid()))
|
74 | 7831fc5f | Michael Hanselmann | os.close(fd) |
75 | 7831fc5f | Michael Hanselmann | return True |
76 | 7831fc5f | Michael Hanselmann | |
77 | 7831fc5f | Michael Hanselmann | def test(self): |
78 | 7831fc5f | Michael Hanselmann | (pid_read_fd, pid_write_fd) = os.pipe() |
79 | 7831fc5f | Michael Hanselmann | |
80 | 7831fc5f | Michael Hanselmann | # Start short-lived process which writes its PID to pipe
|
81 | 7831fc5f | Michael Hanselmann | self.assert_(utils.RunInSeparateProcess(self._WritePid, pid_write_fd)) |
82 | 7831fc5f | Michael Hanselmann | os.close(pid_write_fd) |
83 | 7831fc5f | Michael Hanselmann | |
84 | 7831fc5f | Michael Hanselmann | # Read PID from pipe
|
85 | 7831fc5f | Michael Hanselmann | pid = int(os.read(pid_read_fd, 1024)) |
86 | 7831fc5f | Michael Hanselmann | os.close(pid_read_fd) |
87 | 7831fc5f | Michael Hanselmann | |
88 | 7831fc5f | Michael Hanselmann | # Try to send signal to process which exited recently
|
89 | 7831fc5f | Michael Hanselmann | self.assertFalse(utils.IgnoreProcessNotFound(os.kill, pid, 0)) |
90 | 7831fc5f | Michael Hanselmann | |
91 | 7831fc5f | Michael Hanselmann | |
92 | 7831fc5f | Michael Hanselmann | class TestIgnoreSignals(unittest.TestCase): |
93 | 7831fc5f | Michael Hanselmann | """Test the IgnoreSignals decorator"""
|
94 | 7831fc5f | Michael Hanselmann | |
95 | 7831fc5f | Michael Hanselmann | @staticmethod
|
96 | 7831fc5f | Michael Hanselmann | def _Raise(exception): |
97 | 7831fc5f | Michael Hanselmann | raise exception
|
98 | 7831fc5f | Michael Hanselmann | |
99 | 7831fc5f | Michael Hanselmann | @staticmethod
|
100 | 7831fc5f | Michael Hanselmann | def _Return(rval): |
101 | 7831fc5f | Michael Hanselmann | return rval
|
102 | 7831fc5f | Michael Hanselmann | |
103 | 7831fc5f | Michael Hanselmann | def testIgnoreSignals(self): |
104 | 7831fc5f | Michael Hanselmann | sock_err_intr = socket.error(errno.EINTR, "Message")
|
105 | 7831fc5f | Michael Hanselmann | sock_err_inval = socket.error(errno.EINVAL, "Message")
|
106 | 7831fc5f | Michael Hanselmann | |
107 | 7831fc5f | Michael Hanselmann | env_err_intr = EnvironmentError(errno.EINTR, "Message") |
108 | 7831fc5f | Michael Hanselmann | env_err_inval = EnvironmentError(errno.EINVAL, "Message") |
109 | 7831fc5f | Michael Hanselmann | |
110 | 7831fc5f | Michael Hanselmann | self.assertRaises(socket.error, self._Raise, sock_err_intr) |
111 | 7831fc5f | Michael Hanselmann | self.assertRaises(socket.error, self._Raise, sock_err_inval) |
112 | 7831fc5f | Michael Hanselmann | self.assertRaises(EnvironmentError, self._Raise, env_err_intr) |
113 | 7831fc5f | Michael Hanselmann | self.assertRaises(EnvironmentError, self._Raise, env_err_inval) |
114 | 7831fc5f | Michael Hanselmann | |
115 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Raise, sock_err_intr), None) |
116 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Raise, env_err_intr), None) |
117 | 7831fc5f | Michael Hanselmann | self.assertRaises(socket.error, utils.IgnoreSignals, self._Raise, |
118 | 7831fc5f | Michael Hanselmann | sock_err_inval) |
119 | 7831fc5f | Michael Hanselmann | self.assertRaises(EnvironmentError, utils.IgnoreSignals, self._Raise, |
120 | 7831fc5f | Michael Hanselmann | env_err_inval) |
121 | 7831fc5f | Michael Hanselmann | |
122 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Return, True), True) |
123 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Return, 33), 33) |
124 | 7831fc5f | Michael Hanselmann | |
125 | 7831fc5f | Michael Hanselmann | |
126 | 10b86782 | Michael Hanselmann | class TestIsExecutable(unittest.TestCase): |
127 | 10b86782 | Michael Hanselmann | def setUp(self): |
128 | 10b86782 | Michael Hanselmann | self.tmpdir = tempfile.mkdtemp()
|
129 | 10b86782 | Michael Hanselmann | |
130 | 10b86782 | Michael Hanselmann | def tearDown(self): |
131 | 10b86782 | Michael Hanselmann | shutil.rmtree(self.tmpdir)
|
132 | 10b86782 | Michael Hanselmann | |
133 | 10b86782 | Michael Hanselmann | def testNonExisting(self): |
134 | 10b86782 | Michael Hanselmann | fname = utils.PathJoin(self.tmpdir, "file") |
135 | 10b86782 | Michael Hanselmann | assert not os.path.exists(fname) |
136 | 10b86782 | Michael Hanselmann | self.assertFalse(utils.IsExecutable(fname))
|
137 | 10b86782 | Michael Hanselmann | |
138 | 10b86782 | Michael Hanselmann | def testNoFile(self): |
139 | 10b86782 | Michael Hanselmann | path = utils.PathJoin(self.tmpdir, "something") |
140 | 10b86782 | Michael Hanselmann | os.mkdir(path) |
141 | 10b86782 | Michael Hanselmann | assert os.path.isdir(path)
|
142 | 10b86782 | Michael Hanselmann | self.assertFalse(utils.IsExecutable(path))
|
143 | 10b86782 | Michael Hanselmann | |
144 | 10b86782 | Michael Hanselmann | def testExecutable(self): |
145 | 10b86782 | Michael Hanselmann | fname = utils.PathJoin(self.tmpdir, "file") |
146 | 10b86782 | Michael Hanselmann | utils.WriteFile(fname, data="#!/bin/bash", mode=0700) |
147 | 10b86782 | Michael Hanselmann | assert os.path.exists(fname)
|
148 | 10b86782 | Michael Hanselmann | self.assertTrue(utils.IsExecutable(fname))
|
149 | 10b86782 | Michael Hanselmann | |
150 | 10b86782 | Michael Hanselmann | self.assertTrue(self._TestSymlink(fname)) |
151 | 10b86782 | Michael Hanselmann | |
152 | 10b86782 | Michael Hanselmann | def testFileNotExecutable(self): |
153 | 10b86782 | Michael Hanselmann | fname = utils.PathJoin(self.tmpdir, "file") |
154 | 10b86782 | Michael Hanselmann | utils.WriteFile(fname, data="#!/bin/bash", mode=0600) |
155 | 10b86782 | Michael Hanselmann | assert os.path.exists(fname)
|
156 | 10b86782 | Michael Hanselmann | self.assertFalse(utils.IsExecutable(fname))
|
157 | 10b86782 | Michael Hanselmann | |
158 | 10b86782 | Michael Hanselmann | self.assertFalse(self._TestSymlink(fname)) |
159 | 10b86782 | Michael Hanselmann | |
160 | 10b86782 | Michael Hanselmann | def _TestSymlink(self, fname): |
161 | 10b86782 | Michael Hanselmann | assert os.path.exists(fname)
|
162 | 10b86782 | Michael Hanselmann | |
163 | 10b86782 | Michael Hanselmann | linkname = utils.PathJoin(self.tmpdir, "cmd") |
164 | 10b86782 | Michael Hanselmann | os.symlink(fname, linkname) |
165 | 10b86782 | Michael Hanselmann | |
166 | 10b86782 | Michael Hanselmann | assert os.path.islink(linkname)
|
167 | 10b86782 | Michael Hanselmann | |
168 | 10b86782 | Michael Hanselmann | return utils.IsExecutable(linkname)
|
169 | 10b86782 | Michael Hanselmann | |
170 | 10b86782 | Michael Hanselmann | |
171 | 7831fc5f | Michael Hanselmann | if __name__ == "__main__": |
172 | 7831fc5f | Michael Hanselmann | testutils.GanetiTestProgram() |