Statistics
| Branch: | Tag: | Revision:

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