| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  | # Test the Unicode versions of normal file functions | 
					
						
							|  |  |  | # open, os.open, os.stat. os.listdir, os.rename, os.remove, os.mkdir, os.chdir, os.rmdir | 
					
						
							| 
									
										
										
										
											2003-07-16 03:46:38 +00:00
										 |  |  | import sys, os, unittest | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  | from test import test_support | 
					
						
							| 
									
										
										
										
											2002-10-08 02:44:31 +00:00
										 |  |  | if not os.path.supports_unicode_filenames: | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |     raise test_support.TestSkipped, "test works only on NT+" | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | filenames = [ | 
					
						
							| 
									
										
										
										
											2002-10-07 17:27:15 +00:00
										 |  |  |     'abc', | 
					
						
							|  |  |  |     u'ascii', | 
					
						
							|  |  |  |     u'Gr\xfc\xdf-Gott', | 
					
						
							|  |  |  |     u'\u0393\u03b5\u03b9\u03ac-\u03c3\u03b1\u03c2', | 
					
						
							|  |  |  |     u'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435', | 
					
						
							|  |  |  |     u'\u306b\u307d\u3093', | 
					
						
							|  |  |  |     u'\u05d4\u05e9\u05e7\u05e6\u05e5\u05e1', | 
					
						
							|  |  |  |     u'\u66e8\u66e9\u66eb', | 
					
						
							|  |  |  |     u'\u66e8\u05e9\u3093\u0434\u0393\xdf', | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-05 17:54:56 +00:00
										 |  |  | # Destroy directory dirname and all files under it, to one level. | 
					
						
							|  |  |  | def deltree(dirname): | 
					
						
							|  |  |  |     # Don't hide legitimate errors:  if one of these suckers exists, it's | 
					
						
							|  |  |  |     # an error if we can't remove it. | 
					
						
							|  |  |  |     if os.path.exists(dirname): | 
					
						
							| 
									
										
										
										
											2002-10-08 02:44:31 +00:00
										 |  |  |         # must pass unicode to os.listdir() so we get back unicode results. | 
					
						
							|  |  |  |         for fname in os.listdir(unicode(dirname)): | 
					
						
							| 
									
										
										
										
											2002-10-05 17:54:56 +00:00
										 |  |  |             os.unlink(os.path.join(dirname, fname)) | 
					
						
							|  |  |  |         os.rmdir(dirname) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  | class UnicodeFileTests(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |     files = [os.path.join(test_support.TESTFN, f) for f in filenames] | 
					
						
							| 
									
										
										
										
											2002-10-05 17:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  |     def setUp(self): | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |             os.mkdir(test_support.TESTFN) | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  |         except OSError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         for name in self.files: | 
					
						
							|  |  |  |             f = open(name, 'w') | 
					
						
							|  |  |  |             f.write((name+'\n').encode("utf-8")) | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |             os.stat(name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         deltree(test_support.TESTFN) | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _apply_failure(self, fn, filename, expected_exception, | 
					
						
							|  |  |  |                        check_fn_in_exception = True): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             fn(filename) | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |             raise test_support.TestFailed("Expected to fail calling '%s(%r)'" | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  |                              % (fn.__name__, filename)) | 
					
						
							|  |  |  |         except expected_exception, details: | 
					
						
							|  |  |  |             if check_fn_in_exception and details.filename != filename: | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |                 raise test_support.TestFailed("Function '%s(%r) failed with " | 
					
						
							| 
									
										
										
										
											2002-11-09 05:26:15 +00:00
										 |  |  |                                  "bad filename in the exception: %r" | 
					
						
							|  |  |  |                                  % (fn.__name__, filename, | 
					
						
							|  |  |  |                                     details.filename)) | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_failures(self): | 
					
						
							|  |  |  |         # Pass non-existing Unicode filenames all over the place. | 
					
						
							|  |  |  |         for name in self.files: | 
					
						
							|  |  |  |             name = "not_" + name | 
					
						
							|  |  |  |             self._apply_failure(open, name, IOError) | 
					
						
							|  |  |  |             self._apply_failure(os.stat, name, OSError) | 
					
						
							|  |  |  |             self._apply_failure(os.chdir, name, OSError) | 
					
						
							|  |  |  |             self._apply_failure(os.rmdir, name, OSError) | 
					
						
							|  |  |  |             self._apply_failure(os.remove, name, OSError) | 
					
						
							|  |  |  |             # listdir may append a wildcard to the filename, so dont check | 
					
						
							|  |  |  |             self._apply_failure(os.listdir, name, OSError, False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_open(self): | 
					
						
							|  |  |  |         for name in self.files: | 
					
						
							|  |  |  |             f = open(name, 'w') | 
					
						
							|  |  |  |             f.write((name+'\n').encode("utf-8")) | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |             os.stat(name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_listdir(self): | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         f1 = os.listdir(test_support.TESTFN) | 
					
						
							| 
									
										
										
										
											2004-11-07 20:01:56 +00:00
										 |  |  |         # Printing f1 is not appropriate, as specific filenames | 
					
						
							|  |  |  |         # returned depend on the local encoding | 
					
						
							| 
									
										
										
										
											2003-07-16 03:46:38 +00:00
										 |  |  |         f2 = os.listdir(unicode(test_support.TESTFN, | 
					
						
							|  |  |  |                                 sys.getfilesystemencoding())) | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  |         f2.sort() | 
					
						
							|  |  |  |         print f2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_rename(self): | 
					
						
							|  |  |  |         for name in self.files: | 
					
						
							|  |  |  |             os.rename(name,"tmp") | 
					
						
							|  |  |  |             os.rename("tmp",name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_directory(self): | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         dirname = os.path.join(test_support.TESTFN,u'Gr\xfc\xdf-\u66e8\u66e9\u66eb') | 
					
						
							| 
									
										
										
										
											2002-10-07 17:27:15 +00:00
										 |  |  |         filename = u'\xdf-\u66e8\u66e9\u66eb' | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  |         oldwd = os.getcwd() | 
					
						
							|  |  |  |         os.mkdir(dirname) | 
					
						
							|  |  |  |         os.chdir(dirname) | 
					
						
							|  |  |  |         f = open(filename, 'w') | 
					
						
							|  |  |  |         f.write((filename + '\n').encode("utf-8")) | 
					
						
							|  |  |  |         f.close() | 
					
						
							| 
									
										
										
										
											2002-10-08 02:44:31 +00:00
										 |  |  |         print repr(filename) | 
					
						
							| 
									
										
										
										
											2003-09-12 16:25:38 +00:00
										 |  |  |         os.access(filename,os.R_OK) | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  |         os.remove(filename) | 
					
						
							|  |  |  |         os.chdir(oldwd) | 
					
						
							|  |  |  |         os.rmdir(dirname) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_main(): | 
					
						
							| 
									
										
										
										
											2002-10-05 17:54:56 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         test_support.run_unittest(UnicodeFileTests) | 
					
						
							| 
									
										
										
										
											2002-10-05 17:54:56 +00:00
										 |  |  |     finally: | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |         deltree(test_support.TESTFN) | 
					
						
							| 
									
										
										
										
											2002-10-03 23:14:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |