10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# tempfile.py unit tests. 20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport tempfile 30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport errno 40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport io 50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os 60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport signal 70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport shutil 80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys 90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport re 100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport warnings 110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest 130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support as support 140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiwarnings.filterwarnings("ignore", 160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi category=RuntimeWarning, 170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi message="mktemp", module=__name__) 180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(os, 'stat'): 200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import stat 210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi has_stat = 1 220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse: 230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi has_stat = 0 240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yihas_textmode = (tempfile._text_openflags != tempfile._bin_openflags) 260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yihas_spawnl = hasattr(os, 'spawnl') 270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# TEST_FILES may need to be tweaked for systems depending on the maximum 290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# number of files that can be opened at one time (see ulimit -n) 300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif sys.platform in ('openbsd3', 'openbsd4'): 310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi TEST_FILES = 48 320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse: 330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi TEST_FILES = 100 340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# This is organized as one test for each chunk of code in tempfile.py, 360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# in order of their appearance in the file. Testing which requires 370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# threads is not done here. 380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Common functionality. 400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TC(unittest.TestCase): 410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi str_check = re.compile(r"[a-zA-Z0-9_-]{6}$") 430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def failOnException(self, what, ei=None): 450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if ei is None: 460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ei = sys.exc_info() 470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("%s raised %s: %s" % (what, ei[0], ei[1])) 480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def nameCheck(self, name, dir, pre, suf): 500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (ndir, nbase) = os.path.split(name) 510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi npre = nbase[:len(pre)] 520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi nsuf = nbase[len(nbase)-len(suf):] 530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # check for equality of the absolute paths! 550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(os.path.abspath(ndir), os.path.abspath(dir), 560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "file '%s' not in directory '%s'" % (name, dir)) 570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(npre, pre, 580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "file '%s' does not begin with '%s'" % (nbase, pre)) 590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(nsuf, suf, 600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "file '%s' does not end with '%s'" % (nbase, suf)) 610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi nbase = nbase[len(pre):len(nbase)-len(suf)] 630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(self.str_check.match(nbase), 640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/" 650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi % nbase) 660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes = [] 680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_exports(TC): 700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_exports(self): 710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # There are no surprising symbols in the tempfile module 720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict = tempfile.__dict__ 730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expected = { 750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "NamedTemporaryFile" : 1, 760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "TemporaryFile" : 1, 770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "mkstemp" : 1, 780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "mkdtemp" : 1, 790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "mktemp" : 1, 800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "TMP_MAX" : 1, 810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "gettempprefix" : 1, 820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "gettempdir" : 1, 830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "tempdir" : 1, 840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "template" : 1, 850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "SpooledTemporaryFile" : 1 860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi } 870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unexp = [] 890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for key in dict: 900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if key[0] != '_' and key not in expected: 910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unexp.append(key) 920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(len(unexp) == 0, 930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "unexpected keys: %s" % unexp) 940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_exports) 960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test__RandomNameSequence(TC): 990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test the internal iterator object _RandomNameSequence.""" 1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setUp(self): 1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.r = tempfile._RandomNameSequence() 1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_get_six_char_str(self): 1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _RandomNameSequence returns a six-character string 1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = self.r.next() 1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.nameCheck(s, '', '', '') 1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_many(self): 1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _RandomNameSequence returns no duplicate strings (stochastic) 1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict = {} 1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi r = self.r 1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in xrange(TEST_FILES): 1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = r.next() 1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.nameCheck(s, '', '', '') 1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(s, dict) 1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict[s] = 1 1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_supports_iter(self): 1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _RandomNameSequence supports the iterator protocol 1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi i = 0 1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi r = self.r 1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for s in r: 1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi i += 1 1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if i == 20: 1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi break 1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("iteration") 1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @unittest.skipUnless(hasattr(os, 'fork'), 1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "os.fork is required for this test") 1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_process_awareness(self): 1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # ensure that the random source differs between 1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # child and parent. 1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi read_fd, write_fd = os.pipe() 1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pid = None 1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pid = os.fork() 1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not pid: 1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.close(read_fd) 1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.write(write_fd, next(self.r).encode("ascii")) 1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.close(write_fd) 1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # bypass the normal exit handlers- leave those to 1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the parent. 1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os._exit(0) 1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi parent_value = next(self.r) 1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi child_value = os.read(read_fd, len(parent_value)).decode("ascii") 1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if pid: 1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # best effort to ensure the process can't bleed out 1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # via any bugs above 1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.kill(pid, signal.SIGKILL) 1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except EnvironmentError: 1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.close(read_fd) 1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.close(write_fd) 1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(child_value, parent_value) 1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test__RandomNameSequence) 1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test__candidate_tempdir_list(TC): 1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test the internal function _candidate_tempdir_list.""" 1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_nonempty_list(self): 1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _candidate_tempdir_list returns a nonempty list of strings 1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cand = tempfile._candidate_tempdir_list() 1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(len(cand) == 0) 1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for c in cand: 1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(c, basestring) 1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_wanted_dirs(self): 1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _candidate_tempdir_list contains the expected directories 1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Make sure the interesting environment variables are all set. 1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with support.EnvironmentVarGuard() as env: 1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for envname in 'TMPDIR', 'TEMP', 'TMP': 1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirname = os.getenv(envname) 1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not dirname: 1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi env[envname] = os.path.abspath(envname) 1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cand = tempfile._candidate_tempdir_list() 1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for envname in 'TMPDIR', 'TEMP', 'TMP': 1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirname = os.getenv(envname) 1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not dirname: raise ValueError 1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn(dirname, cand) 1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirname = os.getcwd() 1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (AttributeError, os.error): 1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dirname = os.curdir 2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn(dirname, cand) 2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Not practical to try to verify the presence of OS-specific 2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # paths in this list. 2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test__candidate_tempdir_list) 2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# We test _get_default_tempdir some more by testing gettempdir. 2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestGetDefaultTempdir(TC): 2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test _get_default_tempdir().""" 2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_no_files_left_behind(self): 2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # use a private empty directory 2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi our_temp_directory = tempfile.mkdtemp() 2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # force _get_default_tempdir() to consider our empty directory 2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def our_candidate_list(): 2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return [our_temp_directory] 2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with support.swap_attr(tempfile, "_candidate_tempdir_list", 2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi our_candidate_list): 2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # verify our directory is empty after _get_default_tempdir() 2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tempfile._get_default_tempdir() 2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(os.listdir(our_temp_directory), []) 2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def raise_OSError(*args, **kwargs): 2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise OSError(-1) 2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with support.swap_attr(io, "open", raise_OSError): 2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # test again with failing io.open() 2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(IOError) as cm: 2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tempfile._get_default_tempdir() 2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cm.exception.errno, errno.ENOENT) 2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(os.listdir(our_temp_directory), []) 2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi open = io.open 2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def bad_writer(*args, **kwargs): 2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fp = open(*args, **kwargs) 2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fp.write = raise_OSError 2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return fp 2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with support.swap_attr(io, "open", bad_writer): 2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # test again with failing write() 2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(IOError) as cm: 2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tempfile._get_default_tempdir() 2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cm.exception.errno, errno.ENOENT) 2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(os.listdir(our_temp_directory), []) 2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi shutil.rmtree(our_temp_directory) 2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(TestGetDefaultTempdir) 2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test__get_candidate_names(TC): 2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test the internal function _get_candidate_names.""" 2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_retval(self): 2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _get_candidate_names returns a _RandomNameSequence object 2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi obj = tempfile._get_candidate_names() 2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(obj, tempfile._RandomNameSequence) 2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_same_thing(self): 2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _get_candidate_names always returns the same object 2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = tempfile._get_candidate_names() 2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = tempfile._get_candidate_names() 2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(a is b) 2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test__get_candidate_names) 2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test__mkstemp_inner(TC): 2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test the internal function _mkstemp_inner.""" 2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class mkstemped: 2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _bflags = tempfile._bin_openflags 2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _tflags = tempfile._text_openflags 2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _close = os.close 2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _unlink = os.unlink 2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, dir, pre, suf, bin): 2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if bin: flags = self._bflags 2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: flags = self._tflags 2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (self.fd, self.name) = tempfile._mkstemp_inner(dir, pre, suf, flags) 2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def write(self, str): 2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.write(self.fd, str) 2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._close(self.fd) 2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._unlink(self.name) 2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_create(self, dir=None, pre="", suf="", bin=1): 2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.gettempdir() 2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self.mkstemped(dir, pre, suf, bin) 3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("_mkstemp_inner") 3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.nameCheck(file.name, dir, pre, suf) 3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return file 3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic(self): 3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _mkstemp_inner can create files 3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create().write("blat") 3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a").write("blat") 3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(suf="b").write("blat") 3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a", suf="b").write("blat") 3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="aa", suf=".txt").write("blat") 3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic_many(self): 3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _mkstemp_inner can create many files (stochastic) 3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi extant = range(TEST_FILES) 3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in extant: 3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi extant[i] = self.do_create(pre="aa") 3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_choose_directory(self): 3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _mkstemp_inner can create files in a user-selected directory 3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.mkdtemp() 3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(dir=dir).write("blat") 3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_file_mode(self): 3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _mkstemp_inner creates files with the proper mode 3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not has_stat: 3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return # ugh, can't use SkipTest. 3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self.do_create() 3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mode = stat.S_IMODE(os.stat(file.name).st_mode) 3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expected = 0600 3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if sys.platform in ('win32', 'os2emx'): 3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # There's no distinction among 'user', 'group' and 'world'; 3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # replicate the 'user' bits. 3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi user = expected >> 6 3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expected = user * (1 + 8 + 64) 3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(mode, expected) 3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_noinherit(self): 3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _mkstemp_inner file handles are not inherited by child processes 3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not has_spawnl: 3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return # ugh, can't use SkipTest. 3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if support.verbose: 3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi v="v" 3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi v="q" 3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self.do_create() 3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fd = "%d" % file.fd 3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi me = __file__ 3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except NameError: 3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi me = sys.argv[0] 3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # We have to exec something, so that FD_CLOEXEC will take 3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # effect. The core of this test is therefore in 3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # tf_inherit_check.py, which see. 3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tester = os.path.join(os.path.dirname(os.path.abspath(me)), 3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "tf_inherit_check.py") 3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # On Windows a spawn* /path/ with embedded spaces shouldn't be quoted, 3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # but an arg with embedded spaces should be decorated with double 3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # quotes on each end 3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if sys.platform in ('win32',): 3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi decorated = '"%s"' % sys.executable 3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tester = '"%s"' % tester 3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi decorated = sys.executable 3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi retval = os.spawnl(os.P_WAIT, sys.executable, decorated, tester, v, fd) 3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(retval < 0, 3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "child process caught fatal signal %d" % -retval) 3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(retval > 0, "child process reports failure %d"%retval) 3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_textmode(self): 3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _mkstemp_inner can create files in text mode 3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not has_textmode: 3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return # ugh, can't use SkipTest. 3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(bin=0).write("blat\n") 3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # XXX should test that the file really is a text file 3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test__mkstemp_inner) 3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_gettempprefix(TC): 3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test gettempprefix().""" 3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_sane_template(self): 3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # gettempprefix returns a nonempty prefix string 3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p = tempfile.gettempprefix() 3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(p, basestring) 4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(len(p) > 0) 4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_usable_template(self): 4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # gettempprefix returns a usable prefix string 4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Create a temp directory, avoiding use of the prefix. 4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Then attempt to create a file whose name is 4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # prefix + 'xxxxxx.xxx' in that directory. 4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p = tempfile.gettempprefix() + "xxxxxx.xxx" 4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = tempfile.mkdtemp(prefix="") 4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p = os.path.join(d, p) 4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fd = os.open(p, os.O_RDWR | os.O_CREAT) 4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("os.open") 4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.close(fd) 4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.unlink(p) 4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(d) 4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_gettempprefix) 4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_gettempdir(TC): 4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test gettempdir().""" 4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_directory_exists(self): 4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # gettempdir returns a directory which exists 4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.gettempdir() 4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(os.path.isabs(dir) or dir == os.curdir, 4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "%s is not an absolute path" % dir) 4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(os.path.isdir(dir), 4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "%s is not a directory" % dir) 4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_directory_writable(self): 4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # gettempdir returns a directory writable by the user 4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # sneaky: just instantiate a NamedTemporaryFile, which 4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # defaults to writing into the directory returned by 4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # gettempdir. 4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = tempfile.NamedTemporaryFile() 4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file.write("blat") 4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file.close() 4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("create file in %s" % tempfile.gettempdir()) 4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_same_thing(self): 4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # gettempdir always returns the same object 4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = tempfile.gettempdir() 4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = tempfile.gettempdir() 4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(a is b) 4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_gettempdir) 4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_mkstemp(TC): 4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test mkstemp().""" 4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_create(self, dir=None, pre="", suf=""): 4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.gettempdir() 4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf) 4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (ndir, nbase) = os.path.split(name) 4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi adir = os.path.abspath(dir) 4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(adir, ndir, 4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "Directory '%s' incorrectly returned as '%s'" % (adir, ndir)) 4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("mkstemp") 4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.nameCheck(name, dir, pre, suf) 4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.close(fd) 4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.unlink(name) 4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic(self): 4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mkstemp can create files 4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create() 4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a") 4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(suf="b") 4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a", suf="b") 4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="aa", suf=".txt") 4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(dir=".") 4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_choose_directory(self): 4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mkstemp can create directories in a user-selected directory 4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.mkdtemp() 4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(dir=dir) 4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_mkstemp) 4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_mkdtemp(TC): 5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test mkdtemp().""" 5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_create(self, dir=None, pre="", suf=""): 5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.gettempdir() 5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf) 5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("mkdtemp") 5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.nameCheck(name, dir, pre, suf) 5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return name 5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(name) 5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise 5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic(self): 5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mkdtemp can create directories 5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self.do_create()) 5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self.do_create(pre="a")) 5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self.do_create(suf="b")) 5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self.do_create(pre="a", suf="b")) 5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self.do_create(pre="aa", suf=".txt")) 5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic_many(self): 5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mkdtemp can create many directories (stochastic) 5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi extant = range(TEST_FILES) 5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in extant: 5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi extant[i] = self.do_create(pre="aa") 5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in extant: 5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if(isinstance(i, basestring)): 5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(i) 5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_choose_directory(self): 5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mkdtemp can create directories in a user-selected directory 5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.mkdtemp() 5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self.do_create(dir=dir)) 5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_mode(self): 5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mkdtemp creates directories with the proper mode 5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not has_stat: 5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return # ugh, can't use SkipTest. 5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = self.do_create() 5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mode = stat.S_IMODE(os.stat(dir).st_mode) 5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mode &= 0777 # Mask off sticky bits inherited from /tmp 5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expected = 0700 5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if sys.platform in ('win32', 'os2emx'): 5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # There's no distinction among 'user', 'group' and 'world'; 5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # replicate the 'user' bits. 5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi user = expected >> 6 5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expected = user * (1 + 8 + 64) 5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(mode, expected) 5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_mkdtemp) 5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_mktemp(TC): 5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test mktemp().""" 5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # For safety, all use of mktemp must occur in a private directory. 5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # We must also suppress the RuntimeWarning it generates. 5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setUp(self): 5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.dir = tempfile.mkdtemp() 5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def tearDown(self): 5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.dir: 5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(self.dir) 5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.dir = None 5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class mktemped: 5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _unlink = os.unlink 5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _bflags = tempfile._bin_openflags 5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, dir, pre, suf): 5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.name = tempfile.mktemp(dir=dir, prefix=pre, suffix=suf) 5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Create the file. This will raise an exception if it's 5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mysteriously appeared in the meanwhile. 5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.close(os.open(self.name, self._bflags, 0600)) 5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._unlink(self.name) 5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_create(self, pre="", suf=""): 5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = self.mktemped(self.dir, pre, suf) 5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("mktemp") 5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.nameCheck(file.name, self.dir, pre, suf) 6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return file 6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic(self): 6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mktemp can choose usable file names 6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create() 6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a") 6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(suf="b") 6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a", suf="b") 6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="aa", suf=".txt") 6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_many(self): 6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # mktemp can choose many usable file names (stochastic) 6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi extant = range(TEST_FILES) 6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in extant: 6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi extant[i] = self.do_create(pre="aa") 6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## def test_warning(self): 6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## # mktemp issues a warning when used 6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## warnings.filterwarnings("error", 6190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## category=RuntimeWarning, 6200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## message="mktemp") 6210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## self.assertRaises(RuntimeWarning, 6220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi## tempfile.mktemp, dir=self.dir) 6230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_mktemp) 6250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# We test _TemporaryFileWrapper by testing NamedTemporaryFile. 6280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_NamedTemporaryFile(TC): 6310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test NamedTemporaryFile().""" 6320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_create(self, dir=None, pre="", suf="", delete=True): 6340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 6350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.gettempdir() 6360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf, 6380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi delete=delete) 6390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 6400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("NamedTemporaryFile") 6410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.nameCheck(file.name, dir, pre, suf) 6430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return file 6440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic(self): 6470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # NamedTemporaryFile can create files 6480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create() 6490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a") 6500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(suf="b") 6510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="a", suf="b") 6520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.do_create(pre="aa", suf=".txt") 6530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_creates_named(self): 6550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # NamedTemporaryFile creates files with names 6560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.NamedTemporaryFile() 6570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(os.path.exists(f.name), 6580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "NamedTemporaryFile %s does not exist" % f.name) 6590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_del_on_close(self): 6610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A NamedTemporaryFile is deleted when closed 6620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.mkdtemp() 6630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.NamedTemporaryFile(dir=dir) 6650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('blat') 6660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 6670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(os.path.exists(f.name), 6680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "NamedTemporaryFile %s exists after close" % f.name) 6690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 6700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 6710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_dis_del_on_close(self): 6730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Tests that delete-on-close can be disabled 6740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.mkdtemp() 6750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tmp = None 6760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.NamedTemporaryFile(dir=dir, delete=False) 6780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tmp = f.name 6790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('blat') 6800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 6810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(os.path.exists(f.name), 6820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "NamedTemporaryFile %s missing after close" % f.name) 6830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 6840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if tmp is not None: 6850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.unlink(tmp) 6860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 6870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_multiple_close(self): 6890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A NamedTemporaryFile can be closed many times without error 6900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.NamedTemporaryFile() 6910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('abc\n') 6920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 6930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 6950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 6960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 6970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("close") 6980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_context_manager(self): 7000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A NamedTemporaryFile can be used as a context manager 7010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with tempfile.NamedTemporaryFile() as f: 7020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(os.path.exists(f.name)) 7030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(os.path.exists(f.name)) 7040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def use_closed(): 7050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with f: 7060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 7070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(ValueError, use_closed) 7080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # How to test the mode and bufsize parameters? 7100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_NamedTemporaryFile) 7120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_SpooledTemporaryFile(TC): 7140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test SpooledTemporaryFile().""" 7150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_create(self, max_size=0, dir=None, pre="", suf=""): 7170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if dir is None: 7180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.gettempdir() 7190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 7200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf) 7210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 7220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("SpooledTemporaryFile") 7230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return file 7250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic(self): 7280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SpooledTemporaryFile can create files 7290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create() 7300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=100, pre="a", suf=".txt") 7320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_del_on_close(self): 7350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile is deleted when closed 7360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.mkdtemp() 7370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 7380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.SpooledTemporaryFile(max_size=10, dir=dir) 7390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('blat ' * 5) 7410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 7420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi filename = f.name 7430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 7440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(os.path.exists(filename), 7450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "SpooledTemporaryFile %s exists after close" % filename) 7460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 7470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 7480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_rewrite_small(self): 7500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile can be written to multiple within the max_size 7510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=30) 7520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(5): 7540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.seek(0, 0) 7550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('x' * 20) 7560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_write_sequential(self): 7590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile should hold exactly max_size bytes, and roll 7600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # over afterward 7610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=30) 7620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('x' * 20) 7640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('x' * 10) 7660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('x') 7680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 7690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_writelines(self): 7710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Verify writelines with a SpooledTemporaryFile 7720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create() 7730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.writelines((b'x', b'y', b'z')) 7740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.seek(0) 7750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi buf = f.read() 7760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(buf, b'xyz') 7770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_writelines_sequential(self): 7790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile should hold exactly max_size bytes, and roll 7800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # over afterward 7810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=35) 7820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.writelines((b'x' * 20, b'x' * 10, b'x' * 5)) 7830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write(b'x') 7850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 7860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_xreadlines(self): 7880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=20) 7890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write(b'abc\n' * 5) 7900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.seek(0) 7910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 7920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(list(f.xreadlines()), [b'abc\n'] * 5) 7930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write(b'x\ny') 7940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 7950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.seek(0) 7960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(list(f.xreadlines()), [b'abc\n'] * 5 + [b'x\n', b'y']) 7970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_sparse(self): 7990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile that is written late in the file will extend 8000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # when that occurs 8010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=30) 8020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 8030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.seek(100, 0) 8040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 8050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('x') 8060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 8070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_fileno(self): 8090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile should roll over to a real file on fileno() 8100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=30) 8110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 8120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f.fileno() > 0) 8130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 8140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_multiple_close_before_rollover(self): 8160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile can be closed many times without error 8170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.SpooledTemporaryFile() 8180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('abc\n') 8190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 8200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 8210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 8220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 8230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 8240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 8250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("close") 8260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_multiple_close_after_rollover(self): 8280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile can be closed many times without error 8290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.SpooledTemporaryFile(max_size=1) 8300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('abc\n') 8310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 8320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 8330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 8340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 8350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 8360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 8370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("close") 8380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_bound_methods(self): 8400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # It should be OK to steal a bound method from a SpooledTemporaryFile 8410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # and use it independently; when the file rolls over, those bound 8420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # methods should continue to function 8430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = self.do_create(max_size=30) 8440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi read = f.read 8450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi write = f.write 8460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi seek = f.seek 8470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi write("a" * 35) 8490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi write("b" * 35) 8500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi seek(0, 0) 8510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(read(70) == 'a'*35 + 'b'*35) 8520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_properties(self): 8540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.SpooledTemporaryFile(max_size=10) 8550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write(b'x' * 10) 8560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 8570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(f.mode, 'w+b') 8580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsNone(f.name) 8590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(AttributeError): 8600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.newlines 8610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(AttributeError): 8620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.encoding 8630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write(b'x') 8650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 8660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(f.mode, 'w+b') 8670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsNotNone(f.name) 8680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(AttributeError): 8690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.newlines 8700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(AttributeError): 8710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.encoding 8720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_context_manager_before_rollover(self): 8740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile can be used as a context manager 8750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with tempfile.SpooledTemporaryFile(max_size=1) as f: 8760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 8770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f.closed) 8780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f.closed) 8790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def use_closed(): 8800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with f: 8810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 8820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(ValueError, use_closed) 8830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_context_manager_during_rollover(self): 8850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile can be used as a context manager 8860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with tempfile.SpooledTemporaryFile(max_size=1) as f: 8870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f._rolled) 8880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('abc\n') 8890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.flush() 8900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 8910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f.closed) 8920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f.closed) 8930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def use_closed(): 8940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with f: 8950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 8960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(ValueError, use_closed) 8970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_context_manager_after_rollover(self): 8990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A SpooledTemporaryFile can be used as a context manager 9000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.SpooledTemporaryFile(max_size=1) 9010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('abc\n') 9020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.flush() 9030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f._rolled) 9040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with f: 9050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(f.closed) 9060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(f.closed) 9070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def use_closed(): 9080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with f: 9090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 9100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(ValueError, use_closed) 9110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitest_classes.append(test_SpooledTemporaryFile) 9140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass test_TemporaryFile(TC): 9170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Test TemporaryFile().""" 9180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic(self): 9200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # TemporaryFile can create files 9210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # No point in testing the name params - the file has no name. 9220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 9230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tempfile.TemporaryFile() 9240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 9250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("TemporaryFile") 9260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_has_no_name(self): 9280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # TemporaryFile creates files with no names (on this system) 9290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir = tempfile.mkdtemp() 9300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.TemporaryFile(dir=dir) 9310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('blat') 9320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Sneaky: because this file has no name, it should not prevent 9340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # us from removing the directory it was created in. 9350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 9360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 9370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 9380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ei = sys.exc_info() 9390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # cleanup 9400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 9410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi os.rmdir(dir) 9420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("rmdir", ei) 9430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_multiple_close(self): 9450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A TemporaryFile can be closed many times without error 9460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = tempfile.TemporaryFile() 9470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.write('abc\n') 9480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 9490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 9500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 9510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 9520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 9530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.failOnException("close") 9540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # How to test the mode and bufsize parameters? 9560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif tempfile.NamedTemporaryFile is not tempfile.TemporaryFile: 9590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_classes.append(test_TemporaryFile) 9600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main(): 9620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi support.run_unittest(*test_classes) 9630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__": 9650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_main() 966