blob: caa8f4e734d8a6d6536f8ebb308e5996d468fafe [file] [log] [blame]
Guido van Rossum0e548712002-08-09 16:14:33 +00001# tempfile.py unit tests.
Tim Petersc57a2852001-10-29 21:46:08 +00002
3import tempfile
Guido van Rossum0e548712002-08-09 16:14:33 +00004import os
5import sys
6import re
7import errno
8import warnings
Tim Petersc57a2852001-10-29 21:46:08 +00009
Guido van Rossum0e548712002-08-09 16:14:33 +000010import unittest
11from test import test_support
12
Fred Drake7633d232002-10-17 22:09:03 +000013warnings.filterwarnings("ignore",
14 category=RuntimeWarning,
15 message="mktemp", module=__name__)
16
Guido van Rossum0e548712002-08-09 16:14:33 +000017if hasattr(os, 'stat'):
18 import stat
19 has_stat = 1
20else:
21 has_stat = 0
22
23has_textmode = (tempfile._text_openflags != tempfile._bin_openflags)
Guido van Rossum78741062002-08-17 11:41:01 +000024has_spawnl = hasattr(os, 'spawnl')
Guido van Rossum0e548712002-08-09 16:14:33 +000025
Neal Norwitz68ee0122002-08-16 19:28:59 +000026# TEST_FILES may need to be tweaked for systems depending on the maximum
27# number of files that can be opened at one time (see ulimit -n)
Jack Jansence921472003-01-08 16:30:34 +000028if sys.platform == 'mac':
29 TEST_FILES = 32
Thomas Wouters89f507f2006-12-13 04:49:30 +000030elif sys.platform in ('openbsd3', 'openbsd4'):
Martin v. Löwis99968282004-09-15 06:02:54 +000031 TEST_FILES = 48
Jack Jansence921472003-01-08 16:30:34 +000032else:
33 TEST_FILES = 100
Neal Norwitz68ee0122002-08-16 19:28:59 +000034
Guido van Rossum0e548712002-08-09 16:14:33 +000035# This is organized as one test for each chunk of code in tempfile.py,
36# in order of their appearance in the file. Testing which requires
37# threads is not done here.
38
39# Common functionality.
40class TC(unittest.TestCase):
41
42 str_check = re.compile(r"[a-zA-Z0-9_-]{6}$")
43
44 def failOnException(self, what, ei=None):
45 if ei is None:
46 ei = sys.exc_info()
47 self.fail("%s raised %s: %s" % (what, ei[0], ei[1]))
48
49 def nameCheck(self, name, dir, pre, suf):
50 (ndir, nbase) = os.path.split(name)
51 npre = nbase[:len(pre)]
52 nsuf = nbase[len(nbase)-len(suf):]
53
Martin v. Löwisd6625482003-10-12 17:37:01 +000054 # check for equality of the absolute paths!
55 self.assertEqual(os.path.abspath(ndir), os.path.abspath(dir),
Guido van Rossum0e548712002-08-09 16:14:33 +000056 "file '%s' not in directory '%s'" % (name, dir))
57 self.assertEqual(npre, pre,
58 "file '%s' does not begin with '%s'" % (nbase, pre))
59 self.assertEqual(nsuf, suf,
60 "file '%s' does not end with '%s'" % (nbase, suf))
61
62 nbase = nbase[len(pre):len(nbase)-len(suf)]
63 self.assert_(self.str_check.match(nbase),
64 "random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/"
65 % nbase)
66
67test_classes = []
68
69class test_exports(TC):
70 def test_exports(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +000071 # There are no surprising symbols in the tempfile module
Guido van Rossum0e548712002-08-09 16:14:33 +000072 dict = tempfile.__dict__
73
74 expected = {
75 "NamedTemporaryFile" : 1,
76 "TemporaryFile" : 1,
77 "mkstemp" : 1,
78 "mkdtemp" : 1,
79 "mktemp" : 1,
80 "TMP_MAX" : 1,
81 "gettempprefix" : 1,
82 "gettempdir" : 1,
83 "tempdir" : 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +000084 "template" : 1,
85 "SpooledTemporaryFile" : 1
Guido van Rossum0e548712002-08-09 16:14:33 +000086 }
87
88 unexp = []
89 for key in dict:
90 if key[0] != '_' and key not in expected:
91 unexp.append(key)
92 self.failUnless(len(unexp) == 0,
93 "unexpected keys: %s" % unexp)
94
95test_classes.append(test_exports)
96
97
Guido van Rossum0e548712002-08-09 16:14:33 +000098class test__RandomNameSequence(TC):
99 """Test the internal iterator object _RandomNameSequence."""
100
101 def setUp(self):
102 self.r = tempfile._RandomNameSequence()
103
104 def test_get_six_char_str(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000105 # _RandomNameSequence returns a six-character string
Georg Brandla18af4e2007-04-21 15:47:16 +0000106 s = next(self.r)
Guido van Rossum0e548712002-08-09 16:14:33 +0000107 self.nameCheck(s, '', '', '')
108
109 def test_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000110 # _RandomNameSequence returns no duplicate strings (stochastic)
Guido van Rossum0e548712002-08-09 16:14:33 +0000111
112 dict = {}
113 r = self.r
Guido van Rossum805365e2007-05-07 22:24:25 +0000114 for i in range(TEST_FILES):
Georg Brandla18af4e2007-04-21 15:47:16 +0000115 s = next(r)
Guido van Rossum0e548712002-08-09 16:14:33 +0000116 self.nameCheck(s, '', '', '')
117 self.failIf(s in dict)
118 dict[s] = 1
119
120 def test_supports_iter(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000121 # _RandomNameSequence supports the iterator protocol
Guido van Rossum0e548712002-08-09 16:14:33 +0000122
123 i = 0
124 r = self.r
125 try:
126 for s in r:
127 i += 1
128 if i == 20:
129 break
130 except:
131 failOnException("iteration")
132
133test_classes.append(test__RandomNameSequence)
134
135
136class test__candidate_tempdir_list(TC):
137 """Test the internal function _candidate_tempdir_list."""
138
139 def test_nonempty_list(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000140 # _candidate_tempdir_list returns a nonempty list of strings
Guido van Rossum0e548712002-08-09 16:14:33 +0000141
142 cand = tempfile._candidate_tempdir_list()
143
144 self.failIf(len(cand) == 0)
145 for c in cand:
146 self.assert_(isinstance(c, basestring),
147 "%s is not a string" % c)
148
149 def test_wanted_dirs(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000150 # _candidate_tempdir_list contains the expected directories
Guido van Rossum0e548712002-08-09 16:14:33 +0000151
152 # Make sure the interesting environment variables are all set.
153 added = []
154 try:
155 for envname in 'TMPDIR', 'TEMP', 'TMP':
156 dirname = os.getenv(envname)
157 if not dirname:
158 os.environ[envname] = os.path.abspath(envname)
159 added.append(envname)
160
161 cand = tempfile._candidate_tempdir_list()
162
163 for envname in 'TMPDIR', 'TEMP', 'TMP':
164 dirname = os.getenv(envname)
165 if not dirname: raise ValueError
166 self.assert_(dirname in cand)
167
168 try:
169 dirname = os.getcwd()
170 except (AttributeError, os.error):
171 dirname = os.curdir
172
173 self.assert_(dirname in cand)
174
175 # Not practical to try to verify the presence of OS-specific
176 # paths in this list.
177 finally:
178 for p in added:
179 del os.environ[p]
180
181test_classes.append(test__candidate_tempdir_list)
182
183
184# We test _get_default_tempdir by testing gettempdir.
185
186
187class test__get_candidate_names(TC):
188 """Test the internal function _get_candidate_names."""
189
190 def test_retval(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000191 # _get_candidate_names returns a _RandomNameSequence object
Guido van Rossum0e548712002-08-09 16:14:33 +0000192 obj = tempfile._get_candidate_names()
193 self.assert_(isinstance(obj, tempfile._RandomNameSequence))
194
195 def test_same_thing(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000196 # _get_candidate_names always returns the same object
Guido van Rossum0e548712002-08-09 16:14:33 +0000197 a = tempfile._get_candidate_names()
198 b = tempfile._get_candidate_names()
199
200 self.assert_(a is b)
201
202test_classes.append(test__get_candidate_names)
203
204
205class test__mkstemp_inner(TC):
206 """Test the internal function _mkstemp_inner."""
207
208 class mkstemped:
209 _bflags = tempfile._bin_openflags
210 _tflags = tempfile._text_openflags
211 _close = os.close
212 _unlink = os.unlink
213
214 def __init__(self, dir, pre, suf, bin):
215 if bin: flags = self._bflags
216 else: flags = self._tflags
217
218 (self.fd, self.name) = tempfile._mkstemp_inner(dir, pre, suf, flags)
219
220 def write(self, str):
221 os.write(self.fd, str)
222
223 def __del__(self):
224 self._close(self.fd)
225 self._unlink(self.name)
Tim Petersa0d55de2002-08-09 18:01:01 +0000226
Guido van Rossum0e548712002-08-09 16:14:33 +0000227 def do_create(self, dir=None, pre="", suf="", bin=1):
228 if dir is None:
229 dir = tempfile.gettempdir()
230 try:
231 file = self.mkstemped(dir, pre, suf, bin)
232 except:
233 self.failOnException("_mkstemp_inner")
234
235 self.nameCheck(file.name, dir, pre, suf)
236 return file
237
238 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000239 # _mkstemp_inner can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000240 self.do_create().write("blat")
241 self.do_create(pre="a").write("blat")
242 self.do_create(suf="b").write("blat")
243 self.do_create(pre="a", suf="b").write("blat")
244 self.do_create(pre="aa", suf=".txt").write("blat")
245
246 def test_basic_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000247 # _mkstemp_inner can create many files (stochastic)
Guido van Rossum805365e2007-05-07 22:24:25 +0000248 extant = list(range(TEST_FILES))
Guido van Rossum0e548712002-08-09 16:14:33 +0000249 for i in extant:
250 extant[i] = self.do_create(pre="aa")
251
252 def test_choose_directory(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000253 # _mkstemp_inner can create files in a user-selected directory
Guido van Rossum0e548712002-08-09 16:14:33 +0000254 dir = tempfile.mkdtemp()
255 try:
256 self.do_create(dir=dir).write("blat")
257 finally:
258 os.rmdir(dir)
259
260 def test_file_mode(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000261 # _mkstemp_inner creates files with the proper mode
Guido van Rossum0e548712002-08-09 16:14:33 +0000262 if not has_stat:
263 return # ugh, can't use TestSkipped.
264
265 file = self.do_create()
266 mode = stat.S_IMODE(os.stat(file.name).st_mode)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000267 expected = 0o600
Jack Jansence921472003-01-08 16:30:34 +0000268 if sys.platform in ('win32', 'os2emx', 'mac'):
Tim Petersca3ac7f2002-08-09 18:13:51 +0000269 # There's no distinction among 'user', 'group' and 'world';
270 # replicate the 'user' bits.
271 user = expected >> 6
272 expected = user * (1 + 8 + 64)
273 self.assertEqual(mode, expected)
Guido van Rossum0e548712002-08-09 16:14:33 +0000274
275 def test_noinherit(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000276 # _mkstemp_inner file handles are not inherited by child processes
Guido van Rossum78741062002-08-17 11:41:01 +0000277 if not has_spawnl:
Guido van Rossum0e548712002-08-09 16:14:33 +0000278 return # ugh, can't use TestSkipped.
279
Guido van Rossum78741062002-08-17 11:41:01 +0000280 if test_support.verbose:
281 v="v"
282 else:
283 v="q"
284
Guido van Rossum0e548712002-08-09 16:14:33 +0000285 file = self.do_create()
Guido van Rossum78741062002-08-17 11:41:01 +0000286 fd = "%d" % file.fd
287
288 try:
289 me = __file__
290 except NameError:
291 me = sys.argv[0]
Guido van Rossum0e548712002-08-09 16:14:33 +0000292
293 # We have to exec something, so that FD_CLOEXEC will take
Guido van Rossum78741062002-08-17 11:41:01 +0000294 # effect. The core of this test is therefore in
295 # tf_inherit_check.py, which see.
296 tester = os.path.join(os.path.dirname(os.path.abspath(me)),
297 "tf_inherit_check.py")
Guido van Rossum0e548712002-08-09 16:14:33 +0000298
Martin v. Löwisd4210bc2003-10-23 15:55:28 +0000299 # On Windows a spawn* /path/ with embedded spaces shouldn't be quoted,
300 # but an arg with embedded spaces should be decorated with double
301 # quotes on each end
302 if sys.platform in ('win32'):
303 decorated = '"%s"' % sys.executable
304 tester = '"%s"' % tester
305 else:
306 decorated = sys.executable
307
308 retval = os.spawnl(os.P_WAIT, sys.executable, decorated, tester, v, fd)
Guido van Rossum78741062002-08-17 11:41:01 +0000309 self.failIf(retval < 0,
310 "child process caught fatal signal %d" % -retval)
Michael W. Hudsona1fb4c82005-02-15 15:22:37 +0000311 self.failIf(retval > 0, "child process reports failure %d"%retval)
Guido van Rossum0e548712002-08-09 16:14:33 +0000312
313 def test_textmode(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000314 # _mkstemp_inner can create files in text mode
Guido van Rossum0e548712002-08-09 16:14:33 +0000315 if not has_textmode:
316 return # ugh, can't use TestSkipped.
317
318 self.do_create(bin=0).write("blat\n")
319 # XXX should test that the file really is a text file
320
321test_classes.append(test__mkstemp_inner)
322
323
324class test_gettempprefix(TC):
325 """Test gettempprefix()."""
326
327 def test_sane_template(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000328 # gettempprefix returns a nonempty prefix string
Guido van Rossum0e548712002-08-09 16:14:33 +0000329 p = tempfile.gettempprefix()
330
331 self.assert_(isinstance(p, basestring))
332 self.assert_(len(p) > 0)
333
334 def test_usable_template(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000335 # gettempprefix returns a usable prefix string
Guido van Rossum0e548712002-08-09 16:14:33 +0000336
337 # Create a temp directory, avoiding use of the prefix.
338 # Then attempt to create a file whose name is
339 # prefix + 'xxxxxx.xxx' in that directory.
340 p = tempfile.gettempprefix() + "xxxxxx.xxx"
341 d = tempfile.mkdtemp(prefix="")
342 try:
343 p = os.path.join(d, p)
344 try:
345 fd = os.open(p, os.O_RDWR | os.O_CREAT)
346 except:
347 self.failOnException("os.open")
348 os.close(fd)
349 os.unlink(p)
350 finally:
351 os.rmdir(d)
352
353test_classes.append(test_gettempprefix)
354
355
356class test_gettempdir(TC):
357 """Test gettempdir()."""
358
359 def test_directory_exists(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000360 # gettempdir returns a directory which exists
Guido van Rossum0e548712002-08-09 16:14:33 +0000361
362 dir = tempfile.gettempdir()
363 self.assert_(os.path.isabs(dir) or dir == os.curdir,
364 "%s is not an absolute path" % dir)
365 self.assert_(os.path.isdir(dir),
366 "%s is not a directory" % dir)
367
368 def test_directory_writable(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000369 # gettempdir returns a directory writable by the user
Guido van Rossum0e548712002-08-09 16:14:33 +0000370
371 # sneaky: just instantiate a NamedTemporaryFile, which
372 # defaults to writing into the directory returned by
373 # gettempdir.
374 try:
375 file = tempfile.NamedTemporaryFile()
376 file.write("blat")
377 file.close()
378 except:
379 self.failOnException("create file in %s" % tempfile.gettempdir())
380
381 def test_same_thing(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000382 # gettempdir always returns the same object
Guido van Rossum0e548712002-08-09 16:14:33 +0000383 a = tempfile.gettempdir()
384 b = tempfile.gettempdir()
385
386 self.assert_(a is b)
387
388test_classes.append(test_gettempdir)
389
390
391class test_mkstemp(TC):
392 """Test mkstemp()."""
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000393
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000394 def do_create(self, dir=None, pre="", suf=""):
Guido van Rossum0e548712002-08-09 16:14:33 +0000395 if dir is None:
396 dir = tempfile.gettempdir()
397 try:
398 (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000399 (ndir, nbase) = os.path.split(name)
400 adir = os.path.abspath(dir)
401 self.assertEqual(adir, ndir,
402 "Directory '%s' incorrectly returned as '%s'" % (adir, ndir))
Guido van Rossum0e548712002-08-09 16:14:33 +0000403 except:
404 self.failOnException("mkstemp")
405
406 try:
407 self.nameCheck(name, dir, pre, suf)
408 finally:
409 os.close(fd)
410 os.unlink(name)
411
412 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000413 # mkstemp can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000414 self.do_create()
415 self.do_create(pre="a")
416 self.do_create(suf="b")
417 self.do_create(pre="a", suf="b")
418 self.do_create(pre="aa", suf=".txt")
Martin v. Löwisd6625482003-10-12 17:37:01 +0000419 self.do_create(dir=".")
Guido van Rossum0e548712002-08-09 16:14:33 +0000420
421 def test_choose_directory(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000422 # mkstemp can create directories in a user-selected directory
Guido van Rossum0e548712002-08-09 16:14:33 +0000423 dir = tempfile.mkdtemp()
424 try:
425 self.do_create(dir=dir)
426 finally:
427 os.rmdir(dir)
428
429test_classes.append(test_mkstemp)
430
431
432class test_mkdtemp(TC):
433 """Test mkdtemp()."""
434
435 def do_create(self, dir=None, pre="", suf=""):
436 if dir is None:
437 dir = tempfile.gettempdir()
438 try:
439 name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)
440 except:
441 self.failOnException("mkdtemp")
442
443 try:
444 self.nameCheck(name, dir, pre, suf)
445 return name
446 except:
447 os.rmdir(name)
448 raise
449
450 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000451 # mkdtemp can create directories
Guido van Rossum0e548712002-08-09 16:14:33 +0000452 os.rmdir(self.do_create())
453 os.rmdir(self.do_create(pre="a"))
454 os.rmdir(self.do_create(suf="b"))
455 os.rmdir(self.do_create(pre="a", suf="b"))
456 os.rmdir(self.do_create(pre="aa", suf=".txt"))
Tim Petersa0d55de2002-08-09 18:01:01 +0000457
Guido van Rossum0e548712002-08-09 16:14:33 +0000458 def test_basic_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000459 # mkdtemp can create many directories (stochastic)
Guido van Rossum805365e2007-05-07 22:24:25 +0000460 extant = list(range(TEST_FILES))
Guido van Rossum0e548712002-08-09 16:14:33 +0000461 try:
462 for i in extant:
463 extant[i] = self.do_create(pre="aa")
464 finally:
465 for i in extant:
466 if(isinstance(i, basestring)):
467 os.rmdir(i)
468
469 def test_choose_directory(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000470 # mkdtemp can create directories in a user-selected directory
Guido van Rossum0e548712002-08-09 16:14:33 +0000471 dir = tempfile.mkdtemp()
472 try:
473 os.rmdir(self.do_create(dir=dir))
474 finally:
475 os.rmdir(dir)
476
477 def test_mode(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000478 # mkdtemp creates directories with the proper mode
Guido van Rossum0e548712002-08-09 16:14:33 +0000479 if not has_stat:
480 return # ugh, can't use TestSkipped.
481
482 dir = self.do_create()
483 try:
484 mode = stat.S_IMODE(os.stat(dir).st_mode)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000485 mode &= 0o777 # Mask off sticky bits inherited from /tmp
486 expected = 0o700
Jack Jansence921472003-01-08 16:30:34 +0000487 if sys.platform in ('win32', 'os2emx', 'mac'):
Tim Petersca3ac7f2002-08-09 18:13:51 +0000488 # There's no distinction among 'user', 'group' and 'world';
489 # replicate the 'user' bits.
490 user = expected >> 6
491 expected = user * (1 + 8 + 64)
492 self.assertEqual(mode, expected)
Guido van Rossum0e548712002-08-09 16:14:33 +0000493 finally:
494 os.rmdir(dir)
495
496test_classes.append(test_mkdtemp)
497
498
499class test_mktemp(TC):
500 """Test mktemp()."""
501
502 # For safety, all use of mktemp must occur in a private directory.
503 # We must also suppress the RuntimeWarning it generates.
504 def setUp(self):
505 self.dir = tempfile.mkdtemp()
Guido van Rossum0e548712002-08-09 16:14:33 +0000506
507 def tearDown(self):
508 if self.dir:
509 os.rmdir(self.dir)
510 self.dir = None
Guido van Rossum0e548712002-08-09 16:14:33 +0000511
512 class mktemped:
513 _unlink = os.unlink
514 _bflags = tempfile._bin_openflags
515
516 def __init__(self, dir, pre, suf):
517 self.name = tempfile.mktemp(dir=dir, prefix=pre, suffix=suf)
518 # Create the file. This will raise an exception if it's
519 # mysteriously appeared in the meanwhile.
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000520 os.close(os.open(self.name, self._bflags, 0o600))
Guido van Rossum0e548712002-08-09 16:14:33 +0000521
522 def __del__(self):
523 self._unlink(self.name)
524
525 def do_create(self, pre="", suf=""):
526 try:
527 file = self.mktemped(self.dir, pre, suf)
528 except:
529 self.failOnException("mktemp")
530
531 self.nameCheck(file.name, self.dir, pre, suf)
532 return file
533
534 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000535 # mktemp can choose usable file names
Guido van Rossum0e548712002-08-09 16:14:33 +0000536 self.do_create()
537 self.do_create(pre="a")
538 self.do_create(suf="b")
539 self.do_create(pre="a", suf="b")
540 self.do_create(pre="aa", suf=".txt")
541
542 def test_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000543 # mktemp can choose many usable file names (stochastic)
Guido van Rossum805365e2007-05-07 22:24:25 +0000544 extant = list(range(TEST_FILES))
Guido van Rossum0e548712002-08-09 16:14:33 +0000545 for i in extant:
546 extant[i] = self.do_create(pre="aa")
547
Fred Drake8bec4832002-11-22 20:13:43 +0000548## def test_warning(self):
549## # mktemp issues a warning when used
550## warnings.filterwarnings("error",
551## category=RuntimeWarning,
552## message="mktemp")
553## self.assertRaises(RuntimeWarning,
554## tempfile.mktemp, dir=self.dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000555
556test_classes.append(test_mktemp)
557
558
559# We test _TemporaryFileWrapper by testing NamedTemporaryFile.
560
561
562class test_NamedTemporaryFile(TC):
563 """Test NamedTemporaryFile()."""
564
Guido van Rossumd8faa362007-04-27 19:54:29 +0000565 def do_create(self, dir=None, pre="", suf="", delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000566 if dir is None:
567 dir = tempfile.gettempdir()
568 try:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000569 file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,
570 delete=delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000571 except:
572 self.failOnException("NamedTemporaryFile")
573
574 self.nameCheck(file.name, dir, pre, suf)
575 return file
576
577
578 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000579 # NamedTemporaryFile can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000580 self.do_create()
581 self.do_create(pre="a")
582 self.do_create(suf="b")
583 self.do_create(pre="a", suf="b")
584 self.do_create(pre="aa", suf=".txt")
585
586 def test_creates_named(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000587 # NamedTemporaryFile creates files with names
Guido van Rossum0e548712002-08-09 16:14:33 +0000588 f = tempfile.NamedTemporaryFile()
589 self.failUnless(os.path.exists(f.name),
590 "NamedTemporaryFile %s does not exist" % f.name)
591
592 def test_del_on_close(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000593 # A NamedTemporaryFile is deleted when closed
Guido van Rossum0e548712002-08-09 16:14:33 +0000594 dir = tempfile.mkdtemp()
595 try:
596 f = tempfile.NamedTemporaryFile(dir=dir)
597 f.write('blat')
598 f.close()
599 self.failIf(os.path.exists(f.name),
600 "NamedTemporaryFile %s exists after close" % f.name)
601 finally:
602 os.rmdir(dir)
603
Guido van Rossumd8faa362007-04-27 19:54:29 +0000604 def test_dis_del_on_close(self):
605 # Tests that delete-on-close can be disabled
606 dir = tempfile.mkdtemp()
607 tmp = None
608 try:
609 f = tempfile.NamedTemporaryFile(dir=dir, delete=False)
610 tmp = f.name
611 f.write('blat')
612 f.close()
613 self.failUnless(os.path.exists(f.name),
614 "NamedTemporaryFile %s missing after close" % f.name)
615 finally:
616 if tmp is not None:
617 os.unlink(tmp)
618 os.rmdir(dir)
619
Guido van Rossum0e548712002-08-09 16:14:33 +0000620 def test_multiple_close(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000621 # A NamedTemporaryFile can be closed many times without error
Guido van Rossum0e548712002-08-09 16:14:33 +0000622
623 f = tempfile.NamedTemporaryFile()
624 f.write('abc\n')
625 f.close()
626 try:
627 f.close()
628 f.close()
629 except:
630 self.failOnException("close")
631
632 # How to test the mode and bufsize parameters?
633
634test_classes.append(test_NamedTemporaryFile)
635
Guido van Rossumd8faa362007-04-27 19:54:29 +0000636class test_SpooledTemporaryFile(TC):
637 """Test SpooledTemporaryFile()."""
638
639 def do_create(self, max_size=0, dir=None, pre="", suf=""):
640 if dir is None:
641 dir = tempfile.gettempdir()
642 try:
643 file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)
644 except:
645 self.failOnException("SpooledTemporaryFile")
646
647 return file
648
649
650 def test_basic(self):
651 # SpooledTemporaryFile can create files
652 f = self.do_create()
653 self.failIf(f._rolled)
654 f = self.do_create(max_size=100, pre="a", suf=".txt")
655 self.failIf(f._rolled)
656
657 def test_del_on_close(self):
658 # A SpooledTemporaryFile is deleted when closed
659 dir = tempfile.mkdtemp()
660 try:
661 f = tempfile.SpooledTemporaryFile(max_size=10, dir=dir)
662 self.failIf(f._rolled)
663 f.write('blat ' * 5)
664 self.failUnless(f._rolled)
665 filename = f.name
666 f.close()
667 self.failIf(os.path.exists(filename),
668 "SpooledTemporaryFile %s exists after close" % filename)
669 finally:
670 os.rmdir(dir)
671
672 def test_rewrite_small(self):
673 # A SpooledTemporaryFile can be written to multiple within the max_size
674 f = self.do_create(max_size=30)
675 self.failIf(f._rolled)
676 for i in range(5):
677 f.seek(0, 0)
678 f.write('x' * 20)
679 self.failIf(f._rolled)
680
681 def test_write_sequential(self):
682 # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
683 # over afterward
684 f = self.do_create(max_size=30)
685 self.failIf(f._rolled)
686 f.write('x' * 20)
687 self.failIf(f._rolled)
688 f.write('x' * 10)
689 self.failIf(f._rolled)
690 f.write('x')
691 self.failUnless(f._rolled)
692
693 def test_sparse(self):
694 # A SpooledTemporaryFile that is written late in the file will extend
695 # when that occurs
696 f = self.do_create(max_size=30)
697 self.failIf(f._rolled)
698 f.seek(100, 0)
699 self.failIf(f._rolled)
700 f.write('x')
701 self.failUnless(f._rolled)
702
703 def test_fileno(self):
704 # A SpooledTemporaryFile should roll over to a real file on fileno()
705 f = self.do_create(max_size=30)
706 self.failIf(f._rolled)
707 self.failUnless(f.fileno() > 0)
708 self.failUnless(f._rolled)
709
710 def test_multiple_close(self):
711 # A SpooledTemporaryFile can be closed many times without error
712 f = tempfile.SpooledTemporaryFile()
713 f.write('abc\n')
714 f.close()
715 try:
716 f.close()
717 f.close()
718 except:
719 self.failOnException("close")
720
721 def test_bound_methods(self):
722 # It should be OK to steal a bound method from a SpooledTemporaryFile
723 # and use it independently; when the file rolls over, those bound
724 # methods should continue to function
725 f = self.do_create(max_size=30)
726 read = f.read
727 write = f.write
728 seek = f.seek
729
730 write("a" * 35)
731 write("b" * 35)
732 seek(0, 0)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000733 self.assertEqual(read(70), 'a'*35 + 'b'*35)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000734
735test_classes.append(test_SpooledTemporaryFile)
736
Guido van Rossum0e548712002-08-09 16:14:33 +0000737
738class test_TemporaryFile(TC):
739 """Test TemporaryFile()."""
740
741 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000742 # TemporaryFile can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000743 # No point in testing the name params - the file has no name.
744 try:
745 tempfile.TemporaryFile()
746 except:
747 self.failOnException("TemporaryFile")
748
749 def test_has_no_name(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000750 # TemporaryFile creates files with no names (on this system)
Guido van Rossum0e548712002-08-09 16:14:33 +0000751 dir = tempfile.mkdtemp()
752 f = tempfile.TemporaryFile(dir=dir)
753 f.write('blat')
754
755 # Sneaky: because this file has no name, it should not prevent
756 # us from removing the directory it was created in.
757 try:
758 os.rmdir(dir)
759 except:
760 ei = sys.exc_info()
761 # cleanup
762 f.close()
763 os.rmdir(dir)
764 self.failOnException("rmdir", ei)
765
766 def test_multiple_close(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000767 # A TemporaryFile can be closed many times without error
Guido van Rossum0e548712002-08-09 16:14:33 +0000768 f = tempfile.TemporaryFile()
769 f.write('abc\n')
770 f.close()
771 try:
772 f.close()
773 f.close()
774 except:
775 self.failOnException("close")
776
777 # How to test the mode and bufsize parameters?
778
Guido van Rossum0e548712002-08-09 16:14:33 +0000779
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000780if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
Guido van Rossum0e548712002-08-09 16:14:33 +0000781 test_classes.append(test_TemporaryFile)
782
783def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000784 test_support.run_unittest(*test_classes)
Guido van Rossum0e548712002-08-09 16:14:33 +0000785
786if __name__ == "__main__":
787 test_main()