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