Home | History | Annotate | Download | only in pyfakefs
      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 
     21 import stat
     22 import sys
     23 if sys.version_info < (2, 7):
     24     import unittest2 as unittest
     25 else:
     26     import unittest
     27 
     28 try:
     29   import StringIO as io  # pylint: disable-msg=C6204
     30 except ImportError:
     31   import io  # pylint: disable-msg=C6204
     32 
     33 import fake_filesystem
     34 import fake_tempfile
     35 
     36 
     37 class 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 
     62 class 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 
    196 if __name__ == '__main__':
    197   unittest.main()
    198