• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#! /usr/bin/env python
2#
3# Copyright 2009 Google Inc. All Rights Reserved.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#      http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Tests for the fake_tempfile module."""
18
19#pylint: disable-all
20
21import stat
22import sys
23if sys.version_info < (2, 7):
24    import unittest2 as unittest
25else:
26    import unittest
27
28try:
29  import StringIO as io  # pylint: disable-msg=C6204
30except ImportError:
31  import io  # pylint: disable-msg=C6204
32
33import fake_filesystem
34import fake_tempfile
35
36
37class FakeLogging(object):
38  """Fake logging object for testGettempprefix."""
39
40  def __init__(self, test_case):
41    self._message = None
42    self._test_case = test_case
43
44  # pylint: disable-msg=C6409
45  def error(self, message):
46    if self._message is not None:
47      self.FailOnMessage(message)
48    self._message = message
49
50  def FailOnMessage(self, message):
51    self._test_case.fail('Unexpected message received: %s' % message)
52
53  warn = FailOnMessage
54  info = FailOnMessage
55  debug = FailOnMessage
56  fatal = FailOnMessage
57
58  def message(self):
59    return self._message
60
61
62class FakeTempfileModuleTest(unittest.TestCase):
63  """Test the 'tempfile' module mock."""
64
65  def setUp(self):
66    self.filesystem = fake_filesystem.FakeFilesystem(path_separator='/')
67    self.tempfile = fake_tempfile.FakeTempfileModule(self.filesystem)
68    self.orig_logging = fake_tempfile.logging
69    self.fake_logging = FakeLogging(self)
70    fake_tempfile.logging = self.fake_logging
71
72  def tearDown(self):
73    fake_tempfile.logging = self.orig_logging
74
75  def testTempFilename(self):
76    # pylint: disable-msg=C6002
77    # TODO: test that tempdir is init'ed
78    filename_a = self.tempfile._TempFilename()
79    # expect /tmp/tmp######
80    self.assertTrue(filename_a.startswith('/tmp/tmp'))
81    self.assertLess(len('/tmp/tmpA'), len(filename_a))
82
83    # see that random part changes
84    filename_b = self.tempfile._TempFilename()
85    self.assertTrue(filename_b.startswith('/tmp/tmp'))
86    self.assertLess(len('/tmp/tmpB'), len(filename_a))
87    self.assertNotEqual(filename_a, filename_b)
88
89  def testTempFilenameSuffix(self):
90    """test tempfile._TempFilename(suffix=)."""
91    filename = self.tempfile._TempFilename(suffix='.suffix')
92    self.assertTrue(filename.startswith('/tmp/tmp'))
93    self.assertTrue(filename.endswith('.suffix'))
94    self.assertLess(len('/tmp/tmpX.suffix'), len(filename))
95
96  def testTempFilenamePrefix(self):
97    """test tempfile._TempFilename(prefix=)."""
98    filename = self.tempfile._TempFilename(prefix='prefix.')
99    self.assertTrue(filename.startswith('/tmp/prefix.'))
100    self.assertLess(len('/tmp/prefix.X'), len(filename))
101
102  def testTempFilenameDir(self):
103    """test tempfile._TempFilename(dir=)."""
104    filename = self.tempfile._TempFilename(dir='/dir')
105    self.assertTrue(filename.startswith('/dir/tmp'))
106    self.assertLess(len('/dir/tmpX'), len(filename))
107
108  def testTemporaryFile(self):
109    obj = self.tempfile.TemporaryFile()
110    self.assertEqual('<fdopen>', obj.name)
111    self.assertTrue(isinstance(obj, io.StringIO))
112
113  def testNamedTemporaryFile(self):
114    obj = self.tempfile.NamedTemporaryFile()
115    created_filenames = self.tempfile.FakeReturnedMktempValues()
116    self.assertEqual(created_filenames[0], obj.name)
117    self.assertTrue(self.filesystem.GetObject(obj.name))
118    obj.close()
119    self.assertRaises(IOError, self.filesystem.GetObject, obj.name)
120
121  def testNamedTemporaryFileNoDelete(self):
122    obj = self.tempfile.NamedTemporaryFile(delete=False)
123    obj.write(b'foo')
124    obj.close()
125    file_obj = self.filesystem.GetObject(obj.name)
126    self.assertEqual('foo', file_obj.contents)
127    obj = self.tempfile.NamedTemporaryFile(mode='w', delete=False)
128    obj.write('foo')
129    obj.close()
130    file_obj = self.filesystem.GetObject(obj.name)
131    self.assertEqual('foo', file_obj.contents)
132
133  def testMkstemp(self):
134    next_fd = len(self.filesystem.open_files)
135    temporary = self.tempfile.mkstemp()
136    self.assertEqual(2, len(temporary))
137    self.assertTrue(temporary[1].startswith('/tmp/tmp'))
138    created_filenames = self.tempfile.FakeReturnedMktempValues()
139    self.assertEqual(next_fd, temporary[0])
140    self.assertEqual(temporary[1], created_filenames[0])
141    self.assertTrue(self.filesystem.Exists(temporary[1]))
142    self.assertEqual(self.filesystem.GetObject(temporary[1]).st_mode,
143                     stat.S_IFREG|0o600)
144
145  def testMkstempDir(self):
146    """test tempfile.mkstemp(dir=)."""
147    # expect fail: /dir does not exist
148    self.assertRaises(OSError, self.tempfile.mkstemp, dir='/dir')
149    # expect pass: /dir exists
150    self.filesystem.CreateDirectory('/dir')
151    next_fd = len(self.filesystem.open_files)
152    temporary = self.tempfile.mkstemp(dir='/dir')
153    self.assertEqual(2, len(temporary))
154    self.assertEqual(next_fd, temporary[0])
155    self.assertTrue(temporary[1].startswith('/dir/tmp'))
156    created_filenames = self.tempfile.FakeReturnedMktempValues()
157    self.assertEqual(temporary[1], created_filenames[0])
158    self.assertTrue(self.filesystem.Exists(temporary[1]))
159    self.assertEqual(self.filesystem.GetObject(temporary[1]).st_mode,
160                     stat.S_IFREG|0o600)
161    # pylint: disable-msg=C6002
162    # TODO: add a test that /dir is actually writable.
163
164  def testMkdtemp(self):
165    dirname = self.tempfile.mkdtemp()
166    self.assertTrue(dirname)
167    created_filenames = self.tempfile.FakeReturnedMktempValues()
168    self.assertEqual(dirname, created_filenames[0])
169    self.assertTrue(self.filesystem.Exists(dirname))
170    self.assertEqual(self.filesystem.GetObject(dirname).st_mode,
171                     stat.S_IFDIR|0o700)
172
173  def testGettempdir(self):
174    self.assertEqual(None, self.tempfile.tempdir)
175    self.assertEqual('/tmp', self.tempfile.gettempdir())
176    self.assertEqual('/tmp', self.tempfile.tempdir)
177
178  def testGettempprefix(self):
179    """test tempfile.gettempprefix() and the tempfile.template setter."""
180    self.assertEqual('tmp', self.tempfile.gettempprefix())
181    # set and verify
182    self.tempfile.template = 'strung'
183    self.assertEqual('strung', self.tempfile.gettempprefix())
184    self.assertEqual('tempfile.template= is a NOP in python2.4',
185                     self.fake_logging.message())
186
187  def testMktemp(self):
188    self.assertRaises(NotImplementedError, self.tempfile.mktemp)
189
190  def testTemplateGet(self):
191    """verify tempfile.template still unimplemented."""
192    self.assertRaises(NotImplementedError, getattr,
193                      self.tempfile, 'template')
194
195
196if __name__ == '__main__':
197  unittest.main()
198