PageRenderTime 49ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/lib-python/2.7/test/test_tempfile.py

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