9 # The following main helps to generate a test class for other operating
12 if __name__ == "__main__":
18 if len(sys.argv) != 2:
19 print "Usage: %s lumière" % sys.argv[0]
23 print "class MyWeirdOS(StringUtils, unittest.TestCase):"
24 print " uname = '%s'" % ' '.join(platform.uname())
25 print " argv = %s" % repr(sys.argv[1])
26 print " platform = '%s'" % sys.platform
27 print " filesystemencoding = '%s'" % sys.getfilesystemencoding()
28 print " stdoutencoding = '%s'" % sys.stdout.encoding
31 tmpdir = tempfile.mkdtemp()
32 for fname in TEST_FILENAMES:
33 open(os.path.join(tmpdir, fname), 'w').close()
35 # Use Unicode API under Windows or MacOS X
36 if sys.platform in ('win32', 'darwin'):
37 dirlist = os.listdir(unicode(tmpdir))
39 dirlist = os.listdir(tmpdir)
41 print " dirlist = %s" % repr(dirlist)
43 print " # Oops, I cannot write filenames containing non-ascii characters"
49 from twisted.trial import unittest
50 from mock import patch
53 from allmydata.util.stringutils import argv_to_unicode, unicode_to_url, \
54 unicode_to_stdout, unicode_platform, listdir_unicode, open_unicode, \
55 FilenameEncodingError, get_term_encoding
56 from twisted.python import usage
58 class StringUtilsErrors(unittest.TestCase):
60 def test_get_term_encoding(self, mock):
63 self.failUnlessEqual(get_term_encoding().lower(), locale.getpreferredencoding().lower())
66 def test_argv_to_unicode(self, mock):
67 mock.encoding = 'utf-8'
69 self.failUnlessRaises(usage.UsageError,
71 u'lumière'.encode('latin1'))
73 def test_unicode_to_url(self):
77 def test_unicode_to_stdout(self, mock):
78 # Encoding koi8-r cannot represent 'è'
79 mock.encoding = 'koi8-r'
80 self.failUnlessEqual(unicode_to_stdout(u'lumière'), 'lumi?re')
83 def test_unicode_normalization(self, mock):
84 # Pretend to run on an Unicode platform such as Windows
85 orig_platform = sys.platform
86 sys.platform = 'win32'
88 mock.return_value = [u'A\u0308rtonwall.mp3']
89 self.failUnlessEqual(listdir_unicode(u'/dummy'), [u'\xc4rtonwall.mp3'])
91 sys.platform = orig_platform
93 # The following tests applies only to platforms which don't store filenames as
94 # Unicode entities on the filesystem.
95 class StringUtilsNonUnicodePlatform(unittest.TestCase):
97 # Mock sys.platform because unicode_platform() uses it
98 self.original_platform = sys.platform
99 sys.platform = 'linux'
102 sys.platform = self.original_platform
104 @patch('sys.getfilesystemencoding')
106 def test_listdir_unicode(self, mock_listdir, mock_getfilesystemencoding):
107 # What happen if a latin1-encoded filenames is encountered on an UTF-8
109 mock_listdir.return_value = [
110 u'lumière'.encode('utf-8'),
111 u'lumière'.encode('latin1')]
113 mock_getfilesystemencoding.return_value = 'utf-8'
115 self.failUnlessRaises(FilenameEncodingError,
119 # We're trying to list a directory whose name cannot be represented in
120 # the filesystem encoding. This should fail.
121 mock_getfilesystemencoding.return_value = 'ascii'
122 self.failUnlessRaises(FilenameEncodingError,
126 @patch('sys.getfilesystemencoding')
127 def test_open_unicode(self, mock):
128 mock.return_value = 'ascii'
130 self.failUnlessRaises(FilenameEncodingError,
136 # Mock sys.platform because unicode_platform() uses it
137 self.original_platform = sys.platform
138 sys.platform = self.platform
141 sys.platform = self.original_platform
144 def test_argv_to_unicode(self, mock):
145 if 'argv' not in dir(self):
146 raise unittest.SkipTest("There's no way to pass non-ASCII arguments in CLI on this (mocked) platform")
148 mock.encoding = self.stdoutencoding
153 self.failUnlessEqual(argv_to_unicode(argv), argu)
155 def test_unicode_to_url(self):
156 self.failUnless(unicode_to_url(u'lumière'), u'lumière'.encode('utf-8'))
159 def test_unicode_to_stdout(self, mock):
160 if 'argv' not in dir(self):
161 raise unittest.SkipTest("There's no way to pass non-ASCII arguments in CLI on this (mocked) platform")
163 mock.encoding = self.stdoutencoding
164 self.failUnlessEqual(unicode_to_stdout(u'lumière'), self.argv)
166 def test_unicode_platform(self):
174 self.failUnlessEqual(unicode_platform(), matrix[self.platform])
176 @patch('sys.getfilesystemencoding')
178 def test_listdir_unicode(self, mock_listdir, mock_getfilesystemencoding):
179 if 'dirlist' not in dir(self):
180 raise unittest.SkipTest("No way to write non-ASCII filenames on this system")
182 mock_listdir.return_value = self.dirlist
183 mock_getfilesystemencoding.return_value = self.filesystemencoding
185 filenames = listdir_unicode(u'/dummy')
187 for fname in TEST_FILENAMES:
188 self.failUnless(isinstance(fname, unicode))
190 if fname not in filenames:
191 self.fail("Cannot find %r in %r" % (fname, filenames))
193 @patch('sys.getfilesystemencoding')
194 @patch('__builtin__.open')
195 def test_open_unicode(self, mock_open, mock_getfilesystemencoding):
196 mock_getfilesystemencoding.return_value = self.filesystemencoding
198 fn = u'/dummy_directory/lumière.txt'
202 except FilenameEncodingError:
203 raise unittest.SkipTest("Cannot represent test filename on this (mocked) platform")
205 # Pass Unicode string to open() on Unicode platforms
206 if unicode_platform():
207 mock_open.assert_called_with(fn, 'r')
209 # Pass correctly encoded bytestrings to open() on non-Unicode platforms
211 fn_bytestring = fn.encode(self.filesystemencoding)
212 mock_open.assert_called_with(fn_bytestring, 'r')
214 class UbuntuKarmicUTF8(StringUtils, unittest.TestCase):
215 uname = 'Linux korn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64'
216 argv = 'lumi\xc3\xa8re'
218 filesystemencoding = 'UTF-8'
219 stdoutencoding = 'UTF-8'
220 dirlist = ['test_file', '\xc3\x84rtonwall.mp3', 'Blah blah.txt']
223 class UbuntuKarmicLatin1(StringUtils, unittest.TestCase):
224 uname = 'Linux korn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64'
227 filesystemencoding = 'ISO-8859-1'
228 stdoutencoding = 'ISO-8859-1'
229 dirlist = ['test_file', 'Blah blah.txt', '\xc4rtonwall.mp3']
231 class WindowsXP(StringUtils, unittest.TestCase):
232 uname = 'Windows XP 5.1.2600 x86 x86 Family 15 Model 75 Step ping 2, AuthenticAMD'
235 filesystemencoding = 'mbcs'
236 stdoutencoding = 'cp850'
237 dirlist = [u'Blah blah.txt', u'test_file', u'\xc4rtonwall.mp3']
239 todo = "Unicode arguments on the command-line is not yet supported under Windows, see bug #565."
241 class WindowsXP_UTF8(StringUtils, unittest.TestCase):
242 uname = 'Windows XP 5.1.2600 x86 x86 Family 15 Model 75 Step ping 2, AuthenticAMD'
245 filesystemencoding = 'mbcs'
246 stdoutencoding = 'cp65001'
247 dirlist = [u'Blah blah.txt', u'test_file', u'\xc4rtonwall.mp3']
249 todo = "Unicode arguments on the command-line is not yet supported under Windows, see bug #565."
251 class WindowsVista(StringUtils, unittest.TestCase):
252 uname = 'Windows Vista 6.0.6000 x86 x86 Family 6 Model 15 Stepping 11, GenuineIntel'
255 filesystemencoding = 'mbcs'
256 stdoutencoding = 'cp850'
257 dirlist = [u'Blah blah.txt', u'test_file', u'\xc4rtonwall.mp3']
259 todo = "Unicode arguments on the command-line is not yet supported under Windows, see bug #565."
261 class MacOSXLeopard(StringUtils, unittest.TestCase):
262 uname = 'Darwin g5.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:57:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_PPC Power Macintosh powerpc'
263 argv = 'lumi\xc3\xa8re'
265 filesystemencoding = 'utf-8'
266 stdoutencoding = 'UTF-8'
267 dirlist = [u'A\u0308rtonwall.mp3', u'Blah blah.txt', u'test_file']
269 class MacOSXLeopard7bit(StringUtils, unittest.TestCase):
270 uname = 'Darwin g5.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:57:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_PPC Power Macintosh powerpc'
273 filesystemencoding = 'utf-8'
274 stdoutencoding = 'US-ASCII'
275 dirlist = [u'A\u0308rtonwall.mp3', u'Blah blah.txt', u'test_file']
277 class OpenBSD(StringUtils, unittest.TestCase):
278 uname = 'OpenBSD 4.1 GENERIC#187 i386 Intel(R) Celeron(R) CPU 2.80GHz ("GenuineIntel" 686-class)'
280 platform = 'openbsd4'
281 filesystemencoding = '646'
282 stdoutencoding = '646'
283 # Oops, I cannot write filenames containing non-ascii characters