test_stringutils.py: Mock the open() call in test_open_unicode
authorFrancois Deppierraz <francois@ctrlaltdel.ch>
Fri, 21 May 2010 13:58:17 +0000 (06:58 -0700)
committerFrancois Deppierraz <francois@ctrlaltdel.ch>
Fri, 21 May 2010 13:58:17 +0000 (06:58 -0700)
This test ensure that open(a_unicode_string) is used on Unicode platforms
(Windows or MacOS X) and that open(a_correctly_encoded_bytestring) on other
platforms such as Unix.

src/allmydata/test/test_stringutils.py

index 73a67e6b953525f9d71ce0b31032cc25fba7bcea..ebe31687088026557def39f641506710ec33bdc1 100644 (file)
@@ -187,13 +187,26 @@ class StringUtils:
             if fname not in filenames:
                 self.fail("Cannot find %r in %r" % (fname, filenames))
 
-    @patch('os.open')
-    def test_open_unicode(self, mock):
+    @patch('sys.getfilesystemencoding')
+    @patch('__builtin__.open')
+    def test_open_unicode(self, mock_open, mock_getfilesystemencoding):
+        mock_getfilesystemencoding.return_value = self.filesystemencoding
 
-        self.failUnlessRaises(IOError,
-                              open_unicode,
-                              u'/dummy_directory/lumière.txt')
+        fn = u'/dummy_directory/lumière.txt'
 
+        try:
+            open_unicode(fn)
+        except FilenameEncodingError:
+            raise unittest.SkipTest("Cannot represent test filename on this (mocked) platform")
+
+        # Pass Unicode string to open() on Unicode platforms
+        if unicode_platform():
+            mock_open.assert_called_with(fn, 'r')
+
+        # Pass correctly encoded bytestrings to open() on non-Unicode platforms
+        else:
+            fn_bytestring = fn.encode(self.filesystemencoding)
+            mock_open.assert_called_with(fn_bytestring, 'r')
 
 class UbuntuKarmicUTF8(StringUtils, unittest.TestCase):
     uname = 'Linux korn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64'