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