]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | # tempfile.py unit tests.\r |
2 | import tempfile\r | |
3 | import os\r | |
4 | import sys\r | |
5 | import re\r | |
6 | import warnings\r | |
7 | \r | |
8 | import unittest\r | |
9 | from test import test_support\r | |
10 | \r | |
11 | warnings.filterwarnings("ignore",\r | |
12 | category=RuntimeWarning,\r | |
13 | message="mktemp", module=__name__)\r | |
14 | \r | |
15 | if hasattr(os, 'stat'):\r | |
16 | import stat\r | |
17 | has_stat = 1\r | |
18 | else:\r | |
19 | has_stat = 0\r | |
20 | \r | |
21 | has_textmode = (tempfile._text_openflags != tempfile._bin_openflags)\r | |
22 | has_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 | |
26 | if sys.platform in ('openbsd3', 'openbsd4'):\r | |
27 | TEST_FILES = 48\r | |
28 | else:\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 | |
36 | class 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 | |
63 | test_classes = []\r | |
64 | \r | |
65 | class 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 | |
91 | test_classes.append(test_exports)\r | |
92 | \r | |
93 | \r | |
94 | class 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 | |
129 | test_classes.append(test__RandomNameSequence)\r | |
130 | \r | |
131 | \r | |
132 | class 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 | |
171 | test_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 | |
177 | class 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 | |
192 | test_classes.append(test__get_candidate_names)\r | |
193 | \r | |
194 | \r | |
195 | class 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 | |
311 | test_classes.append(test__mkstemp_inner)\r | |
312 | \r | |
313 | \r | |
314 | class 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 | |
343 | test_classes.append(test_gettempprefix)\r | |
344 | \r | |
345 | \r | |
346 | class 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 | |
378 | test_classes.append(test_gettempdir)\r | |
379 | \r | |
380 | \r | |
381 | class 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 | |
419 | test_classes.append(test_mkstemp)\r | |
420 | \r | |
421 | \r | |
422 | class 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 | |
486 | test_classes.append(test_mkdtemp)\r | |
487 | \r | |
488 | \r | |
489 | class 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 | |
546 | test_classes.append(test_mktemp)\r | |
547 | \r | |
548 | \r | |
549 | # We test _TemporaryFileWrapper by testing NamedTemporaryFile.\r | |
550 | \r | |
551 | \r | |
552 | class 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 | |
633 | test_classes.append(test_NamedTemporaryFile)\r | |
634 | \r | |
635 | class 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 | |
804 | test_classes.append(test_SpooledTemporaryFile)\r | |
805 | \r | |
806 | \r | |
807 | class 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 | |
849 | if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:\r | |
850 | test_classes.append(test_TemporaryFile)\r | |
851 | \r | |
852 | def test_main():\r | |
853 | test_support.run_unittest(*test_classes)\r | |
854 | \r | |
855 | if __name__ == "__main__":\r | |
856 | test_main()\r |