]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/test/test_encodingutil.py
stringutils: add test for when sys.stdout has no encoding attribute (fixes #1099).
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / test / test_encodingutil.py
1
2 lumiere_nfc = u"lumi\u00E8re"
3 Artonwall_nfc = u"\u00C4rtonwall.mp3"
4 Artonwall_nfd = u"A\u0308rtonwall.mp3"
5
6 TEST_FILENAMES = (
7   Artonwall_nfc,
8   u'test_file',
9   u'Blah blah.txt',
10 )
11
12 # The following main helps to generate a test class for other operating
13 # systems.
14
15 if __name__ == "__main__":
16     import sys
17     import platform
18
19     if len(sys.argv) != 2:
20         print "Usage: %s lumi<e-grave>re" % sys.argv[0]
21         sys.exit(1)
22     
23     print
24     print "class MyWeirdOS(StringUtils, unittest.TestCase):"
25     print "    uname = '%s'" % ' '.join(platform.uname())
26     if sys.platform != "win32":
27         print "    argv = %s" % repr(sys.argv[1])
28     print "    platform = '%s'" % sys.platform
29     print "    filesystem_encoding = '%s'" % sys.getfilesystemencoding()
30     print "    output_encoding = '%s'" % sys.stdout.encoding
31     print "    argv_encoding = '%s'" % (sys.platform == "win32" and 'ascii' or sys.stdout.encoding)
32     print
33
34     sys.exit(0)
35
36 from twisted.trial import unittest
37 from mock import patch
38 import sys, locale
39
40 from allmydata.test.common_util import ReallyEqualMixin
41 from allmydata.util.encodingutil import argv_to_unicode, unicode_to_url, \
42     unicode_to_output, unicode_platform, get_output_encoding, _reload
43
44 from twisted.python import usage
45
46 class StringUtilsErrors(ReallyEqualMixin, unittest.TestCase):
47     def tearDown(self):
48         _reload()
49
50     @patch('sys.stdout')
51     def test_get_output_encoding(self, mock_stdout):
52         mock_stdout.encoding = 'UTF-8'
53         _reload()
54         self.failUnlessReallyEqual(get_output_encoding(), 'utf-8')
55
56         mock_stdout.encoding = 'cp65001'
57         _reload()
58         self.failUnlessReallyEqual(get_output_encoding(), 'utf-8')
59
60         mock_stdout.encoding = 'koi8-r'
61         _reload()
62         self.failUnlessReallyEqual(get_output_encoding(), 'koi8-r')
63
64         mock_stdout.encoding = 'nonexistent_encoding'
65         self.failUnlessRaises(AssertionError, _reload)
66
67     @patch('locale.getpreferredencoding')
68     def test_get_output_encoding_not_from_stdout(self, mock_locale_getpreferredencoding):
69         locale  # hush pyflakes
70         mock_locale_getpreferredencoding.return_value = 'koi8-r'
71
72         class DummyStdout:
73             pass
74         old_stdout = sys.stdout
75         sys.stdout = DummyStdout()
76         try:
77             _reload()
78             self.failUnlessReallyEqual(get_output_encoding(), 'koi8-r')
79
80             sys.stdout.encoding = None
81             _reload()
82             self.failUnlessReallyEqual(get_output_encoding(), 'koi8-r')
83
84             mock_locale_getpreferredencoding.return_value = None
85             _reload()
86             self.failUnlessReallyEqual(get_output_encoding(), 'utf-8')
87         finally:
88             sys.stdout = old_stdout
89
90     @patch('sys.stdout')
91     def test_argv_to_unicode(self, mock):
92         mock.encoding = 'utf-8'
93         _reload()
94
95         self.failUnlessRaises(usage.UsageError,
96                               argv_to_unicode,
97                               lumiere_nfc.encode('latin1'))
98
99     @patch('sys.stdout')
100     def test_unicode_to_output(self, mock):
101         # Encoding koi8-r cannot represent e-grave
102         mock.encoding = 'koi8-r'
103         _reload()
104         self.failUnlessRaises(UnicodeEncodeError, unicode_to_output, lumiere_nfc)
105
106
107 class StringUtils(ReallyEqualMixin):
108     def setUp(self):
109         # Mock sys.platform because unicode_platform() uses it
110         self.original_platform = sys.platform
111         sys.platform = self.platform
112
113     def tearDown(self):
114         sys.platform = self.original_platform
115         _reload()
116
117     @patch('sys.stdout')
118     def test_argv_to_unicode(self, mock):
119         if 'argv' not in dir(self):
120             return
121
122         mock.encoding = self.output_encoding
123         argu = lumiere_nfc
124         argv = self.argv
125         _reload()
126         self.failUnlessReallyEqual(argv_to_unicode(argv), argu)
127
128     def test_unicode_to_url(self):
129         self.failUnless(unicode_to_url(lumiere_nfc), "lumi\xc3\xa8re")
130
131     @patch('sys.stdout')
132     def test_unicode_to_output(self, mock):
133         if 'output' not in dir(self):
134             return
135
136         mock.encoding = self.output_encoding
137         _reload()
138         self.failUnlessReallyEqual(unicode_to_output(lumiere_nfc), self.output)
139
140     def test_unicode_platform(self):
141         matrix = {
142           'linux2': False,
143           'openbsd4': False,
144           'win32':  True,
145           'darwin': True,
146         }
147
148         _reload()
149         self.failUnlessReallyEqual(unicode_platform(), matrix[self.platform])
150  
151
152 class UbuntuKarmicUTF8(StringUtils, unittest.TestCase):
153     uname = 'Linux korn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64'
154     output = 'lumi\xc3\xa8re'
155     argv = 'lumi\xc3\xa8re'
156     platform = 'linux2'
157     filesystem_encoding = 'UTF-8'
158     output_encoding = 'UTF-8'
159     argv_encoding = 'UTF-8'
160
161 class UbuntuKarmicLatin1(StringUtils, unittest.TestCase):
162     uname = 'Linux korn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64'
163     output = 'lumi\xe8re'
164     argv = 'lumi\xe8re'
165     platform = 'linux2'
166     filesystem_encoding = 'ISO-8859-1'
167     output_encoding = 'ISO-8859-1'
168     argv_encoding = 'ISO-8859-1'
169
170 class WindowsXP(StringUtils, unittest.TestCase):
171     uname = 'Windows XP 5.1.2600 x86 x86 Family 15 Model 75 Step ping 2, AuthenticAMD'
172     output = 'lumi\x8are'
173     platform = 'win32'
174     filesystem_encoding = 'mbcs'
175     output_encoding = 'cp850'
176     argv_encoding = 'ascii'
177
178 class WindowsXP_UTF8(StringUtils, unittest.TestCase):
179     uname = 'Windows XP 5.1.2600 x86 x86 Family 15 Model 75 Step ping 2, AuthenticAMD'
180     output = 'lumi\xc3\xa8re'
181     platform = 'win32'
182     filesystem_encoding = 'mbcs'
183     output_encoding = 'cp65001'
184     argv_encoding = 'ascii'
185
186 class WindowsVista(StringUtils, unittest.TestCase):
187     uname = 'Windows Vista 6.0.6000 x86 x86 Family 6 Model 15 Stepping 11, GenuineIntel'
188     output = 'lumi\x8are'
189     platform = 'win32'
190     filesystem_encoding = 'mbcs'
191     output_encoding = 'cp850'
192     argv_encoding = 'ascii'
193
194 class MacOSXLeopard(StringUtils, unittest.TestCase):
195     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'
196     output = 'lumi\xc3\xa8re'
197     argv = 'lumi\xc3\xa8re'
198     platform = 'darwin'
199     filesystem_encoding = 'utf-8'
200     output_encoding = 'UTF-8'
201     argv_encoding = 'UTF-8'
202
203 class MacOSXLeopard7bit(StringUtils, unittest.TestCase):
204     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'
205     platform = 'darwin'
206     filesystem_encoding = 'utf-8'
207     output_encoding = 'US-ASCII'
208     argv_encoding = 'US-ASCII'
209
210 class OpenBSD(StringUtils, unittest.TestCase):
211     uname = 'OpenBSD 4.1 GENERIC#187 i386 Intel(R) Celeron(R) CPU 2.80GHz ("GenuineIntel" 686-class)'
212     platform = 'openbsd4'
213     filesystem_encoding = '646'
214     output_encoding = '646'
215     argv_encoding = '646'
216     # Oops, I cannot write filenames containing non-ascii characters