blob: a44be268109c1d955662707bce607fa8e124a06a [file] [log] [blame]
Guido van Rossum0e548712002-08-09 16:14:33 +00001# tempfile.py unit tests.
Nick Coghlan97fac3e2008-02-09 15:28:09 +00002from __future__ import with_statement
Tim Petersc57a2852001-10-29 21:46:08 +00003import 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
Neal Norwitz4bc2c092006-09-05 02:57:01 +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,
Collin Wintera8785cc2007-03-19 18:52:08 +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
Guido van Rossum0e548712002-08-09 16:14:33 +0000106 s = self.r.next()
107 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
Neal Norwitz68ee0122002-08-16 19:28:59 +0000114 for i in xrange(TEST_FILES):
Guido van Rossum0e548712002-08-09 16:14:33 +0000115 s = r.next()
116 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)
Neal Norwitz68ee0122002-08-16 19:28:59 +0000248 extant = 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)
Tim Petersca3ac7f2002-08-09 18:13:51 +0000267 expected = 0600
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
Armin Rigo66d41b22007-12-07 19:19:55 +0000302 if sys.platform in ('win32',):
Martin v. Löwisd4210bc2003-10-23 15:55:28 +0000303 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
Martin Blais215f13d2006-06-06 12:46:55 +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)
Neal Norwitz68ee0122002-08-16 19:28:59 +0000460 extant = 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 Rossum59db96f2004-03-31 18:53:29 +0000485 mode &= 0777 # Mask off sticky bits inherited from /tmp
Tim Petersca3ac7f2002-08-09 18:13:51 +0000486 expected = 0700
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.
520 os.close(os.open(self.name, self._bflags, 0600))
521
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)
Neal Norwitz68ee0122002-08-16 19:28:59 +0000544 extant = 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
Georg Brandl35ef9c12007-03-13 18:31:49 +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:
Georg Brandl35ef9c12007-03-13 18:31:49 +0000569 file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,
Georg Brandl4168c042007-03-13 19:18:18 +0000570 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
Georg Brandl35ef9c12007-03-13 18:31:49 +0000604 def test_dis_del_on_close(self):
605 # Tests that delete-on-close can be disabled
606 dir = tempfile.mkdtemp()
Georg Brandl4168c042007-03-13 19:18:18 +0000607 tmp = None
Georg Brandl35ef9c12007-03-13 18:31:49 +0000608 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 f = tempfile.NamedTemporaryFile()
623 f.write('abc\n')
624 f.close()
625 try:
626 f.close()
627 f.close()
628 except:
629 self.failOnException("close")
630
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000631 def test_context_manager(self):
632 # A NamedTemporaryFile can be used as a context manager
633 with tempfile.NamedTemporaryFile() as f:
634 self.failUnless(os.path.exists(f.name))
635 self.failIf(os.path.exists(f.name))
636 def use_closed():
637 with f:
638 pass
639 self.failUnlessRaises(ValueError, use_closed)
640
Guido van Rossum0e548712002-08-09 16:14:33 +0000641 # How to test the mode and bufsize parameters?
642
643test_classes.append(test_NamedTemporaryFile)
644
Collin Wintera8785cc2007-03-19 18:52:08 +0000645class test_SpooledTemporaryFile(TC):
646 """Test SpooledTemporaryFile()."""
647
648 def do_create(self, max_size=0, dir=None, pre="", suf=""):
649 if dir is None:
650 dir = tempfile.gettempdir()
651 try:
652 file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)
653 except:
654 self.failOnException("SpooledTemporaryFile")
655
656 return file
657
658
659 def test_basic(self):
660 # SpooledTemporaryFile can create files
661 f = self.do_create()
662 self.failIf(f._rolled)
663 f = self.do_create(max_size=100, pre="a", suf=".txt")
664 self.failIf(f._rolled)
665
666 def test_del_on_close(self):
667 # A SpooledTemporaryFile is deleted when closed
668 dir = tempfile.mkdtemp()
669 try:
670 f = tempfile.SpooledTemporaryFile(max_size=10, dir=dir)
671 self.failIf(f._rolled)
672 f.write('blat ' * 5)
673 self.failUnless(f._rolled)
674 filename = f.name
675 f.close()
676 self.failIf(os.path.exists(filename),
677 "SpooledTemporaryFile %s exists after close" % filename)
678 finally:
679 os.rmdir(dir)
680
681 def test_rewrite_small(self):
682 # A SpooledTemporaryFile can be written to multiple within the max_size
683 f = self.do_create(max_size=30)
684 self.failIf(f._rolled)
685 for i in range(5):
686 f.seek(0, 0)
687 f.write('x' * 20)
688 self.failIf(f._rolled)
689
690 def test_write_sequential(self):
691 # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
692 # over afterward
693 f = self.do_create(max_size=30)
694 self.failIf(f._rolled)
695 f.write('x' * 20)
696 self.failIf(f._rolled)
697 f.write('x' * 10)
698 self.failIf(f._rolled)
699 f.write('x')
700 self.failUnless(f._rolled)
701
702 def test_sparse(self):
703 # A SpooledTemporaryFile that is written late in the file will extend
704 # when that occurs
705 f = self.do_create(max_size=30)
706 self.failIf(f._rolled)
707 f.seek(100, 0)
708 self.failIf(f._rolled)
709 f.write('x')
710 self.failUnless(f._rolled)
711
712 def test_fileno(self):
713 # A SpooledTemporaryFile should roll over to a real file on fileno()
714 f = self.do_create(max_size=30)
715 self.failIf(f._rolled)
716 self.failUnless(f.fileno() > 0)
717 self.failUnless(f._rolled)
718
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000719 def test_multiple_close_before_rollover(self):
Collin Wintera8785cc2007-03-19 18:52:08 +0000720 # A SpooledTemporaryFile can be closed many times without error
721 f = tempfile.SpooledTemporaryFile()
722 f.write('abc\n')
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000723 self.failIf(f._rolled)
724 f.close()
725 try:
726 f.close()
727 f.close()
728 except:
729 self.failOnException("close")
730
731 def test_multiple_close_after_rollover(self):
732 # A SpooledTemporaryFile can be closed many times without error
733 f = tempfile.SpooledTemporaryFile(max_size=1)
734 f.write('abc\n')
735 self.failUnless(f._rolled)
Collin Wintera8785cc2007-03-19 18:52:08 +0000736 f.close()
737 try:
738 f.close()
739 f.close()
740 except:
741 self.failOnException("close")
742
743 def test_bound_methods(self):
744 # It should be OK to steal a bound method from a SpooledTemporaryFile
745 # and use it independently; when the file rolls over, those bound
746 # methods should continue to function
747 f = self.do_create(max_size=30)
748 read = f.read
749 write = f.write
750 seek = f.seek
751
752 write("a" * 35)
753 write("b" * 35)
754 seek(0, 0)
755 self.failUnless(read(70) == 'a'*35 + 'b'*35)
756
Nick Coghlan97fac3e2008-02-09 15:28:09 +0000757 def test_context_manager_before_rollover(self):
758 # A SpooledTemporaryFile can be used as a context manager
759 with tempfile.SpooledTemporaryFile(max_size=1) as f:
760 self.failIf(f._rolled)
761 self.failIf(f.closed)
762 self.failUnless(f.closed)
763 def use_closed():
764 with f:
765 pass
766 self.failUnlessRaises(ValueError, use_closed)
767
768 def test_context_manager_during_rollover(self):
769 # A SpooledTemporaryFile can be used as a context manager
770 with tempfile.SpooledTemporaryFile(max_size=1) as f:
771 self.failIf(f._rolled)
772 f.write('abc\n')
773 f.flush()
774 self.failUnless(f._rolled)
775 self.failIf(f.closed)
776 self.failUnless(f.closed)
777 def use_closed():
778 with f:
779 pass
780 self.failUnlessRaises(ValueError, use_closed)
781
782 def test_context_manager_after_rollover(self):
783 # A SpooledTemporaryFile can be used as a context manager
784 f = tempfile.SpooledTemporaryFile(max_size=1)
785 f.write('abc\n')
786 f.flush()
787 self.failUnless(f._rolled)
788 with f:
789 self.failIf(f.closed)
790 self.failUnless(f.closed)
791 def use_closed():
792 with f:
793 pass
794 self.failUnlessRaises(ValueError, use_closed)
795
796
Collin Wintera8785cc2007-03-19 18:52:08 +0000797test_classes.append(test_SpooledTemporaryFile)
798
Guido van Rossum0e548712002-08-09 16:14:33 +0000799
800class test_TemporaryFile(TC):
801 """Test TemporaryFile()."""
802
803 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000804 # TemporaryFile can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000805 # No point in testing the name params - the file has no name.
806 try:
807 tempfile.TemporaryFile()
808 except:
809 self.failOnException("TemporaryFile")
810
811 def test_has_no_name(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000812 # TemporaryFile creates files with no names (on this system)
Guido van Rossum0e548712002-08-09 16:14:33 +0000813 dir = tempfile.mkdtemp()
814 f = tempfile.TemporaryFile(dir=dir)
815 f.write('blat')
816
817 # Sneaky: because this file has no name, it should not prevent
818 # us from removing the directory it was created in.
819 try:
820 os.rmdir(dir)
821 except:
822 ei = sys.exc_info()
823 # cleanup
824 f.close()
825 os.rmdir(dir)
826 self.failOnException("rmdir", ei)
827
828 def test_multiple_close(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000829 # A TemporaryFile can be closed many times without error
Guido van Rossum0e548712002-08-09 16:14:33 +0000830 f = tempfile.TemporaryFile()
831 f.write('abc\n')
832 f.close()
833 try:
834 f.close()
835 f.close()
836 except:
837 self.failOnException("close")
838
839 # How to test the mode and bufsize parameters?
840
Guido van Rossum0e548712002-08-09 16:14:33 +0000841
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000842if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
Guido van Rossum0e548712002-08-09 16:14:33 +0000843 test_classes.append(test_TemporaryFile)
844
845def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000846 test_support.run_unittest(*test_classes)
Guido van Rossum0e548712002-08-09 16:14:33 +0000847
848if __name__ == "__main__":
849 test_main()