]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_tempfile.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Lib / test / test_tempfile.py
CommitLineData
4710c53d 1# tempfile.py unit tests.\r
2import tempfile\r
3import os\r
4import sys\r
5import re\r
6import warnings\r
7\r
8import unittest\r
9from test import test_support\r
10\r
11warnings.filterwarnings("ignore",\r
12 category=RuntimeWarning,\r
13 message="mktemp", module=__name__)\r
14\r
15if hasattr(os, 'stat'):\r
16 import stat\r
17 has_stat = 1\r
18else:\r
19 has_stat = 0\r
20\r
21has_textmode = (tempfile._text_openflags != tempfile._bin_openflags)\r
22has_spawnl = hasattr(os, 'spawnl')\r
23\r
24# TEST_FILES may need to be tweaked for systems depending on the maximum\r
25# number of files that can be opened at one time (see ulimit -n)\r
26if sys.platform in ('openbsd3', 'openbsd4'):\r
27 TEST_FILES = 48\r
28else:\r
29 TEST_FILES = 100\r
30\r
31# This is organized as one test for each chunk of code in tempfile.py,\r
32# in order of their appearance in the file. Testing which requires\r
33# threads is not done here.\r
34\r
35# Common functionality.\r
36class TC(unittest.TestCase):\r
37\r
38 str_check = re.compile(r"[a-zA-Z0-9_-]{6}$")\r
39\r
40 def failOnException(self, what, ei=None):\r
41 if ei is None:\r
42 ei = sys.exc_info()\r
43 self.fail("%s raised %s: %s" % (what, ei[0], ei[1]))\r
44\r
45 def nameCheck(self, name, dir, pre, suf):\r
46 (ndir, nbase) = os.path.split(name)\r
47 npre = nbase[:len(pre)]\r
48 nsuf = nbase[len(nbase)-len(suf):]\r
49\r
50 # check for equality of the absolute paths!\r
51 self.assertEqual(os.path.abspath(ndir), os.path.abspath(dir),\r
52 "file '%s' not in directory '%s'" % (name, dir))\r
53 self.assertEqual(npre, pre,\r
54 "file '%s' does not begin with '%s'" % (nbase, pre))\r
55 self.assertEqual(nsuf, suf,\r
56 "file '%s' does not end with '%s'" % (nbase, suf))\r
57\r
58 nbase = nbase[len(pre):len(nbase)-len(suf)]\r
59 self.assertTrue(self.str_check.match(nbase),\r
60 "random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/"\r
61 % nbase)\r
62\r
63test_classes = []\r
64\r
65class test_exports(TC):\r
66 def test_exports(self):\r
67 # There are no surprising symbols in the tempfile module\r
68 dict = tempfile.__dict__\r
69\r
70 expected = {\r
71 "NamedTemporaryFile" : 1,\r
72 "TemporaryFile" : 1,\r
73 "mkstemp" : 1,\r
74 "mkdtemp" : 1,\r
75 "mktemp" : 1,\r
76 "TMP_MAX" : 1,\r
77 "gettempprefix" : 1,\r
78 "gettempdir" : 1,\r
79 "tempdir" : 1,\r
80 "template" : 1,\r
81 "SpooledTemporaryFile" : 1\r
82 }\r
83\r
84 unexp = []\r
85 for key in dict:\r
86 if key[0] != '_' and key not in expected:\r
87 unexp.append(key)\r
88 self.assertTrue(len(unexp) == 0,\r
89 "unexpected keys: %s" % unexp)\r
90\r
91test_classes.append(test_exports)\r
92\r
93\r
94class test__RandomNameSequence(TC):\r
95 """Test the internal iterator object _RandomNameSequence."""\r
96\r
97 def setUp(self):\r
98 self.r = tempfile._RandomNameSequence()\r
99\r
100 def test_get_six_char_str(self):\r
101 # _RandomNameSequence returns a six-character string\r
102 s = self.r.next()\r
103 self.nameCheck(s, '', '', '')\r
104\r
105 def test_many(self):\r
106 # _RandomNameSequence returns no duplicate strings (stochastic)\r
107\r
108 dict = {}\r
109 r = self.r\r
110 for i in xrange(TEST_FILES):\r
111 s = r.next()\r
112 self.nameCheck(s, '', '', '')\r
113 self.assertNotIn(s, dict)\r
114 dict[s] = 1\r
115\r
116 def test_supports_iter(self):\r
117 # _RandomNameSequence supports the iterator protocol\r
118\r
119 i = 0\r
120 r = self.r\r
121 try:\r
122 for s in r:\r
123 i += 1\r
124 if i == 20:\r
125 break\r
126 except:\r
127 self.failOnException("iteration")\r
128\r
129test_classes.append(test__RandomNameSequence)\r
130\r
131\r
132class test__candidate_tempdir_list(TC):\r
133 """Test the internal function _candidate_tempdir_list."""\r
134\r
135 def test_nonempty_list(self):\r
136 # _candidate_tempdir_list returns a nonempty list of strings\r
137\r
138 cand = tempfile._candidate_tempdir_list()\r
139\r
140 self.assertFalse(len(cand) == 0)\r
141 for c in cand:\r
142 self.assertIsInstance(c, basestring)\r
143\r
144 def test_wanted_dirs(self):\r
145 # _candidate_tempdir_list contains the expected directories\r
146\r
147 # Make sure the interesting environment variables are all set.\r
148 with test_support.EnvironmentVarGuard() as env:\r
149 for envname in 'TMPDIR', 'TEMP', 'TMP':\r
150 dirname = os.getenv(envname)\r
151 if not dirname:\r
152 env[envname] = os.path.abspath(envname)\r
153\r
154 cand = tempfile._candidate_tempdir_list()\r
155\r
156 for envname in 'TMPDIR', 'TEMP', 'TMP':\r
157 dirname = os.getenv(envname)\r
158 if not dirname: raise ValueError\r
159 self.assertIn(dirname, cand)\r
160\r
161 try:\r
162 dirname = os.getcwd()\r
163 except (AttributeError, os.error):\r
164 dirname = os.curdir\r
165\r
166 self.assertIn(dirname, cand)\r
167\r
168 # Not practical to try to verify the presence of OS-specific\r
169 # paths in this list.\r
170\r
171test_classes.append(test__candidate_tempdir_list)\r
172\r
173\r
174# We test _get_default_tempdir by testing gettempdir.\r
175\r
176\r
177class test__get_candidate_names(TC):\r
178 """Test the internal function _get_candidate_names."""\r
179\r
180 def test_retval(self):\r
181 # _get_candidate_names returns a _RandomNameSequence object\r
182 obj = tempfile._get_candidate_names()\r
183 self.assertIsInstance(obj, tempfile._RandomNameSequence)\r
184\r
185 def test_same_thing(self):\r
186 # _get_candidate_names always returns the same object\r
187 a = tempfile._get_candidate_names()\r
188 b = tempfile._get_candidate_names()\r
189\r
190 self.assertTrue(a is b)\r
191\r
192test_classes.append(test__get_candidate_names)\r
193\r
194\r
195class test__mkstemp_inner(TC):\r
196 """Test the internal function _mkstemp_inner."""\r
197\r
198 class mkstemped:\r
199 _bflags = tempfile._bin_openflags\r
200 _tflags = tempfile._text_openflags\r
201 _close = os.close\r
202 _unlink = os.unlink\r
203\r
204 def __init__(self, dir, pre, suf, bin):\r
205 if bin: flags = self._bflags\r
206 else: flags = self._tflags\r
207\r
208 (self.fd, self.name) = tempfile._mkstemp_inner(dir, pre, suf, flags)\r
209\r
210 def write(self, str):\r
211 os.write(self.fd, str)\r
212\r
213 def __del__(self):\r
214 self._close(self.fd)\r
215 self._unlink(self.name)\r
216\r
217 def do_create(self, dir=None, pre="", suf="", bin=1):\r
218 if dir is None:\r
219 dir = tempfile.gettempdir()\r
220 try:\r
221 file = self.mkstemped(dir, pre, suf, bin)\r
222 except:\r
223 self.failOnException("_mkstemp_inner")\r
224\r
225 self.nameCheck(file.name, dir, pre, suf)\r
226 return file\r
227\r
228 def test_basic(self):\r
229 # _mkstemp_inner can create files\r
230 self.do_create().write("blat")\r
231 self.do_create(pre="a").write("blat")\r
232 self.do_create(suf="b").write("blat")\r
233 self.do_create(pre="a", suf="b").write("blat")\r
234 self.do_create(pre="aa", suf=".txt").write("blat")\r
235\r
236 def test_basic_many(self):\r
237 # _mkstemp_inner can create many files (stochastic)\r
238 extant = range(TEST_FILES)\r
239 for i in extant:\r
240 extant[i] = self.do_create(pre="aa")\r
241\r
242 def test_choose_directory(self):\r
243 # _mkstemp_inner can create files in a user-selected directory\r
244 dir = tempfile.mkdtemp()\r
245 try:\r
246 self.do_create(dir=dir).write("blat")\r
247 finally:\r
248 os.rmdir(dir)\r
249\r
250 def test_file_mode(self):\r
251 # _mkstemp_inner creates files with the proper mode\r
252 if not has_stat:\r
253 return # ugh, can't use SkipTest.\r
254\r
255 file = self.do_create()\r
256 mode = stat.S_IMODE(os.stat(file.name).st_mode)\r
257 expected = 0600\r
258 if sys.platform in ('win32', 'os2emx'):\r
259 # There's no distinction among 'user', 'group' and 'world';\r
260 # replicate the 'user' bits.\r
261 user = expected >> 6\r
262 expected = user * (1 + 8 + 64)\r
263 self.assertEqual(mode, expected)\r
264\r
265 def test_noinherit(self):\r
266 # _mkstemp_inner file handles are not inherited by child processes\r
267 if not has_spawnl:\r
268 return # ugh, can't use SkipTest.\r
269\r
270 if test_support.verbose:\r
271 v="v"\r
272 else:\r
273 v="q"\r
274\r
275 file = self.do_create()\r
276 fd = "%d" % file.fd\r
277\r
278 try:\r
279 me = __file__\r
280 except NameError:\r
281 me = sys.argv[0]\r
282\r
283 # We have to exec something, so that FD_CLOEXEC will take\r
284 # effect. The core of this test is therefore in\r
285 # tf_inherit_check.py, which see.\r
286 tester = os.path.join(os.path.dirname(os.path.abspath(me)),\r
287 "tf_inherit_check.py")\r
288\r
289 # On Windows a spawn* /path/ with embedded spaces shouldn't be quoted,\r
290 # but an arg with embedded spaces should be decorated with double\r
291 # quotes on each end\r
292 if sys.platform in ('win32',):\r
293 decorated = '"%s"' % sys.executable\r
294 tester = '"%s"' % tester\r
295 else:\r
296 decorated = sys.executable\r
297\r
298 retval = os.spawnl(os.P_WAIT, sys.executable, decorated, tester, v, fd)\r
299 self.assertFalse(retval < 0,\r
300 "child process caught fatal signal %d" % -retval)\r
301 self.assertFalse(retval > 0, "child process reports failure %d"%retval)\r
302\r
303 def test_textmode(self):\r
304 # _mkstemp_inner can create files in text mode\r
305 if not has_textmode:\r
306 return # ugh, can't use SkipTest.\r
307\r
308 self.do_create(bin=0).write("blat\n")\r
309 # XXX should test that the file really is a text file\r
310\r
311test_classes.append(test__mkstemp_inner)\r
312\r
313\r
314class test_gettempprefix(TC):\r
315 """Test gettempprefix()."""\r
316\r
317 def test_sane_template(self):\r
318 # gettempprefix returns a nonempty prefix string\r
319 p = tempfile.gettempprefix()\r
320\r
321 self.assertIsInstance(p, basestring)\r
322 self.assertTrue(len(p) > 0)\r
323\r
324 def test_usable_template(self):\r
325 # gettempprefix returns a usable prefix string\r
326\r
327 # Create a temp directory, avoiding use of the prefix.\r
328 # Then attempt to create a file whose name is\r
329 # prefix + 'xxxxxx.xxx' in that directory.\r
330 p = tempfile.gettempprefix() + "xxxxxx.xxx"\r
331 d = tempfile.mkdtemp(prefix="")\r
332 try:\r
333 p = os.path.join(d, p)\r
334 try:\r
335 fd = os.open(p, os.O_RDWR | os.O_CREAT)\r
336 except:\r
337 self.failOnException("os.open")\r
338 os.close(fd)\r
339 os.unlink(p)\r
340 finally:\r
341 os.rmdir(d)\r
342\r
343test_classes.append(test_gettempprefix)\r
344\r
345\r
346class test_gettempdir(TC):\r
347 """Test gettempdir()."""\r
348\r
349 def test_directory_exists(self):\r
350 # gettempdir returns a directory which exists\r
351\r
352 dir = tempfile.gettempdir()\r
353 self.assertTrue(os.path.isabs(dir) or dir == os.curdir,\r
354 "%s is not an absolute path" % dir)\r
355 self.assertTrue(os.path.isdir(dir),\r
356 "%s is not a directory" % dir)\r
357\r
358 def test_directory_writable(self):\r
359 # gettempdir returns a directory writable by the user\r
360\r
361 # sneaky: just instantiate a NamedTemporaryFile, which\r
362 # defaults to writing into the directory returned by\r
363 # gettempdir.\r
364 try:\r
365 file = tempfile.NamedTemporaryFile()\r
366 file.write("blat")\r
367 file.close()\r
368 except:\r
369 self.failOnException("create file in %s" % tempfile.gettempdir())\r
370\r
371 def test_same_thing(self):\r
372 # gettempdir always returns the same object\r
373 a = tempfile.gettempdir()\r
374 b = tempfile.gettempdir()\r
375\r
376 self.assertTrue(a is b)\r
377\r
378test_classes.append(test_gettempdir)\r
379\r
380\r
381class test_mkstemp(TC):\r
382 """Test mkstemp()."""\r
383\r
384 def do_create(self, dir=None, pre="", suf=""):\r
385 if dir is None:\r
386 dir = tempfile.gettempdir()\r
387 try:\r
388 (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)\r
389 (ndir, nbase) = os.path.split(name)\r
390 adir = os.path.abspath(dir)\r
391 self.assertEqual(adir, ndir,\r
392 "Directory '%s' incorrectly returned as '%s'" % (adir, ndir))\r
393 except:\r
394 self.failOnException("mkstemp")\r
395\r
396 try:\r
397 self.nameCheck(name, dir, pre, suf)\r
398 finally:\r
399 os.close(fd)\r
400 os.unlink(name)\r
401\r
402 def test_basic(self):\r
403 # mkstemp can create files\r
404 self.do_create()\r
405 self.do_create(pre="a")\r
406 self.do_create(suf="b")\r
407 self.do_create(pre="a", suf="b")\r
408 self.do_create(pre="aa", suf=".txt")\r
409 self.do_create(dir=".")\r
410\r
411 def test_choose_directory(self):\r
412 # mkstemp can create directories in a user-selected directory\r
413 dir = tempfile.mkdtemp()\r
414 try:\r
415 self.do_create(dir=dir)\r
416 finally:\r
417 os.rmdir(dir)\r
418\r
419test_classes.append(test_mkstemp)\r
420\r
421\r
422class test_mkdtemp(TC):\r
423 """Test mkdtemp()."""\r
424\r
425 def do_create(self, dir=None, pre="", suf=""):\r
426 if dir is None:\r
427 dir = tempfile.gettempdir()\r
428 try:\r
429 name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)\r
430 except:\r
431 self.failOnException("mkdtemp")\r
432\r
433 try:\r
434 self.nameCheck(name, dir, pre, suf)\r
435 return name\r
436 except:\r
437 os.rmdir(name)\r
438 raise\r
439\r
440 def test_basic(self):\r
441 # mkdtemp can create directories\r
442 os.rmdir(self.do_create())\r
443 os.rmdir(self.do_create(pre="a"))\r
444 os.rmdir(self.do_create(suf="b"))\r
445 os.rmdir(self.do_create(pre="a", suf="b"))\r
446 os.rmdir(self.do_create(pre="aa", suf=".txt"))\r
447\r
448 def test_basic_many(self):\r
449 # mkdtemp can create many directories (stochastic)\r
450 extant = range(TEST_FILES)\r
451 try:\r
452 for i in extant:\r
453 extant[i] = self.do_create(pre="aa")\r
454 finally:\r
455 for i in extant:\r
456 if(isinstance(i, basestring)):\r
457 os.rmdir(i)\r
458\r
459 def test_choose_directory(self):\r
460 # mkdtemp can create directories in a user-selected directory\r
461 dir = tempfile.mkdtemp()\r
462 try:\r
463 os.rmdir(self.do_create(dir=dir))\r
464 finally:\r
465 os.rmdir(dir)\r
466\r
467 def test_mode(self):\r
468 # mkdtemp creates directories with the proper mode\r
469 if not has_stat:\r
470 return # ugh, can't use SkipTest.\r
471\r
472 dir = self.do_create()\r
473 try:\r
474 mode = stat.S_IMODE(os.stat(dir).st_mode)\r
475 mode &= 0777 # Mask off sticky bits inherited from /tmp\r
476 expected = 0700\r
477 if sys.platform in ('win32', 'os2emx'):\r
478 # There's no distinction among 'user', 'group' and 'world';\r
479 # replicate the 'user' bits.\r
480 user = expected >> 6\r
481 expected = user * (1 + 8 + 64)\r
482 self.assertEqual(mode, expected)\r
483 finally:\r
484 os.rmdir(dir)\r
485\r
486test_classes.append(test_mkdtemp)\r
487\r
488\r
489class test_mktemp(TC):\r
490 """Test mktemp()."""\r
491\r
492 # For safety, all use of mktemp must occur in a private directory.\r
493 # We must also suppress the RuntimeWarning it generates.\r
494 def setUp(self):\r
495 self.dir = tempfile.mkdtemp()\r
496\r
497 def tearDown(self):\r
498 if self.dir:\r
499 os.rmdir(self.dir)\r
500 self.dir = None\r
501\r
502 class mktemped:\r
503 _unlink = os.unlink\r
504 _bflags = tempfile._bin_openflags\r
505\r
506 def __init__(self, dir, pre, suf):\r
507 self.name = tempfile.mktemp(dir=dir, prefix=pre, suffix=suf)\r
508 # Create the file. This will raise an exception if it's\r
509 # mysteriously appeared in the meanwhile.\r
510 os.close(os.open(self.name, self._bflags, 0600))\r
511\r
512 def __del__(self):\r
513 self._unlink(self.name)\r
514\r
515 def do_create(self, pre="", suf=""):\r
516 try:\r
517 file = self.mktemped(self.dir, pre, suf)\r
518 except:\r
519 self.failOnException("mktemp")\r
520\r
521 self.nameCheck(file.name, self.dir, pre, suf)\r
522 return file\r
523\r
524 def test_basic(self):\r
525 # mktemp can choose usable file names\r
526 self.do_create()\r
527 self.do_create(pre="a")\r
528 self.do_create(suf="b")\r
529 self.do_create(pre="a", suf="b")\r
530 self.do_create(pre="aa", suf=".txt")\r
531\r
532 def test_many(self):\r
533 # mktemp can choose many usable file names (stochastic)\r
534 extant = range(TEST_FILES)\r
535 for i in extant:\r
536 extant[i] = self.do_create(pre="aa")\r
537\r
538## def test_warning(self):\r
539## # mktemp issues a warning when used\r
540## warnings.filterwarnings("error",\r
541## category=RuntimeWarning,\r
542## message="mktemp")\r
543## self.assertRaises(RuntimeWarning,\r
544## tempfile.mktemp, dir=self.dir)\r
545\r
546test_classes.append(test_mktemp)\r
547\r
548\r
549# We test _TemporaryFileWrapper by testing NamedTemporaryFile.\r
550\r
551\r
552class test_NamedTemporaryFile(TC):\r
553 """Test NamedTemporaryFile()."""\r
554\r
555 def do_create(self, dir=None, pre="", suf="", delete=True):\r
556 if dir is None:\r
557 dir = tempfile.gettempdir()\r
558 try:\r
559 file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,\r
560 delete=delete)\r
561 except:\r
562 self.failOnException("NamedTemporaryFile")\r
563\r
564 self.nameCheck(file.name, dir, pre, suf)\r
565 return file\r
566\r
567\r
568 def test_basic(self):\r
569 # NamedTemporaryFile can create files\r
570 self.do_create()\r
571 self.do_create(pre="a")\r
572 self.do_create(suf="b")\r
573 self.do_create(pre="a", suf="b")\r
574 self.do_create(pre="aa", suf=".txt")\r
575\r
576 def test_creates_named(self):\r
577 # NamedTemporaryFile creates files with names\r
578 f = tempfile.NamedTemporaryFile()\r
579 self.assertTrue(os.path.exists(f.name),\r
580 "NamedTemporaryFile %s does not exist" % f.name)\r
581\r
582 def test_del_on_close(self):\r
583 # A NamedTemporaryFile is deleted when closed\r
584 dir = tempfile.mkdtemp()\r
585 try:\r
586 f = tempfile.NamedTemporaryFile(dir=dir)\r
587 f.write('blat')\r
588 f.close()\r
589 self.assertFalse(os.path.exists(f.name),\r
590 "NamedTemporaryFile %s exists after close" % f.name)\r
591 finally:\r
592 os.rmdir(dir)\r
593\r
594 def test_dis_del_on_close(self):\r
595 # Tests that delete-on-close can be disabled\r
596 dir = tempfile.mkdtemp()\r
597 tmp = None\r
598 try:\r
599 f = tempfile.NamedTemporaryFile(dir=dir, delete=False)\r
600 tmp = f.name\r
601 f.write('blat')\r
602 f.close()\r
603 self.assertTrue(os.path.exists(f.name),\r
604 "NamedTemporaryFile %s missing after close" % f.name)\r
605 finally:\r
606 if tmp is not None:\r
607 os.unlink(tmp)\r
608 os.rmdir(dir)\r
609\r
610 def test_multiple_close(self):\r
611 # A NamedTemporaryFile can be closed many times without error\r
612 f = tempfile.NamedTemporaryFile()\r
613 f.write('abc\n')\r
614 f.close()\r
615 try:\r
616 f.close()\r
617 f.close()\r
618 except:\r
619 self.failOnException("close")\r
620\r
621 def test_context_manager(self):\r
622 # A NamedTemporaryFile can be used as a context manager\r
623 with tempfile.NamedTemporaryFile() as f:\r
624 self.assertTrue(os.path.exists(f.name))\r
625 self.assertFalse(os.path.exists(f.name))\r
626 def use_closed():\r
627 with f:\r
628 pass\r
629 self.assertRaises(ValueError, use_closed)\r
630\r
631 # How to test the mode and bufsize parameters?\r
632\r
633test_classes.append(test_NamedTemporaryFile)\r
634\r
635class test_SpooledTemporaryFile(TC):\r
636 """Test SpooledTemporaryFile()."""\r
637\r
638 def do_create(self, max_size=0, dir=None, pre="", suf=""):\r
639 if dir is None:\r
640 dir = tempfile.gettempdir()\r
641 try:\r
642 file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)\r
643 except:\r
644 self.failOnException("SpooledTemporaryFile")\r
645\r
646 return file\r
647\r
648\r
649 def test_basic(self):\r
650 # SpooledTemporaryFile can create files\r
651 f = self.do_create()\r
652 self.assertFalse(f._rolled)\r
653 f = self.do_create(max_size=100, pre="a", suf=".txt")\r
654 self.assertFalse(f._rolled)\r
655\r
656 def test_del_on_close(self):\r
657 # A SpooledTemporaryFile is deleted when closed\r
658 dir = tempfile.mkdtemp()\r
659 try:\r
660 f = tempfile.SpooledTemporaryFile(max_size=10, dir=dir)\r
661 self.assertFalse(f._rolled)\r
662 f.write('blat ' * 5)\r
663 self.assertTrue(f._rolled)\r
664 filename = f.name\r
665 f.close()\r
666 self.assertFalse(os.path.exists(filename),\r
667 "SpooledTemporaryFile %s exists after close" % filename)\r
668 finally:\r
669 os.rmdir(dir)\r
670\r
671 def test_rewrite_small(self):\r
672 # A SpooledTemporaryFile can be written to multiple within the max_size\r
673 f = self.do_create(max_size=30)\r
674 self.assertFalse(f._rolled)\r
675 for i in range(5):\r
676 f.seek(0, 0)\r
677 f.write('x' * 20)\r
678 self.assertFalse(f._rolled)\r
679\r
680 def test_write_sequential(self):\r
681 # A SpooledTemporaryFile should hold exactly max_size bytes, and roll\r
682 # over afterward\r
683 f = self.do_create(max_size=30)\r
684 self.assertFalse(f._rolled)\r
685 f.write('x' * 20)\r
686 self.assertFalse(f._rolled)\r
687 f.write('x' * 10)\r
688 self.assertFalse(f._rolled)\r
689 f.write('x')\r
690 self.assertTrue(f._rolled)\r
691\r
692 def test_writelines(self):\r
693 # Verify writelines with a SpooledTemporaryFile\r
694 f = self.do_create()\r
695 f.writelines((b'x', b'y', b'z'))\r
696 f.seek(0)\r
697 buf = f.read()\r
698 self.assertEqual(buf, b'xyz')\r
699\r
700 def test_writelines_sequential(self):\r
701 # A SpooledTemporaryFile should hold exactly max_size bytes, and roll\r
702 # over afterward\r
703 f = self.do_create(max_size=35)\r
704 f.writelines((b'x' * 20, b'x' * 10, b'x' * 5))\r
705 self.assertFalse(f._rolled)\r
706 f.write(b'x')\r
707 self.assertTrue(f._rolled)\r
708\r
709 def test_sparse(self):\r
710 # A SpooledTemporaryFile that is written late in the file will extend\r
711 # when that occurs\r
712 f = self.do_create(max_size=30)\r
713 self.assertFalse(f._rolled)\r
714 f.seek(100, 0)\r
715 self.assertFalse(f._rolled)\r
716 f.write('x')\r
717 self.assertTrue(f._rolled)\r
718\r
719 def test_fileno(self):\r
720 # A SpooledTemporaryFile should roll over to a real file on fileno()\r
721 f = self.do_create(max_size=30)\r
722 self.assertFalse(f._rolled)\r
723 self.assertTrue(f.fileno() > 0)\r
724 self.assertTrue(f._rolled)\r
725\r
726 def test_multiple_close_before_rollover(self):\r
727 # A SpooledTemporaryFile can be closed many times without error\r
728 f = tempfile.SpooledTemporaryFile()\r
729 f.write('abc\n')\r
730 self.assertFalse(f._rolled)\r
731 f.close()\r
732 try:\r
733 f.close()\r
734 f.close()\r
735 except:\r
736 self.failOnException("close")\r
737\r
738 def test_multiple_close_after_rollover(self):\r
739 # A SpooledTemporaryFile can be closed many times without error\r
740 f = tempfile.SpooledTemporaryFile(max_size=1)\r
741 f.write('abc\n')\r
742 self.assertTrue(f._rolled)\r
743 f.close()\r
744 try:\r
745 f.close()\r
746 f.close()\r
747 except:\r
748 self.failOnException("close")\r
749\r
750 def test_bound_methods(self):\r
751 # It should be OK to steal a bound method from a SpooledTemporaryFile\r
752 # and use it independently; when the file rolls over, those bound\r
753 # methods should continue to function\r
754 f = self.do_create(max_size=30)\r
755 read = f.read\r
756 write = f.write\r
757 seek = f.seek\r
758\r
759 write("a" * 35)\r
760 write("b" * 35)\r
761 seek(0, 0)\r
762 self.assertTrue(read(70) == 'a'*35 + 'b'*35)\r
763\r
764 def test_context_manager_before_rollover(self):\r
765 # A SpooledTemporaryFile can be used as a context manager\r
766 with tempfile.SpooledTemporaryFile(max_size=1) as f:\r
767 self.assertFalse(f._rolled)\r
768 self.assertFalse(f.closed)\r
769 self.assertTrue(f.closed)\r
770 def use_closed():\r
771 with f:\r
772 pass\r
773 self.assertRaises(ValueError, use_closed)\r
774\r
775 def test_context_manager_during_rollover(self):\r
776 # A SpooledTemporaryFile can be used as a context manager\r
777 with tempfile.SpooledTemporaryFile(max_size=1) as f:\r
778 self.assertFalse(f._rolled)\r
779 f.write('abc\n')\r
780 f.flush()\r
781 self.assertTrue(f._rolled)\r
782 self.assertFalse(f.closed)\r
783 self.assertTrue(f.closed)\r
784 def use_closed():\r
785 with f:\r
786 pass\r
787 self.assertRaises(ValueError, use_closed)\r
788\r
789 def test_context_manager_after_rollover(self):\r
790 # A SpooledTemporaryFile can be used as a context manager\r
791 f = tempfile.SpooledTemporaryFile(max_size=1)\r
792 f.write('abc\n')\r
793 f.flush()\r
794 self.assertTrue(f._rolled)\r
795 with f:\r
796 self.assertFalse(f.closed)\r
797 self.assertTrue(f.closed)\r
798 def use_closed():\r
799 with f:\r
800 pass\r
801 self.assertRaises(ValueError, use_closed)\r
802\r
803\r
804test_classes.append(test_SpooledTemporaryFile)\r
805\r
806\r
807class test_TemporaryFile(TC):\r
808 """Test TemporaryFile()."""\r
809\r
810 def test_basic(self):\r
811 # TemporaryFile can create files\r
812 # No point in testing the name params - the file has no name.\r
813 try:\r
814 tempfile.TemporaryFile()\r
815 except:\r
816 self.failOnException("TemporaryFile")\r
817\r
818 def test_has_no_name(self):\r
819 # TemporaryFile creates files with no names (on this system)\r
820 dir = tempfile.mkdtemp()\r
821 f = tempfile.TemporaryFile(dir=dir)\r
822 f.write('blat')\r
823\r
824 # Sneaky: because this file has no name, it should not prevent\r
825 # us from removing the directory it was created in.\r
826 try:\r
827 os.rmdir(dir)\r
828 except:\r
829 ei = sys.exc_info()\r
830 # cleanup\r
831 f.close()\r
832 os.rmdir(dir)\r
833 self.failOnException("rmdir", ei)\r
834\r
835 def test_multiple_close(self):\r
836 # A TemporaryFile can be closed many times without error\r
837 f = tempfile.TemporaryFile()\r
838 f.write('abc\n')\r
839 f.close()\r
840 try:\r
841 f.close()\r
842 f.close()\r
843 except:\r
844 self.failOnException("close")\r
845\r
846 # How to test the mode and bufsize parameters?\r
847\r
848\r
849if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:\r
850 test_classes.append(test_TemporaryFile)\r
851\r
852def test_main():\r
853 test_support.run_unittest(*test_classes)\r
854\r
855if __name__ == "__main__":\r
856 test_main()\r