PageRenderTime 50ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://bitbucket.org/pwaller/pypy
Python | 860 lines | 794 code | 38 blank | 28 comment | 17 complexity | 92719e0f44da46e751958eba7a060516 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.startswith("openbsd"):
  22. TEST_FILES = 64 # ulimit -n defaults to 128 for normal users
  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. test_support.gc_collect()
  189. finally:
  190. os.rmdir(dir)
  191. def test_file_mode(self):
  192. # _mkstemp_inner creates files with the proper mode
  193. if not has_stat:
  194. return # ugh, can't use SkipTest.
  195. file = self.do_create()
  196. mode = stat.S_IMODE(os.stat(file.name).st_mode)
  197. expected = 0600
  198. if sys.platform in ('win32', 'os2emx'):
  199. # There's no distinction among 'user', 'group' and 'world';
  200. # replicate the 'user' bits.
  201. user = expected >> 6
  202. expected = user * (1 + 8 + 64)
  203. self.assertEqual(mode, expected)
  204. def test_noinherit(self):
  205. # _mkstemp_inner file handles are not inherited by child processes
  206. if not has_spawnl:
  207. return # ugh, can't use SkipTest.
  208. if test_support.verbose:
  209. v="v"
  210. else:
  211. v="q"
  212. file = self.do_create()
  213. fd = "%d" % file.fd
  214. try:
  215. me = __file__
  216. except NameError:
  217. me = sys.argv[0]
  218. # We have to exec something, so that FD_CLOEXEC will take
  219. # effect. The core of this test is therefore in
  220. # tf_inherit_check.py, which see.
  221. tester = os.path.join(os.path.dirname(os.path.abspath(me)),
  222. "tf_inherit_check.py")
  223. # On Windows a spawn* /path/ with embedded spaces shouldn't be quoted,
  224. # but an arg with embedded spaces should be decorated with double
  225. # quotes on each end
  226. if sys.platform in ('win32',):
  227. decorated = '"%s"' % sys.executable
  228. tester = '"%s"' % tester
  229. else:
  230. decorated = sys.executable
  231. retval = os.spawnl(os.P_WAIT, sys.executable, decorated, tester, v, fd)
  232. self.assertFalse(retval < 0,
  233. "child process caught fatal signal %d" % -retval)
  234. self.assertFalse(retval > 0, "child process reports failure %d"%retval)
  235. def test_textmode(self):
  236. # _mkstemp_inner can create files in text mode
  237. if not has_textmode:
  238. return # ugh, can't use SkipTest.
  239. self.do_create(bin=0).write("blat\n")
  240. # XXX should test that the file really is a text file
  241. test_classes.append(test__mkstemp_inner)
  242. class test_gettempprefix(TC):
  243. """Test gettempprefix()."""
  244. def test_sane_template(self):
  245. # gettempprefix returns a nonempty prefix string
  246. p = tempfile.gettempprefix()
  247. self.assertIsInstance(p, basestring)
  248. self.assertTrue(len(p) > 0)
  249. def test_usable_template(self):
  250. # gettempprefix returns a usable prefix string
  251. # Create a temp directory, avoiding use of the prefix.
  252. # Then attempt to create a file whose name is
  253. # prefix + 'xxxxxx.xxx' in that directory.
  254. p = tempfile.gettempprefix() + "xxxxxx.xxx"
  255. d = tempfile.mkdtemp(prefix="")
  256. try:
  257. p = os.path.join(d, p)
  258. try:
  259. fd = os.open(p, os.O_RDWR | os.O_CREAT)
  260. except:
  261. self.failOnException("os.open")
  262. os.close(fd)
  263. os.unlink(p)
  264. finally:
  265. os.rmdir(d)
  266. test_classes.append(test_gettempprefix)
  267. class test_gettempdir(TC):
  268. """Test gettempdir()."""
  269. def test_directory_exists(self):
  270. # gettempdir returns a directory which exists
  271. dir = tempfile.gettempdir()
  272. self.assertTrue(os.path.isabs(dir) or dir == os.curdir,
  273. "%s is not an absolute path" % dir)
  274. self.assertTrue(os.path.isdir(dir),
  275. "%s is not a directory" % dir)
  276. def test_directory_writable(self):
  277. # gettempdir returns a directory writable by the user
  278. # sneaky: just instantiate a NamedTemporaryFile, which
  279. # defaults to writing into the directory returned by
  280. # gettempdir.
  281. try:
  282. file = tempfile.NamedTemporaryFile()
  283. file.write("blat")
  284. file.close()
  285. except:
  286. self.failOnException("create file in %s" % tempfile.gettempdir())
  287. def test_same_thing(self):
  288. # gettempdir always returns the same object
  289. a = tempfile.gettempdir()
  290. b = tempfile.gettempdir()
  291. self.assertTrue(a is b)
  292. test_classes.append(test_gettempdir)
  293. class test_mkstemp(TC):
  294. """Test mkstemp()."""
  295. def do_create(self, dir=None, pre="", suf=""):
  296. if dir is None:
  297. dir = tempfile.gettempdir()
  298. try:
  299. (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)
  300. (ndir, nbase) = os.path.split(name)
  301. adir = os.path.abspath(dir)
  302. self.assertEqual(adir, ndir,
  303. "Directory '%s' incorrectly returned as '%s'" % (adir, ndir))
  304. except:
  305. self.failOnException("mkstemp")
  306. try:
  307. self.nameCheck(name, dir, pre, suf)
  308. finally:
  309. os.close(fd)
  310. os.unlink(name)
  311. def test_basic(self):
  312. # mkstemp can create files
  313. self.do_create()
  314. self.do_create(pre="a")
  315. self.do_create(suf="b")
  316. self.do_create(pre="a", suf="b")
  317. self.do_create(pre="aa", suf=".txt")
  318. self.do_create(dir=".")
  319. def test_choose_directory(self):
  320. # mkstemp can create directories in a user-selected directory
  321. dir = tempfile.mkdtemp()
  322. try:
  323. self.do_create(dir=dir)
  324. finally:
  325. os.rmdir(dir)
  326. test_classes.append(test_mkstemp)
  327. class test_mkdtemp(TC):
  328. """Test mkdtemp()."""
  329. def do_create(self, dir=None, pre="", suf=""):
  330. if dir is None:
  331. dir = tempfile.gettempdir()
  332. try:
  333. name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)
  334. except:
  335. self.failOnException("mkdtemp")
  336. try:
  337. self.nameCheck(name, dir, pre, suf)
  338. return name
  339. except:
  340. os.rmdir(name)
  341. raise
  342. def test_basic(self):
  343. # mkdtemp can create directories
  344. os.rmdir(self.do_create())
  345. os.rmdir(self.do_create(pre="a"))
  346. os.rmdir(self.do_create(suf="b"))
  347. os.rmdir(self.do_create(pre="a", suf="b"))
  348. os.rmdir(self.do_create(pre="aa", suf=".txt"))
  349. def test_basic_many(self):
  350. # mkdtemp can create many directories (stochastic)
  351. extant = range(TEST_FILES)
  352. try:
  353. for i in extant:
  354. extant[i] = self.do_create(pre="aa")
  355. finally:
  356. for i in extant:
  357. if(isinstance(i, basestring)):
  358. os.rmdir(i)
  359. def test_choose_directory(self):
  360. # mkdtemp can create directories in a user-selected directory
  361. dir = tempfile.mkdtemp()
  362. try:
  363. os.rmdir(self.do_create(dir=dir))
  364. finally:
  365. os.rmdir(dir)
  366. def test_mode(self):
  367. # mkdtemp creates directories with the proper mode
  368. if not has_stat:
  369. return # ugh, can't use SkipTest.
  370. dir = self.do_create()
  371. try:
  372. mode = stat.S_IMODE(os.stat(dir).st_mode)
  373. mode &= 0777 # Mask off sticky bits inherited from /tmp
  374. expected = 0700
  375. if sys.platform in ('win32', 'os2emx'):
  376. # There's no distinction among 'user', 'group' and 'world';
  377. # replicate the 'user' bits.
  378. user = expected >> 6
  379. expected = user * (1 + 8 + 64)
  380. self.assertEqual(mode, expected)
  381. finally:
  382. os.rmdir(dir)
  383. test_classes.append(test_mkdtemp)
  384. class test_mktemp(TC):
  385. """Test mktemp()."""
  386. # For safety, all use of mktemp must occur in a private directory.
  387. # We must also suppress the RuntimeWarning it generates.
  388. def setUp(self):
  389. self.dir = tempfile.mkdtemp()
  390. def tearDown(self):
  391. if self.dir:
  392. os.rmdir(self.dir)
  393. self.dir = None
  394. class mktemped:
  395. _unlink = os.unlink
  396. _bflags = tempfile._bin_openflags
  397. def __init__(self, dir, pre, suf):
  398. self.name = tempfile.mktemp(dir=dir, prefix=pre, suffix=suf)
  399. # Create the file. This will raise an exception if it's
  400. # mysteriously appeared in the meanwhile.
  401. os.close(os.open(self.name, self._bflags, 0600))
  402. def __del__(self):
  403. self._unlink(self.name)
  404. def do_create(self, pre="", suf=""):
  405. try:
  406. file = self.mktemped(self.dir, pre, suf)
  407. except:
  408. self.failOnException("mktemp")
  409. self.nameCheck(file.name, self.dir, pre, suf)
  410. return file
  411. def test_basic(self):
  412. # mktemp can choose usable file names
  413. self.do_create()
  414. self.do_create(pre="a")
  415. self.do_create(suf="b")
  416. self.do_create(pre="a", suf="b")
  417. self.do_create(pre="aa", suf=".txt")
  418. test_support.gc_collect()
  419. def test_many(self):
  420. # mktemp can choose many usable file names (stochastic)
  421. extant = range(TEST_FILES)
  422. for i in extant:
  423. extant[i] = self.do_create(pre="aa")
  424. del extant
  425. test_support.gc_collect()
  426. ## def test_warning(self):
  427. ## # mktemp issues a warning when used
  428. ## warnings.filterwarnings("error",
  429. ## category=RuntimeWarning,
  430. ## message="mktemp")
  431. ## self.assertRaises(RuntimeWarning,
  432. ## tempfile.mktemp, dir=self.dir)
  433. test_classes.append(test_mktemp)
  434. # We test _TemporaryFileWrapper by testing NamedTemporaryFile.
  435. class test_NamedTemporaryFile(TC):
  436. """Test NamedTemporaryFile()."""
  437. def do_create(self, dir=None, pre="", suf="", delete=True):
  438. if dir is None:
  439. dir = tempfile.gettempdir()
  440. try:
  441. file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,
  442. delete=delete)
  443. except:
  444. self.failOnException("NamedTemporaryFile")
  445. self.nameCheck(file.name, dir, pre, suf)
  446. return file
  447. def test_basic(self):
  448. # NamedTemporaryFile can create files
  449. self.do_create()
  450. self.do_create(pre="a")
  451. self.do_create(suf="b")
  452. self.do_create(pre="a", suf="b")
  453. self.do_create(pre="aa", suf=".txt")
  454. def test_creates_named(self):
  455. # NamedTemporaryFile creates files with names
  456. f = tempfile.NamedTemporaryFile()
  457. self.assertTrue(os.path.exists(f.name),
  458. "NamedTemporaryFile %s does not exist" % f.name)
  459. def test_del_on_close(self):
  460. # A NamedTemporaryFile is deleted when closed
  461. dir = tempfile.mkdtemp()
  462. try:
  463. f = tempfile.NamedTemporaryFile(dir=dir)
  464. f.write('blat')
  465. f.close()
  466. self.assertFalse(os.path.exists(f.name),
  467. "NamedTemporaryFile %s exists after close" % f.name)
  468. finally:
  469. os.rmdir(dir)
  470. def test_dis_del_on_close(self):
  471. # Tests that delete-on-close can be disabled
  472. dir = tempfile.mkdtemp()
  473. tmp = None
  474. try:
  475. f = tempfile.NamedTemporaryFile(dir=dir, delete=False)
  476. tmp = f.name
  477. f.write('blat')
  478. f.close()
  479. self.assertTrue(os.path.exists(f.name),
  480. "NamedTemporaryFile %s missing after close" % f.name)
  481. finally:
  482. if tmp is not None:
  483. os.unlink(tmp)
  484. os.rmdir(dir)
  485. def test_multiple_close(self):
  486. # A NamedTemporaryFile can be closed many times without error
  487. f = tempfile.NamedTemporaryFile()
  488. f.write('abc\n')
  489. f.close()
  490. try:
  491. f.close()
  492. f.close()
  493. except:
  494. self.failOnException("close")
  495. def test_context_manager(self):
  496. # A NamedTemporaryFile can be used as a context manager
  497. with tempfile.NamedTemporaryFile() as f:
  498. self.assertTrue(os.path.exists(f.name))
  499. self.assertFalse(os.path.exists(f.name))
  500. def use_closed():
  501. with f:
  502. pass
  503. self.assertRaises(ValueError, use_closed)
  504. # How to test the mode and bufsize parameters?
  505. test_classes.append(test_NamedTemporaryFile)
  506. class test_SpooledTemporaryFile(TC):
  507. """Test SpooledTemporaryFile()."""
  508. def do_create(self, max_size=0, dir=None, pre="", suf=""):
  509. if dir is None:
  510. dir = tempfile.gettempdir()
  511. try:
  512. file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)
  513. except:
  514. self.failOnException("SpooledTemporaryFile")
  515. return file
  516. def test_basic(self):
  517. # SpooledTemporaryFile can create files
  518. f = self.do_create()
  519. self.assertFalse(f._rolled)
  520. f = self.do_create(max_size=100, pre="a", suf=".txt")
  521. self.assertFalse(f._rolled)
  522. def test_del_on_close(self):
  523. # A SpooledTemporaryFile is deleted when closed
  524. dir = tempfile.mkdtemp()
  525. try:
  526. f = tempfile.SpooledTemporaryFile(max_size=10, dir=dir)
  527. self.assertFalse(f._rolled)
  528. f.write('blat ' * 5)
  529. self.assertTrue(f._rolled)
  530. filename = f.name
  531. f.close()
  532. self.assertFalse(os.path.exists(filename),
  533. "SpooledTemporaryFile %s exists after close" % filename)
  534. finally:
  535. os.rmdir(dir)
  536. def test_rewrite_small(self):
  537. # A SpooledTemporaryFile can be written to multiple within the max_size
  538. f = self.do_create(max_size=30)
  539. self.assertFalse(f._rolled)
  540. for i in range(5):
  541. f.seek(0, 0)
  542. f.write('x' * 20)
  543. self.assertFalse(f._rolled)
  544. def test_write_sequential(self):
  545. # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
  546. # over afterward
  547. f = self.do_create(max_size=30)
  548. self.assertFalse(f._rolled)
  549. f.write('x' * 20)
  550. self.assertFalse(f._rolled)
  551. f.write('x' * 10)
  552. self.assertFalse(f._rolled)
  553. f.write('x')
  554. self.assertTrue(f._rolled)
  555. def test_writelines(self):
  556. # Verify writelines with a SpooledTemporaryFile
  557. f = self.do_create()
  558. f.writelines((b'x', b'y', b'z'))
  559. f.seek(0)
  560. buf = f.read()
  561. self.assertEqual(buf, b'xyz')
  562. def test_writelines_sequential(self):
  563. # A SpooledTemporaryFile should hold exactly max_size bytes, and roll
  564. # over afterward
  565. f = self.do_create(max_size=35)
  566. f.writelines((b'x' * 20, b'x' * 10, b'x' * 5))
  567. self.assertFalse(f._rolled)
  568. f.write(b'x')
  569. self.assertTrue(f._rolled)
  570. def test_sparse(self):
  571. # A SpooledTemporaryFile that is written late in the file will extend
  572. # when that occurs
  573. f = self.do_create(max_size=30)
  574. self.assertFalse(f._rolled)
  575. f.seek(100, 0)
  576. self.assertFalse(f._rolled)
  577. f.write('x')
  578. self.assertTrue(f._rolled)
  579. def test_fileno(self):
  580. # A SpooledTemporaryFile should roll over to a real file on fileno()
  581. f = self.do_create(max_size=30)
  582. self.assertFalse(f._rolled)
  583. self.assertTrue(f.fileno() > 0)
  584. self.assertTrue(f._rolled)
  585. def test_multiple_close_before_rollover(self):
  586. # A SpooledTemporaryFile can be closed many times without error
  587. f = tempfile.SpooledTemporaryFile()
  588. f.write('abc\n')
  589. self.assertFalse(f._rolled)
  590. f.close()
  591. try:
  592. f.close()
  593. f.close()
  594. except:
  595. self.failOnException("close")
  596. def test_multiple_close_after_rollover(self):
  597. # A SpooledTemporaryFile can be closed many times without error
  598. f = tempfile.SpooledTemporaryFile(max_size=1)
  599. f.write('abc\n')
  600. self.assertTrue(f._rolled)
  601. f.close()
  602. try:
  603. f.close()
  604. f.close()
  605. except:
  606. self.failOnException("close")
  607. def test_bound_methods(self):
  608. # It should be OK to steal a bound method from a SpooledTemporaryFile
  609. # and use it independently; when the file rolls over, those bound
  610. # methods should continue to function
  611. f = self.do_create(max_size=30)
  612. read = f.read
  613. write = f.write
  614. seek = f.seek
  615. write("a" * 35)
  616. write("b" * 35)
  617. seek(0, 0)
  618. self.assertTrue(read(70) == 'a'*35 + 'b'*35)
  619. def test_context_manager_before_rollover(self):
  620. # A SpooledTemporaryFile can be used as a context manager
  621. with tempfile.SpooledTemporaryFile(max_size=1) as f:
  622. self.assertFalse(f._rolled)
  623. self.assertFalse(f.closed)
  624. self.assertTrue(f.closed)
  625. def use_closed():
  626. with f:
  627. pass
  628. self.assertRaises(ValueError, use_closed)
  629. def test_context_manager_during_rollover(self):
  630. # A SpooledTemporaryFile can be used as a context manager
  631. with tempfile.SpooledTemporaryFile(max_size=1) as f:
  632. self.assertFalse(f._rolled)
  633. f.write('abc\n')
  634. f.flush()
  635. self.assertTrue(f._rolled)
  636. self.assertFalse(f.closed)
  637. self.assertTrue(f.closed)
  638. def use_closed():
  639. with f:
  640. pass
  641. self.assertRaises(ValueError, use_closed)
  642. def test_context_manager_after_rollover(self):
  643. # A SpooledTemporaryFile can be used as a context manager
  644. f = tempfile.SpooledTemporaryFile(max_size=1)
  645. f.write('abc\n')
  646. f.flush()
  647. self.assertTrue(f._rolled)
  648. with f:
  649. self.assertFalse(f.closed)
  650. self.assertTrue(f.closed)
  651. def use_closed():
  652. with f:
  653. pass
  654. self.assertRaises(ValueError, use_closed)
  655. test_classes.append(test_SpooledTemporaryFile)
  656. class test_TemporaryFile(TC):
  657. """Test TemporaryFile()."""
  658. def test_basic(self):
  659. # TemporaryFile can create files
  660. # No point in testing the name params - the file has no name.
  661. try:
  662. tempfile.TemporaryFile()
  663. except:
  664. self.failOnException("TemporaryFile")
  665. def test_has_no_name(self):
  666. # TemporaryFile creates files with no names (on this system)
  667. dir = tempfile.mkdtemp()
  668. f = tempfile.TemporaryFile(dir=dir)
  669. f.write('blat')
  670. # Sneaky: because this file has no name, it should not prevent
  671. # us from removing the directory it was created in.
  672. try:
  673. os.rmdir(dir)
  674. except:
  675. ei = sys.exc_info()
  676. # cleanup
  677. f.close()
  678. os.rmdir(dir)
  679. self.failOnException("rmdir", ei)
  680. def test_multiple_close(self):
  681. # A TemporaryFile can be closed many times without error
  682. f = tempfile.TemporaryFile()
  683. f.write('abc\n')
  684. f.close()
  685. try:
  686. f.close()
  687. f.close()
  688. except:
  689. self.failOnException("close")
  690. # How to test the mode and bufsize parameters?
  691. if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
  692. test_classes.append(test_TemporaryFile)
  693. def test_main():
  694. test_support.run_unittest(*test_classes)
  695. if __name__ == "__main__":
  696. test_main()