Statistics
| Branch: | Tag: | Revision:

root / test / tempfile_fork_unittest.py @ 035b33e2

History | View | Annotate | Download (3.4 kB)

1 055f822b Michael Hanselmann
#!/usr/bin/python
2 055f822b Michael Hanselmann
#
3 055f822b Michael Hanselmann
4 035b33e2 Iustin Pop
# Copyright (C) 2010, 2012 Google Inc.
5 055f822b Michael Hanselmann
#
6 055f822b Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 055f822b Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 055f822b Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 055f822b Michael Hanselmann
# (at your option) any later version.
10 055f822b Michael Hanselmann
#
11 055f822b Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 055f822b Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 055f822b Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 055f822b Michael Hanselmann
# General Public License for more details.
15 055f822b Michael Hanselmann
#
16 055f822b Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 055f822b Michael Hanselmann
# along with this program; if not, write to the Free Software
18 055f822b Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 055f822b Michael Hanselmann
# 02110-1301, USA.
20 055f822b Michael Hanselmann
21 055f822b Michael Hanselmann
22 055f822b Michael Hanselmann
"""Script for testing utils.ResetTempfileModule"""
23 055f822b Michael Hanselmann
24 055f822b Michael Hanselmann
import os
25 055f822b Michael Hanselmann
import sys
26 055f822b Michael Hanselmann
import errno
27 055f822b Michael Hanselmann
import shutil
28 055f822b Michael Hanselmann
import tempfile
29 055f822b Michael Hanselmann
import unittest
30 055f822b Michael Hanselmann
import logging
31 055f822b Michael Hanselmann
32 055f822b Michael Hanselmann
from ganeti import utils
33 055f822b Michael Hanselmann
34 055f822b Michael Hanselmann
import testutils
35 055f822b Michael Hanselmann
36 055f822b Michael Hanselmann
37 055f822b Michael Hanselmann
# This constant is usually at a much higher value. Setting it lower for test
38 055f822b Michael Hanselmann
# purposes.
39 055f822b Michael Hanselmann
tempfile.TMP_MAX = 3
40 055f822b Michael Hanselmann
41 055f822b Michael Hanselmann
42 055f822b Michael Hanselmann
class TestResetTempfileModule(unittest.TestCase):
43 055f822b Michael Hanselmann
  def setUp(self):
44 055f822b Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
45 055f822b Michael Hanselmann
46 055f822b Michael Hanselmann
  def tearDown(self):
47 055f822b Michael Hanselmann
    shutil.rmtree(self.tmpdir)
48 055f822b Michael Hanselmann
49 055f822b Michael Hanselmann
  def testNoReset(self):
50 035b33e2 Iustin Pop
    if ((sys.hexversion >= 0x020703F0 and sys.hexversion < 0x03000000) or
51 035b33e2 Iustin Pop
        sys.hexversion >=0x030203F0):
52 035b33e2 Iustin Pop
      # We can't test the no_reset case on Python 2.7+
53 035b33e2 Iustin Pop
      return
54 035b33e2 Iustin Pop
    # evil Debian sid...
55 035b33e2 Iustin Pop
    if (hasattr(tempfile._RandomNameSequence, "rng") and
56 035b33e2 Iustin Pop
        type(tempfile._RandomNameSequence.rng) == property):
57 035b33e2 Iustin Pop
      return
58 055f822b Michael Hanselmann
    self._Test(False)
59 055f822b Michael Hanselmann
60 055f822b Michael Hanselmann
  def testReset(self):
61 055f822b Michael Hanselmann
    self._Test(True)
62 055f822b Michael Hanselmann
63 055f822b Michael Hanselmann
  def _Test(self, reset):
64 055f822b Michael Hanselmann
    self.failIf(tempfile.TMP_MAX > 10)
65 055f822b Michael Hanselmann
66 055f822b Michael Hanselmann
    # Initialize tempfile module
67 055f822b Michael Hanselmann
    (fd, _) = tempfile.mkstemp(dir=self.tmpdir, prefix="init.", suffix="")
68 055f822b Michael Hanselmann
    os.close(fd)
69 055f822b Michael Hanselmann
70 055f822b Michael Hanselmann
    (notify_read, notify_write) = os.pipe()
71 055f822b Michael Hanselmann
72 055f822b Michael Hanselmann
    pid = os.fork()
73 055f822b Michael Hanselmann
    if pid == 0:
74 055f822b Michael Hanselmann
      # Child
75 055f822b Michael Hanselmann
      try:
76 055f822b Michael Hanselmann
        try:
77 055f822b Michael Hanselmann
          if reset:
78 055f822b Michael Hanselmann
            utils.ResetTempfileModule()
79 055f822b Michael Hanselmann
80 055f822b Michael Hanselmann
          os.close(notify_write)
81 055f822b Michael Hanselmann
82 055f822b Michael Hanselmann
          # Wait for parent to close pipe
83 055f822b Michael Hanselmann
          os.read(notify_read, 1)
84 055f822b Michael Hanselmann
85 055f822b Michael Hanselmann
          try:
86 055f822b Michael Hanselmann
            # This is a short-lived process, not caring about closing file
87 055f822b Michael Hanselmann
            # descriptors
88 055f822b Michael Hanselmann
            (_, path) = tempfile.mkstemp(dir=self.tmpdir,
89 055f822b Michael Hanselmann
                                         prefix="test.", suffix="")
90 055f822b Michael Hanselmann
          except EnvironmentError, err:
91 055f822b Michael Hanselmann
            if err.errno == errno.EEXIST:
92 055f822b Michael Hanselmann
              # Couldnt' create temporary file (e.g. because we run out of
93 055f822b Michael Hanselmann
              # retries)
94 055f822b Michael Hanselmann
              os._exit(2)
95 055f822b Michael Hanselmann
            raise
96 055f822b Michael Hanselmann
97 055f822b Michael Hanselmann
          logging.debug("Child created %s", path)
98 055f822b Michael Hanselmann
99 055f822b Michael Hanselmann
          os._exit(0)
100 055f822b Michael Hanselmann
        except Exception:
101 055f822b Michael Hanselmann
          logging.exception("Unhandled error")
102 055f822b Michael Hanselmann
      finally:
103 055f822b Michael Hanselmann
        os._exit(1)
104 055f822b Michael Hanselmann
105 055f822b Michael Hanselmann
    # Parent
106 055f822b Michael Hanselmann
    os.close(notify_read)
107 055f822b Michael Hanselmann
108 055f822b Michael Hanselmann
    # Create parent's temporary files
109 055f822b Michael Hanselmann
    for _ in range(tempfile.TMP_MAX):
110 055f822b Michael Hanselmann
      (fd, path) = tempfile.mkstemp(dir=self.tmpdir,
111 055f822b Michael Hanselmann
                                    prefix="test.", suffix="")
112 055f822b Michael Hanselmann
      os.close(fd)
113 055f822b Michael Hanselmann
      logging.debug("Parent created %s", path)
114 055f822b Michael Hanselmann
115 055f822b Michael Hanselmann
    # Notify child by closing pipe
116 055f822b Michael Hanselmann
    os.close(notify_write)
117 055f822b Michael Hanselmann
118 055f822b Michael Hanselmann
    (_, status) = os.waitpid(pid, 0)
119 055f822b Michael Hanselmann
120 055f822b Michael Hanselmann
    self.failIf(os.WIFSIGNALED(status))
121 055f822b Michael Hanselmann
122 055f822b Michael Hanselmann
    if reset:
123 055f822b Michael Hanselmann
      # If the tempfile module was reset, it should not fail to create
124 055f822b Michael Hanselmann
      # temporary files
125 055f822b Michael Hanselmann
      expected = 0
126 055f822b Michael Hanselmann
    else:
127 055f822b Michael Hanselmann
      expected = 2
128 055f822b Michael Hanselmann
129 055f822b Michael Hanselmann
    self.assertEqual(os.WEXITSTATUS(status), expected)
130 055f822b Michael Hanselmann
131 055f822b Michael Hanselmann
132 055f822b Michael Hanselmann
if __name__ == "__main__":
133 055f822b Michael Hanselmann
  testutils.GanetiTestProgram()