|
1 # 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 |
|
3 import sys, os, unittest |
|
4 from test import test_support |
|
5 if not os.path.supports_unicode_filenames: |
|
6 raise test_support.TestSkipped, "test works only on NT+" |
|
7 |
|
8 filenames = [ |
|
9 'abc', |
|
10 u'ascii', |
|
11 u'Gr\xfc\xdf-Gott', |
|
12 u'\u0393\u03b5\u03b9\u03ac-\u03c3\u03b1\u03c2', |
|
13 u'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435', |
|
14 u'\u306b\u307d\u3093', |
|
15 u'\u05d4\u05e9\u05e7\u05e6\u05e5\u05e1', |
|
16 u'\u66e8\u66e9\u66eb', |
|
17 u'\u66e8\u05e9\u3093\u0434\u0393\xdf', |
|
18 ] |
|
19 |
|
20 # Destroy directory dirname and all files under it, to one level. |
|
21 def deltree(dirname): |
|
22 # Don't hide legitimate errors: if one of these suckers exists, it's |
|
23 # an error if we can't remove it. |
|
24 if os.path.exists(dirname): |
|
25 # must pass unicode to os.listdir() so we get back unicode results. |
|
26 for fname in os.listdir(unicode(dirname)): |
|
27 os.unlink(os.path.join(dirname, fname)) |
|
28 os.rmdir(dirname) |
|
29 |
|
30 class UnicodeFileTests(unittest.TestCase): |
|
31 files = [os.path.join(test_support.TESTFN, f) for f in filenames] |
|
32 |
|
33 def setUp(self): |
|
34 try: |
|
35 os.mkdir(test_support.TESTFN) |
|
36 except OSError: |
|
37 pass |
|
38 for name in self.files: |
|
39 f = open(name, 'w') |
|
40 f.write((name+'\n').encode("utf-8")) |
|
41 f.close() |
|
42 os.stat(name) |
|
43 |
|
44 def tearDown(self): |
|
45 deltree(test_support.TESTFN) |
|
46 |
|
47 def _apply_failure(self, fn, filename, expected_exception, |
|
48 check_fn_in_exception = True): |
|
49 try: |
|
50 fn(filename) |
|
51 raise test_support.TestFailed("Expected to fail calling '%s(%r)'" |
|
52 % (fn.__name__, filename)) |
|
53 except expected_exception, details: |
|
54 if check_fn_in_exception and details.filename != filename: |
|
55 raise test_support.TestFailed("Function '%s(%r) failed with " |
|
56 "bad filename in the exception: %r" |
|
57 % (fn.__name__, filename, |
|
58 details.filename)) |
|
59 |
|
60 def test_failures(self): |
|
61 # Pass non-existing Unicode filenames all over the place. |
|
62 for name in self.files: |
|
63 name = "not_" + name |
|
64 self._apply_failure(open, name, IOError) |
|
65 self._apply_failure(os.stat, name, OSError) |
|
66 self._apply_failure(os.chdir, name, OSError) |
|
67 self._apply_failure(os.rmdir, name, OSError) |
|
68 self._apply_failure(os.remove, name, OSError) |
|
69 # listdir may append a wildcard to the filename, so dont check |
|
70 self._apply_failure(os.listdir, name, OSError, False) |
|
71 |
|
72 def test_open(self): |
|
73 for name in self.files: |
|
74 f = open(name, 'w') |
|
75 f.write((name+'\n').encode("utf-8")) |
|
76 f.close() |
|
77 os.stat(name) |
|
78 |
|
79 def test_listdir(self): |
|
80 f1 = os.listdir(test_support.TESTFN) |
|
81 # Printing f1 is not appropriate, as specific filenames |
|
82 # returned depend on the local encoding |
|
83 f2 = os.listdir(unicode(test_support.TESTFN, |
|
84 sys.getfilesystemencoding())) |
|
85 f2.sort() |
|
86 print f2 |
|
87 |
|
88 def test_rename(self): |
|
89 for name in self.files: |
|
90 os.rename(name,"tmp") |
|
91 os.rename("tmp",name) |
|
92 |
|
93 def test_directory(self): |
|
94 dirname = os.path.join(test_support.TESTFN,u'Gr\xfc\xdf-\u66e8\u66e9\u66eb') |
|
95 filename = u'\xdf-\u66e8\u66e9\u66eb' |
|
96 oldwd = os.getcwd() |
|
97 os.mkdir(dirname) |
|
98 os.chdir(dirname) |
|
99 f = open(filename, 'w') |
|
100 f.write((filename + '\n').encode("utf-8")) |
|
101 f.close() |
|
102 print repr(filename) |
|
103 os.access(filename,os.R_OK) |
|
104 os.remove(filename) |
|
105 os.chdir(oldwd) |
|
106 os.rmdir(dirname) |
|
107 |
|
108 def test_main(): |
|
109 try: |
|
110 test_support.run_unittest(UnicodeFileTests) |
|
111 finally: |
|
112 deltree(test_support.TESTFN) |
|
113 |
|
114 if __name__ == "__main__": |
|
115 test_main() |