blob: e5f538e024016af8722bb82433a8989123c4ae4c [file] [log] [blame]
Mark Hammond7995eb22002-10-03 23:14:10 +00001# Test the Unicode versions of normal file functions
2# open, os.open, os.stat. os.listdir, os.rename, os.remove, os.mkdir, os.chdir, os.rmdir
Mark Hammondbb4a47c2003-07-16 03:46:38 +00003import sys, os, unittest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004from test import test_support
Florent Xicluna2db61fb2010-03-02 21:34:45 +00005## There's no obvious reason to skip these tests on POSIX systems
6# if not os.path.supports_unicode_filenames:
7# raise unittest.SkipTest, "test works only on NT+"
Mark Hammond7995eb22002-10-03 23:14:10 +00008
9filenames = [
Martin v. Löwis45bb87b2002-10-07 17:27:15 +000010 'abc',
11 u'ascii',
12 u'Gr\xfc\xdf-Gott',
13 u'\u0393\u03b5\u03b9\u03ac-\u03c3\u03b1\u03c2',
14 u'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435',
15 u'\u306b\u307d\u3093',
16 u'\u05d4\u05e9\u05e7\u05e6\u05e5\u05e1',
17 u'\u66e8\u66e9\u66eb',
18 u'\u66e8\u05e9\u3093\u0434\u0393\xdf',
Mark Hammond7995eb22002-10-03 23:14:10 +000019 ]
20
Tim Peters1ee401f2002-10-05 17:54:56 +000021# Destroy directory dirname and all files under it, to one level.
22def deltree(dirname):
23 # Don't hide legitimate errors: if one of these suckers exists, it's
24 # an error if we can't remove it.
25 if os.path.exists(dirname):
Mark Hammond8696ebc2002-10-08 02:44:31 +000026 # must pass unicode to os.listdir() so we get back unicode results.
27 for fname in os.listdir(unicode(dirname)):
Tim Peters1ee401f2002-10-05 17:54:56 +000028 os.unlink(os.path.join(dirname, fname))
29 os.rmdir(dirname)
30
Mark Hammond7995eb22002-10-03 23:14:10 +000031class UnicodeFileTests(unittest.TestCase):
Walter Dörwald21d3a322003-05-01 17:45:56 +000032 files = [os.path.join(test_support.TESTFN, f) for f in filenames]
Tim Peters1ee401f2002-10-05 17:54:56 +000033
Mark Hammond7995eb22002-10-03 23:14:10 +000034 def setUp(self):
Mark Hammond7995eb22002-10-03 23:14:10 +000035 try:
Walter Dörwald21d3a322003-05-01 17:45:56 +000036 os.mkdir(test_support.TESTFN)
Mark Hammond7995eb22002-10-03 23:14:10 +000037 except OSError:
38 pass
39 for name in self.files:
40 f = open(name, 'w')
41 f.write((name+'\n').encode("utf-8"))
42 f.close()
43 os.stat(name)
44
45 def tearDown(self):
Walter Dörwald21d3a322003-05-01 17:45:56 +000046 deltree(test_support.TESTFN)
Mark Hammond7995eb22002-10-03 23:14:10 +000047
48 def _apply_failure(self, fn, filename, expected_exception,
49 check_fn_in_exception = True):
50 try:
51 fn(filename)
Walter Dörwald21d3a322003-05-01 17:45:56 +000052 raise test_support.TestFailed("Expected to fail calling '%s(%r)'"
Mark Hammond7995eb22002-10-03 23:14:10 +000053 % (fn.__name__, filename))
54 except expected_exception, details:
Florent Xicluna2db61fb2010-03-02 21:34:45 +000055 # the "filename" exception attribute may be encoded
56 if isinstance(details.filename, str):
57 filename = filename.encode(sys.getfilesystemencoding())
Mark Hammond7995eb22002-10-03 23:14:10 +000058 if check_fn_in_exception and details.filename != filename:
Walter Dörwald21d3a322003-05-01 17:45:56 +000059 raise test_support.TestFailed("Function '%s(%r) failed with "
Tim Peters3de75262002-11-09 05:26:15 +000060 "bad filename in the exception: %r"
61 % (fn.__name__, filename,
62 details.filename))
Mark Hammond7995eb22002-10-03 23:14:10 +000063
64 def test_failures(self):
65 # Pass non-existing Unicode filenames all over the place.
66 for name in self.files:
67 name = "not_" + name
68 self._apply_failure(open, name, IOError)
69 self._apply_failure(os.stat, name, OSError)
70 self._apply_failure(os.chdir, name, OSError)
71 self._apply_failure(os.rmdir, name, OSError)
72 self._apply_failure(os.remove, name, OSError)
73 # listdir may append a wildcard to the filename, so dont check
74 self._apply_failure(os.listdir, name, OSError, False)
75
76 def test_open(self):
77 for name in self.files:
78 f = open(name, 'w')
79 f.write((name+'\n').encode("utf-8"))
80 f.close()
81 os.stat(name)
82
83 def test_listdir(self):
Walter Dörwald21d3a322003-05-01 17:45:56 +000084 f1 = os.listdir(test_support.TESTFN)
Mark Hammondbb4a47c2003-07-16 03:46:38 +000085 f2 = os.listdir(unicode(test_support.TESTFN,
86 sys.getfilesystemencoding()))
Florent Xicluna2db61fb2010-03-02 21:34:45 +000087 sf2 = set(os.path.join(unicode(test_support.TESTFN), f)
Christian Heimes17b52af2007-12-15 05:38:35 +000088 for f in f2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +000089 self.assertEqual(len(f1), len(self.files))
90 self.assertEqual(sf2, set(self.files))
Mark Hammond7995eb22002-10-03 23:14:10 +000091
92 def test_rename(self):
93 for name in self.files:
94 os.rename(name,"tmp")
95 os.rename("tmp",name)
96
97 def test_directory(self):
Walter Dörwald21d3a322003-05-01 17:45:56 +000098 dirname = os.path.join(test_support.TESTFN,u'Gr\xfc\xdf-\u66e8\u66e9\u66eb')
Martin v. Löwis45bb87b2002-10-07 17:27:15 +000099 filename = u'\xdf-\u66e8\u66e9\u66eb'
Mark Hammond7995eb22002-10-03 23:14:10 +0000100 oldwd = os.getcwd()
101 os.mkdir(dirname)
102 os.chdir(dirname)
103 f = open(filename, 'w')
104 f.write((filename + '\n').encode("utf-8"))
105 f.close()
Martin v. Löwis1b699a52003-09-12 16:25:38 +0000106 os.access(filename,os.R_OK)
Mark Hammond7995eb22002-10-03 23:14:10 +0000107 os.remove(filename)
108 os.chdir(oldwd)
109 os.rmdir(dirname)
110
111def test_main():
Tim Peters1ee401f2002-10-05 17:54:56 +0000112 try:
Walter Dörwald21d3a322003-05-01 17:45:56 +0000113 test_support.run_unittest(UnicodeFileTests)
Tim Peters1ee401f2002-10-05 17:54:56 +0000114 finally:
Walter Dörwald21d3a322003-05-01 17:45:56 +0000115 deltree(test_support.TESTFN)
Mark Hammond7995eb22002-10-03 23:14:10 +0000116
117if __name__ == "__main__":
118 test_main()