root / test / ganeti.utils.wrapper_unittest.py @ 3b877f08
History | View | Annotate | Download (3.8 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 | 7831fc5f | Michael Hanselmann | |
31 | 7831fc5f | Michael Hanselmann | from ganeti import constants |
32 | 7831fc5f | Michael Hanselmann | from ganeti import utils |
33 | 7831fc5f | Michael Hanselmann | |
34 | 7831fc5f | Michael Hanselmann | import testutils |
35 | 7831fc5f | Michael Hanselmann | |
36 | 7831fc5f | Michael Hanselmann | |
37 | 7831fc5f | Michael Hanselmann | class TestSetCloseOnExecFlag(unittest.TestCase): |
38 | 7831fc5f | Michael Hanselmann | """Tests for SetCloseOnExecFlag"""
|
39 | 7831fc5f | Michael Hanselmann | |
40 | 7831fc5f | Michael Hanselmann | def setUp(self): |
41 | 7831fc5f | Michael Hanselmann | self.tmpfile = tempfile.TemporaryFile()
|
42 | 7831fc5f | Michael Hanselmann | |
43 | 7831fc5f | Michael Hanselmann | def testEnable(self): |
44 | 7831fc5f | Michael Hanselmann | utils.SetCloseOnExecFlag(self.tmpfile.fileno(), True) |
45 | 7831fc5f | Michael Hanselmann | self.failUnless(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFD) & |
46 | 7831fc5f | Michael Hanselmann | fcntl.FD_CLOEXEC) |
47 | 7831fc5f | Michael Hanselmann | |
48 | 7831fc5f | Michael Hanselmann | def testDisable(self): |
49 | 7831fc5f | Michael Hanselmann | utils.SetCloseOnExecFlag(self.tmpfile.fileno(), False) |
50 | 7831fc5f | Michael Hanselmann | self.failIf(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFD) & |
51 | 7831fc5f | Michael Hanselmann | fcntl.FD_CLOEXEC) |
52 | 7831fc5f | Michael Hanselmann | |
53 | 7831fc5f | Michael Hanselmann | |
54 | 7831fc5f | Michael Hanselmann | class TestSetNonblockFlag(unittest.TestCase): |
55 | 7831fc5f | Michael Hanselmann | def setUp(self): |
56 | 7831fc5f | Michael Hanselmann | self.tmpfile = tempfile.TemporaryFile()
|
57 | 7831fc5f | Michael Hanselmann | |
58 | 7831fc5f | Michael Hanselmann | def testEnable(self): |
59 | 7831fc5f | Michael Hanselmann | utils.SetNonblockFlag(self.tmpfile.fileno(), True) |
60 | 7831fc5f | Michael Hanselmann | self.failUnless(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFL) & |
61 | 7831fc5f | Michael Hanselmann | os.O_NONBLOCK) |
62 | 7831fc5f | Michael Hanselmann | |
63 | 7831fc5f | Michael Hanselmann | def testDisable(self): |
64 | 7831fc5f | Michael Hanselmann | utils.SetNonblockFlag(self.tmpfile.fileno(), False) |
65 | 7831fc5f | Michael Hanselmann | self.failIf(fcntl.fcntl(self.tmpfile.fileno(), fcntl.F_GETFL) & |
66 | 7831fc5f | Michael Hanselmann | os.O_NONBLOCK) |
67 | 7831fc5f | Michael Hanselmann | |
68 | 7831fc5f | Michael Hanselmann | |
69 | 7831fc5f | Michael Hanselmann | class TestIgnoreProcessNotFound(unittest.TestCase): |
70 | 7831fc5f | Michael Hanselmann | @staticmethod
|
71 | 7831fc5f | Michael Hanselmann | def _WritePid(fd): |
72 | 7831fc5f | Michael Hanselmann | os.write(fd, str(os.getpid()))
|
73 | 7831fc5f | Michael Hanselmann | os.close(fd) |
74 | 7831fc5f | Michael Hanselmann | return True |
75 | 7831fc5f | Michael Hanselmann | |
76 | 7831fc5f | Michael Hanselmann | def test(self): |
77 | 7831fc5f | Michael Hanselmann | (pid_read_fd, pid_write_fd) = os.pipe() |
78 | 7831fc5f | Michael Hanselmann | |
79 | 7831fc5f | Michael Hanselmann | # Start short-lived process which writes its PID to pipe
|
80 | 7831fc5f | Michael Hanselmann | self.assert_(utils.RunInSeparateProcess(self._WritePid, pid_write_fd)) |
81 | 7831fc5f | Michael Hanselmann | os.close(pid_write_fd) |
82 | 7831fc5f | Michael Hanselmann | |
83 | 7831fc5f | Michael Hanselmann | # Read PID from pipe
|
84 | 7831fc5f | Michael Hanselmann | pid = int(os.read(pid_read_fd, 1024)) |
85 | 7831fc5f | Michael Hanselmann | os.close(pid_read_fd) |
86 | 7831fc5f | Michael Hanselmann | |
87 | 7831fc5f | Michael Hanselmann | # Try to send signal to process which exited recently
|
88 | 7831fc5f | Michael Hanselmann | self.assertFalse(utils.IgnoreProcessNotFound(os.kill, pid, 0)) |
89 | 7831fc5f | Michael Hanselmann | |
90 | 7831fc5f | Michael Hanselmann | |
91 | 7831fc5f | Michael Hanselmann | class TestIgnoreSignals(unittest.TestCase): |
92 | 7831fc5f | Michael Hanselmann | """Test the IgnoreSignals decorator"""
|
93 | 7831fc5f | Michael Hanselmann | |
94 | 7831fc5f | Michael Hanselmann | @staticmethod
|
95 | 7831fc5f | Michael Hanselmann | def _Raise(exception): |
96 | 7831fc5f | Michael Hanselmann | raise exception
|
97 | 7831fc5f | Michael Hanselmann | |
98 | 7831fc5f | Michael Hanselmann | @staticmethod
|
99 | 7831fc5f | Michael Hanselmann | def _Return(rval): |
100 | 7831fc5f | Michael Hanselmann | return rval
|
101 | 7831fc5f | Michael Hanselmann | |
102 | 7831fc5f | Michael Hanselmann | def testIgnoreSignals(self): |
103 | 7831fc5f | Michael Hanselmann | sock_err_intr = socket.error(errno.EINTR, "Message")
|
104 | 7831fc5f | Michael Hanselmann | sock_err_inval = socket.error(errno.EINVAL, "Message")
|
105 | 7831fc5f | Michael Hanselmann | |
106 | 7831fc5f | Michael Hanselmann | env_err_intr = EnvironmentError(errno.EINTR, "Message") |
107 | 7831fc5f | Michael Hanselmann | env_err_inval = EnvironmentError(errno.EINVAL, "Message") |
108 | 7831fc5f | Michael Hanselmann | |
109 | 7831fc5f | Michael Hanselmann | self.assertRaises(socket.error, self._Raise, sock_err_intr) |
110 | 7831fc5f | Michael Hanselmann | self.assertRaises(socket.error, self._Raise, sock_err_inval) |
111 | 7831fc5f | Michael Hanselmann | self.assertRaises(EnvironmentError, self._Raise, env_err_intr) |
112 | 7831fc5f | Michael Hanselmann | self.assertRaises(EnvironmentError, self._Raise, env_err_inval) |
113 | 7831fc5f | Michael Hanselmann | |
114 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Raise, sock_err_intr), None) |
115 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Raise, env_err_intr), None) |
116 | 7831fc5f | Michael Hanselmann | self.assertRaises(socket.error, utils.IgnoreSignals, self._Raise, |
117 | 7831fc5f | Michael Hanselmann | sock_err_inval) |
118 | 7831fc5f | Michael Hanselmann | self.assertRaises(EnvironmentError, utils.IgnoreSignals, self._Raise, |
119 | 7831fc5f | Michael Hanselmann | env_err_inval) |
120 | 7831fc5f | Michael Hanselmann | |
121 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Return, True), True) |
122 | 7831fc5f | Michael Hanselmann | self.assertEquals(utils.IgnoreSignals(self._Return, 33), 33) |
123 | 7831fc5f | Michael Hanselmann | |
124 | 7831fc5f | Michael Hanselmann | |
125 | 7831fc5f | Michael Hanselmann | if __name__ == "__main__": |
126 | 7831fc5f | Michael Hanselmann | testutils.GanetiTestProgram() |