Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.utils.wrapper_unittest.py @ 7352d33b

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