blob: 09b9a10efb9b5147fc8299c99f139efa947be5f0 [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
30else:
31 TEST_FILES = 100
Neal Norwitz68ee0122002-08-16 19:28:59 +000032
Guido van Rossum0e548712002-08-09 16:14:33 +000033# This is organized as one test for each chunk of code in tempfile.py,
34# in order of their appearance in the file. Testing which requires
35# threads is not done here.
36
37# Common functionality.
38class TC(unittest.TestCase):
39
40 str_check = re.compile(r"[a-zA-Z0-9_-]{6}$")
41
42 def failOnException(self, what, ei=None):
43 if ei is None:
44 ei = sys.exc_info()
45 self.fail("%s raised %s: %s" % (what, ei[0], ei[1]))
46
47 def nameCheck(self, name, dir, pre, suf):
48 (ndir, nbase) = os.path.split(name)
49 npre = nbase[:len(pre)]
50 nsuf = nbase[len(nbase)-len(suf):]
51
52 self.assertEqual(ndir, dir,
53 "file '%s' not in directory '%s'" % (name, dir))
54 self.assertEqual(npre, pre,
55 "file '%s' does not begin with '%s'" % (nbase, pre))
56 self.assertEqual(nsuf, suf,
57 "file '%s' does not end with '%s'" % (nbase, suf))
58
59 nbase = nbase[len(pre):len(nbase)-len(suf)]
60 self.assert_(self.str_check.match(nbase),
61 "random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/"
62 % nbase)
63
64test_classes = []
65
66class test_exports(TC):
67 def test_exports(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +000068 # There are no surprising symbols in the tempfile module
Guido van Rossum0e548712002-08-09 16:14:33 +000069 dict = tempfile.__dict__
70
71 expected = {
72 "NamedTemporaryFile" : 1,
73 "TemporaryFile" : 1,
74 "mkstemp" : 1,
75 "mkdtemp" : 1,
76 "mktemp" : 1,
77 "TMP_MAX" : 1,
78 "gettempprefix" : 1,
79 "gettempdir" : 1,
80 "tempdir" : 1,
81 "template" : 1
82 }
83
84 unexp = []
85 for key in dict:
86 if key[0] != '_' and key not in expected:
87 unexp.append(key)
88 self.failUnless(len(unexp) == 0,
89 "unexpected keys: %s" % unexp)
90
91test_classes.append(test_exports)
92
93
Guido van Rossum0e548712002-08-09 16:14:33 +000094class test__RandomNameSequence(TC):
95 """Test the internal iterator object _RandomNameSequence."""
96
97 def setUp(self):
98 self.r = tempfile._RandomNameSequence()
99
100 def test_get_six_char_str(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000101 # _RandomNameSequence returns a six-character string
Guido van Rossum0e548712002-08-09 16:14:33 +0000102 s = self.r.next()
103 self.nameCheck(s, '', '', '')
104
105 def test_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000106 # _RandomNameSequence returns no duplicate strings (stochastic)
Guido van Rossum0e548712002-08-09 16:14:33 +0000107
108 dict = {}
109 r = self.r
Neal Norwitz68ee0122002-08-16 19:28:59 +0000110 for i in xrange(TEST_FILES):
Guido van Rossum0e548712002-08-09 16:14:33 +0000111 s = r.next()
112 self.nameCheck(s, '', '', '')
113 self.failIf(s in dict)
114 dict[s] = 1
115
116 def test_supports_iter(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000117 # _RandomNameSequence supports the iterator protocol
Guido van Rossum0e548712002-08-09 16:14:33 +0000118
119 i = 0
120 r = self.r
121 try:
122 for s in r:
123 i += 1
124 if i == 20:
125 break
126 except:
127 failOnException("iteration")
128
129test_classes.append(test__RandomNameSequence)
130
131
132class test__candidate_tempdir_list(TC):
133 """Test the internal function _candidate_tempdir_list."""
134
135 def test_nonempty_list(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000136 # _candidate_tempdir_list returns a nonempty list of strings
Guido van Rossum0e548712002-08-09 16:14:33 +0000137
138 cand = tempfile._candidate_tempdir_list()
139
140 self.failIf(len(cand) == 0)
141 for c in cand:
142 self.assert_(isinstance(c, basestring),
143 "%s is not a string" % c)
144
145 def test_wanted_dirs(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000146 # _candidate_tempdir_list contains the expected directories
Guido van Rossum0e548712002-08-09 16:14:33 +0000147
148 # Make sure the interesting environment variables are all set.
149 added = []
150 try:
151 for envname in 'TMPDIR', 'TEMP', 'TMP':
152 dirname = os.getenv(envname)
153 if not dirname:
154 os.environ[envname] = os.path.abspath(envname)
155 added.append(envname)
156
157 cand = tempfile._candidate_tempdir_list()
158
159 for envname in 'TMPDIR', 'TEMP', 'TMP':
160 dirname = os.getenv(envname)
161 if not dirname: raise ValueError
162 self.assert_(dirname in cand)
163
164 try:
165 dirname = os.getcwd()
166 except (AttributeError, os.error):
167 dirname = os.curdir
168
169 self.assert_(dirname in cand)
170
171 # Not practical to try to verify the presence of OS-specific
172 # paths in this list.
173 finally:
174 for p in added:
175 del os.environ[p]
176
177test_classes.append(test__candidate_tempdir_list)
178
179
180# We test _get_default_tempdir by testing gettempdir.
181
182
183class test__get_candidate_names(TC):
184 """Test the internal function _get_candidate_names."""
185
186 def test_retval(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000187 # _get_candidate_names returns a _RandomNameSequence object
Guido van Rossum0e548712002-08-09 16:14:33 +0000188 obj = tempfile._get_candidate_names()
189 self.assert_(isinstance(obj, tempfile._RandomNameSequence))
190
191 def test_same_thing(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000192 # _get_candidate_names always returns the same object
Guido van Rossum0e548712002-08-09 16:14:33 +0000193 a = tempfile._get_candidate_names()
194 b = tempfile._get_candidate_names()
195
196 self.assert_(a is b)
197
198test_classes.append(test__get_candidate_names)
199
200
201class test__mkstemp_inner(TC):
202 """Test the internal function _mkstemp_inner."""
203
204 class mkstemped:
205 _bflags = tempfile._bin_openflags
206 _tflags = tempfile._text_openflags
207 _close = os.close
208 _unlink = os.unlink
209
210 def __init__(self, dir, pre, suf, bin):
211 if bin: flags = self._bflags
212 else: flags = self._tflags
213
214 (self.fd, self.name) = tempfile._mkstemp_inner(dir, pre, suf, flags)
215
216 def write(self, str):
217 os.write(self.fd, str)
218
219 def __del__(self):
220 self._close(self.fd)
221 self._unlink(self.name)
Tim Petersa0d55de2002-08-09 18:01:01 +0000222
Guido van Rossum0e548712002-08-09 16:14:33 +0000223 def do_create(self, dir=None, pre="", suf="", bin=1):
224 if dir is None:
225 dir = tempfile.gettempdir()
226 try:
227 file = self.mkstemped(dir, pre, suf, bin)
228 except:
229 self.failOnException("_mkstemp_inner")
230
231 self.nameCheck(file.name, dir, pre, suf)
232 return file
233
234 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000235 # _mkstemp_inner can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000236 self.do_create().write("blat")
237 self.do_create(pre="a").write("blat")
238 self.do_create(suf="b").write("blat")
239 self.do_create(pre="a", suf="b").write("blat")
240 self.do_create(pre="aa", suf=".txt").write("blat")
241
242 def test_basic_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000243 # _mkstemp_inner can create many files (stochastic)
Neal Norwitz68ee0122002-08-16 19:28:59 +0000244 extant = range(TEST_FILES)
Guido van Rossum0e548712002-08-09 16:14:33 +0000245 for i in extant:
246 extant[i] = self.do_create(pre="aa")
247
248 def test_choose_directory(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000249 # _mkstemp_inner can create files in a user-selected directory
Guido van Rossum0e548712002-08-09 16:14:33 +0000250 dir = tempfile.mkdtemp()
251 try:
252 self.do_create(dir=dir).write("blat")
253 finally:
254 os.rmdir(dir)
255
256 def test_file_mode(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000257 # _mkstemp_inner creates files with the proper mode
Guido van Rossum0e548712002-08-09 16:14:33 +0000258 if not has_stat:
259 return # ugh, can't use TestSkipped.
260
261 file = self.do_create()
262 mode = stat.S_IMODE(os.stat(file.name).st_mode)
Tim Petersca3ac7f2002-08-09 18:13:51 +0000263 expected = 0600
Jack Jansence921472003-01-08 16:30:34 +0000264 if sys.platform in ('win32', 'os2emx', 'mac'):
Tim Petersca3ac7f2002-08-09 18:13:51 +0000265 # There's no distinction among 'user', 'group' and 'world';
266 # replicate the 'user' bits.
267 user = expected >> 6
268 expected = user * (1 + 8 + 64)
269 self.assertEqual(mode, expected)
Guido van Rossum0e548712002-08-09 16:14:33 +0000270
271 def test_noinherit(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000272 # _mkstemp_inner file handles are not inherited by child processes
Guido van Rossum78741062002-08-17 11:41:01 +0000273 if not has_spawnl:
Guido van Rossum0e548712002-08-09 16:14:33 +0000274 return # ugh, can't use TestSkipped.
275
Guido van Rossum78741062002-08-17 11:41:01 +0000276 if test_support.verbose:
277 v="v"
278 else:
279 v="q"
280
Guido van Rossum0e548712002-08-09 16:14:33 +0000281 file = self.do_create()
Guido van Rossum78741062002-08-17 11:41:01 +0000282 fd = "%d" % file.fd
283
284 try:
285 me = __file__
286 except NameError:
287 me = sys.argv[0]
Guido van Rossum0e548712002-08-09 16:14:33 +0000288
289 # We have to exec something, so that FD_CLOEXEC will take
Guido van Rossum78741062002-08-17 11:41:01 +0000290 # effect. The core of this test is therefore in
291 # tf_inherit_check.py, which see.
292 tester = os.path.join(os.path.dirname(os.path.abspath(me)),
293 "tf_inherit_check.py")
Guido van Rossum0e548712002-08-09 16:14:33 +0000294
Guido van Rossum78741062002-08-17 11:41:01 +0000295 retval = os.spawnl(os.P_WAIT, sys.executable,
296 sys.executable, tester, v, fd)
297 self.failIf(retval < 0,
298 "child process caught fatal signal %d" % -retval)
299 self.failIf(retval > 0, "child process reports failure")
Guido van Rossum0e548712002-08-09 16:14:33 +0000300
301 def test_textmode(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000302 # _mkstemp_inner can create files in text mode
Guido van Rossum0e548712002-08-09 16:14:33 +0000303 if not has_textmode:
304 return # ugh, can't use TestSkipped.
305
306 self.do_create(bin=0).write("blat\n")
307 # XXX should test that the file really is a text file
308
309test_classes.append(test__mkstemp_inner)
310
311
312class test_gettempprefix(TC):
313 """Test gettempprefix()."""
314
315 def test_sane_template(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000316 # gettempprefix returns a nonempty prefix string
Guido van Rossum0e548712002-08-09 16:14:33 +0000317 p = tempfile.gettempprefix()
318
319 self.assert_(isinstance(p, basestring))
320 self.assert_(len(p) > 0)
321
322 def test_usable_template(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000323 # gettempprefix returns a usable prefix string
Guido van Rossum0e548712002-08-09 16:14:33 +0000324
325 # Create a temp directory, avoiding use of the prefix.
326 # Then attempt to create a file whose name is
327 # prefix + 'xxxxxx.xxx' in that directory.
328 p = tempfile.gettempprefix() + "xxxxxx.xxx"
329 d = tempfile.mkdtemp(prefix="")
330 try:
331 p = os.path.join(d, p)
332 try:
333 fd = os.open(p, os.O_RDWR | os.O_CREAT)
334 except:
335 self.failOnException("os.open")
336 os.close(fd)
337 os.unlink(p)
338 finally:
339 os.rmdir(d)
340
341test_classes.append(test_gettempprefix)
342
343
344class test_gettempdir(TC):
345 """Test gettempdir()."""
346
347 def test_directory_exists(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000348 # gettempdir returns a directory which exists
Guido van Rossum0e548712002-08-09 16:14:33 +0000349
350 dir = tempfile.gettempdir()
351 self.assert_(os.path.isabs(dir) or dir == os.curdir,
352 "%s is not an absolute path" % dir)
353 self.assert_(os.path.isdir(dir),
354 "%s is not a directory" % dir)
355
356 def test_directory_writable(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000357 # gettempdir returns a directory writable by the user
Guido van Rossum0e548712002-08-09 16:14:33 +0000358
359 # sneaky: just instantiate a NamedTemporaryFile, which
360 # defaults to writing into the directory returned by
361 # gettempdir.
362 try:
363 file = tempfile.NamedTemporaryFile()
364 file.write("blat")
365 file.close()
366 except:
367 self.failOnException("create file in %s" % tempfile.gettempdir())
368
369 def test_same_thing(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000370 # gettempdir always returns the same object
Guido van Rossum0e548712002-08-09 16:14:33 +0000371 a = tempfile.gettempdir()
372 b = tempfile.gettempdir()
373
374 self.assert_(a is b)
375
376test_classes.append(test_gettempdir)
377
378
379class test_mkstemp(TC):
380 """Test mkstemp()."""
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000381
Guido van Rossum0e548712002-08-09 16:14:33 +0000382 def do_create(self, dir=None, pre="", suf="", ):
383 if dir is None:
384 dir = tempfile.gettempdir()
385 try:
386 (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)
387 except:
388 self.failOnException("mkstemp")
389
390 try:
391 self.nameCheck(name, dir, pre, suf)
392 finally:
393 os.close(fd)
394 os.unlink(name)
395
396 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000397 # mkstemp can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000398 self.do_create()
399 self.do_create(pre="a")
400 self.do_create(suf="b")
401 self.do_create(pre="a", suf="b")
402 self.do_create(pre="aa", suf=".txt")
403
404 def test_choose_directory(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000405 # mkstemp can create directories in a user-selected directory
Guido van Rossum0e548712002-08-09 16:14:33 +0000406 dir = tempfile.mkdtemp()
407 try:
408 self.do_create(dir=dir)
409 finally:
410 os.rmdir(dir)
411
412test_classes.append(test_mkstemp)
413
414
415class test_mkdtemp(TC):
416 """Test mkdtemp()."""
417
418 def do_create(self, dir=None, pre="", suf=""):
419 if dir is None:
420 dir = tempfile.gettempdir()
421 try:
422 name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)
423 except:
424 self.failOnException("mkdtemp")
425
426 try:
427 self.nameCheck(name, dir, pre, suf)
428 return name
429 except:
430 os.rmdir(name)
431 raise
432
433 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000434 # mkdtemp can create directories
Guido van Rossum0e548712002-08-09 16:14:33 +0000435 os.rmdir(self.do_create())
436 os.rmdir(self.do_create(pre="a"))
437 os.rmdir(self.do_create(suf="b"))
438 os.rmdir(self.do_create(pre="a", suf="b"))
439 os.rmdir(self.do_create(pre="aa", suf=".txt"))
Tim Petersa0d55de2002-08-09 18:01:01 +0000440
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 def test_basic_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000442 # mkdtemp can create many directories (stochastic)
Neal Norwitz68ee0122002-08-16 19:28:59 +0000443 extant = range(TEST_FILES)
Guido van Rossum0e548712002-08-09 16:14:33 +0000444 try:
445 for i in extant:
446 extant[i] = self.do_create(pre="aa")
447 finally:
448 for i in extant:
449 if(isinstance(i, basestring)):
450 os.rmdir(i)
451
452 def test_choose_directory(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000453 # mkdtemp can create directories in a user-selected directory
Guido van Rossum0e548712002-08-09 16:14:33 +0000454 dir = tempfile.mkdtemp()
455 try:
456 os.rmdir(self.do_create(dir=dir))
457 finally:
458 os.rmdir(dir)
459
460 def test_mode(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000461 # mkdtemp creates directories with the proper mode
Guido van Rossum0e548712002-08-09 16:14:33 +0000462 if not has_stat:
463 return # ugh, can't use TestSkipped.
464
465 dir = self.do_create()
466 try:
467 mode = stat.S_IMODE(os.stat(dir).st_mode)
Tim Petersca3ac7f2002-08-09 18:13:51 +0000468 expected = 0700
Jack Jansence921472003-01-08 16:30:34 +0000469 if sys.platform in ('win32', 'os2emx', 'mac'):
Tim Petersca3ac7f2002-08-09 18:13:51 +0000470 # There's no distinction among 'user', 'group' and 'world';
471 # replicate the 'user' bits.
472 user = expected >> 6
473 expected = user * (1 + 8 + 64)
474 self.assertEqual(mode, expected)
Guido van Rossum0e548712002-08-09 16:14:33 +0000475 finally:
476 os.rmdir(dir)
477
478test_classes.append(test_mkdtemp)
479
480
481class test_mktemp(TC):
482 """Test mktemp()."""
483
484 # For safety, all use of mktemp must occur in a private directory.
485 # We must also suppress the RuntimeWarning it generates.
486 def setUp(self):
487 self.dir = tempfile.mkdtemp()
Guido van Rossum0e548712002-08-09 16:14:33 +0000488
489 def tearDown(self):
490 if self.dir:
491 os.rmdir(self.dir)
492 self.dir = None
Guido van Rossum0e548712002-08-09 16:14:33 +0000493
494 class mktemped:
495 _unlink = os.unlink
496 _bflags = tempfile._bin_openflags
497
498 def __init__(self, dir, pre, suf):
499 self.name = tempfile.mktemp(dir=dir, prefix=pre, suffix=suf)
500 # Create the file. This will raise an exception if it's
501 # mysteriously appeared in the meanwhile.
502 os.close(os.open(self.name, self._bflags, 0600))
503
504 def __del__(self):
505 self._unlink(self.name)
506
507 def do_create(self, pre="", suf=""):
508 try:
509 file = self.mktemped(self.dir, pre, suf)
510 except:
511 self.failOnException("mktemp")
512
513 self.nameCheck(file.name, self.dir, pre, suf)
514 return file
515
516 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000517 # mktemp can choose usable file names
Guido van Rossum0e548712002-08-09 16:14:33 +0000518 self.do_create()
519 self.do_create(pre="a")
520 self.do_create(suf="b")
521 self.do_create(pre="a", suf="b")
522 self.do_create(pre="aa", suf=".txt")
523
524 def test_many(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000525 # mktemp can choose many usable file names (stochastic)
Neal Norwitz68ee0122002-08-16 19:28:59 +0000526 extant = range(TEST_FILES)
Guido van Rossum0e548712002-08-09 16:14:33 +0000527 for i in extant:
528 extant[i] = self.do_create(pre="aa")
529
Fred Drake8bec4832002-11-22 20:13:43 +0000530## def test_warning(self):
531## # mktemp issues a warning when used
532## warnings.filterwarnings("error",
533## category=RuntimeWarning,
534## message="mktemp")
535## self.assertRaises(RuntimeWarning,
536## tempfile.mktemp, dir=self.dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000537
538test_classes.append(test_mktemp)
539
540
541# We test _TemporaryFileWrapper by testing NamedTemporaryFile.
542
543
544class test_NamedTemporaryFile(TC):
545 """Test NamedTemporaryFile()."""
546
547 def do_create(self, dir=None, pre="", suf=""):
548 if dir is None:
549 dir = tempfile.gettempdir()
550 try:
551 file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf)
552 except:
553 self.failOnException("NamedTemporaryFile")
554
555 self.nameCheck(file.name, dir, pre, suf)
556 return file
557
558
559 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000560 # NamedTemporaryFile can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000561 self.do_create()
562 self.do_create(pre="a")
563 self.do_create(suf="b")
564 self.do_create(pre="a", suf="b")
565 self.do_create(pre="aa", suf=".txt")
566
567 def test_creates_named(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000568 # NamedTemporaryFile creates files with names
Guido van Rossum0e548712002-08-09 16:14:33 +0000569 f = tempfile.NamedTemporaryFile()
570 self.failUnless(os.path.exists(f.name),
571 "NamedTemporaryFile %s does not exist" % f.name)
572
573 def test_del_on_close(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000574 # A NamedTemporaryFile is deleted when closed
Guido van Rossum0e548712002-08-09 16:14:33 +0000575 dir = tempfile.mkdtemp()
576 try:
577 f = tempfile.NamedTemporaryFile(dir=dir)
578 f.write('blat')
579 f.close()
580 self.failIf(os.path.exists(f.name),
581 "NamedTemporaryFile %s exists after close" % f.name)
582 finally:
583 os.rmdir(dir)
584
585 def test_multiple_close(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000586 # A NamedTemporaryFile can be closed many times without error
Guido van Rossum0e548712002-08-09 16:14:33 +0000587
588 f = tempfile.NamedTemporaryFile()
589 f.write('abc\n')
590 f.close()
591 try:
592 f.close()
593 f.close()
594 except:
595 self.failOnException("close")
596
597 # How to test the mode and bufsize parameters?
598
599test_classes.append(test_NamedTemporaryFile)
600
601
602class test_TemporaryFile(TC):
603 """Test TemporaryFile()."""
604
605 def test_basic(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000606 # TemporaryFile can create files
Guido van Rossum0e548712002-08-09 16:14:33 +0000607 # No point in testing the name params - the file has no name.
608 try:
609 tempfile.TemporaryFile()
610 except:
611 self.failOnException("TemporaryFile")
612
613 def test_has_no_name(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000614 # TemporaryFile creates files with no names (on this system)
Guido van Rossum0e548712002-08-09 16:14:33 +0000615 dir = tempfile.mkdtemp()
616 f = tempfile.TemporaryFile(dir=dir)
617 f.write('blat')
618
619 # Sneaky: because this file has no name, it should not prevent
620 # us from removing the directory it was created in.
621 try:
622 os.rmdir(dir)
623 except:
624 ei = sys.exc_info()
625 # cleanup
626 f.close()
627 os.rmdir(dir)
628 self.failOnException("rmdir", ei)
629
630 def test_multiple_close(self):
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000631 # A TemporaryFile can be closed many times without error
Guido van Rossum0e548712002-08-09 16:14:33 +0000632 f = tempfile.TemporaryFile()
633 f.write('abc\n')
634 f.close()
635 try:
636 f.close()
637 f.close()
638 except:
639 self.failOnException("close")
640
641 # How to test the mode and bufsize parameters?
642
Guido van Rossum0e548712002-08-09 16:14:33 +0000643
Guido van Rossum8ccd9b62002-08-22 20:02:03 +0000644if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
Guido van Rossum0e548712002-08-09 16:14:33 +0000645 test_classes.append(test_TemporaryFile)
646
647def test_main():
648 suite = unittest.TestSuite()
649 for c in test_classes:
650 suite.addTest(unittest.makeSuite(c))
651 test_support.run_suite(suite)
652
653if __name__ == "__main__":
654 test_main()