blob: ed66dfcb782160c79cb55617d0cb5363b3f21770 [file] [log] [blame]
Barry Warsaw04f357c2002-07-23 19:04:11 +00001from test import test_support
Barry Warsaw70697632001-06-19 19:08:13 +00002import unittest
3
Walter Dörwald3b287702005-12-15 20:17:20 +00004import sys, os, cStringIO
Walter Dörwaldb1975432005-12-14 23:32:22 +00005import quopri
Barry Warsaw70697632001-06-19 19:08:13 +00006
7
Tim Peters87cc0c32001-07-21 01:41:30 +00008
Barry Warsaw70697632001-06-19 19:08:13 +00009ENCSAMPLE = """\
10Here's a bunch of special=20
11
12=A1=A2=A3=A4=A5=A6=A7=A8=A9
13=AA=AB=AC=AD=AE=AF=B0=B1=B2=B3
14=B4=B5=B6=B7=B8=B9=BA=BB=BC=BD=BE
15=BF=C0=C1=C2=C3=C4=C5=C6
16=C7=C8=C9=CA=CB=CC=CD=CE=CF
17=D0=D1=D2=D3=D4=D5=D6=D7
18=D8=D9=DA=DB=DC=DD=DE=DF
19=E0=E1=E2=E3=E4=E5=E6=E7
20=E8=E9=EA=EB=EC=ED=EE=EF
21=F0=F1=F2=F3=F4=F5=F6=F7
22=F8=F9=FA=FB=FC=FD=FE=FF
23
24characters... have fun!
25"""
26
27# First line ends with a space
Tim Peters87cc0c32001-07-21 01:41:30 +000028DECSAMPLE = "Here's a bunch of special \n" + \
29"""\
Barry Warsaw70697632001-06-19 19:08:13 +000030
Tim Peterse8613652001-08-03 20:40:18 +000031\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9
32\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3
33\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe
34\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6
35\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf
36\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7
37\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf
38\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7
39\xe8\xe9\xea\xeb\xec\xed\xee\xef
40\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7
41\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff
Barry Warsaw70697632001-06-19 19:08:13 +000042
43characters... have fun!
44"""
45
46
Walter Dörwaldb1975432005-12-14 23:32:22 +000047def withpythonimplementation(testfunc):
48 def newtest(self):
49 # Test default implementation
50 testfunc(self)
51 # Test Python implementation
52 if quopri.b2a_qp is not None or quopri.a2b_qp is not None:
53 oldencode = quopri.b2a_qp
54 olddecode = quopri.a2b_qp
55 try:
56 quopri.b2a_qp = None
57 quopri.a2b_qp = None
58 testfunc(self)
59 finally:
60 quopri.b2a_qp = oldencode
61 quopri.a2b_qp = olddecode
62 newtest.__name__ = testfunc.__name__
63 return newtest
Tim Peters87cc0c32001-07-21 01:41:30 +000064
Barry Warsaw70697632001-06-19 19:08:13 +000065class QuopriTestCase(unittest.TestCase):
66 # Each entry is a tuple of (plaintext, encoded string). These strings are
67 # used in the "quotetabs=0" tests.
68 STRINGS = (
69 # Some normal strings
70 ('hello', 'hello'),
71 ('''hello
72 there
73 world''', '''hello
74 there
75 world'''),
76 ('''hello
77 there
78 world
79''', '''hello
80 there
81 world
82'''),
83 ('\201\202\203', '=81=82=83'),
84 # Add some trailing MUST QUOTE strings
85 ('hello ', 'hello=20'),
86 ('hello\t', 'hello=09'),
Barry Warsaw7599a3f2001-06-19 22:48:42 +000087 # Some long lines. First, a single line of 108 characters
Tim Peterse8613652001-08-03 20:40:18 +000088 ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xd8\xd9\xda\xdb\xdc\xdd\xde\xdfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
Barry Warsaw7599a3f2001-06-19 22:48:42 +000089 '''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=D8=D9=DA=DB=DC=DD=DE=DFx=
90xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'''),
91 # A line of exactly 76 characters, no soft line break should be needed
92 ('yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
93 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'),
94 # A line of 77 characters, forcing a soft line break at position 75,
95 # and a second line of exactly 2 characters (because the soft line
96 # break `=' sign counts against the line length limit).
97 ('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
98 '''zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
99zz'''),
100 # A line of 151 characters, forcing a soft line break at position 75,
101 # with a second line of exactly 76 characters and no trailing =
102 ('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
103 '''zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
104zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'''),
105 # A string containing a hard line break, but which the first line is
106 # 151 characters and the second line is exactly 76 characters. This
107 # should leave us with three lines, the first which has a soft line
108 # break, and which the second and third do not.
109 ('''yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
110zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz''',
111 '''yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=
112yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
113zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'''),
114 # Now some really complex stuff ;)
Barry Warsaw70697632001-06-19 19:08:13 +0000115 (DECSAMPLE, ENCSAMPLE),
116 )
117
118 # These are used in the "quotetabs=1" tests.
119 ESTRINGS = (
120 ('hello world', 'hello=20world'),
121 ('hello\tworld', 'hello=09world'),
122 )
Tim Peters87cc0c32001-07-21 01:41:30 +0000123
Martin v. Löwis16dc7f42001-09-30 20:32:11 +0000124 # These are used in the "header=1" tests.
125 HSTRINGS = (
126 ('hello world', 'hello_world'),
127 ('hello_world', 'hello=5Fworld'),
128 )
129
Walter Dörwaldb1975432005-12-14 23:32:22 +0000130 @withpythonimplementation
Barry Warsaw70697632001-06-19 19:08:13 +0000131 def test_encodestring(self):
132 for p, e in self.STRINGS:
Walter Dörwaldb1975432005-12-14 23:32:22 +0000133 self.assert_(quopri.encodestring(p) == e)
Tim Peters87cc0c32001-07-21 01:41:30 +0000134
Walter Dörwaldb1975432005-12-14 23:32:22 +0000135 @withpythonimplementation
Barry Warsaw70697632001-06-19 19:08:13 +0000136 def test_decodestring(self):
137 for p, e in self.STRINGS:
Walter Dörwaldb1975432005-12-14 23:32:22 +0000138 self.assert_(quopri.decodestring(e) == p)
Tim Peters87cc0c32001-07-21 01:41:30 +0000139
Walter Dörwaldb1975432005-12-14 23:32:22 +0000140 @withpythonimplementation
Barry Warsaw70697632001-06-19 19:08:13 +0000141 def test_idempotent_string(self):
142 for p, e in self.STRINGS:
Walter Dörwaldb1975432005-12-14 23:32:22 +0000143 self.assert_(quopri.decodestring(quopri.encodestring(e)) == e)
Barry Warsaw70697632001-06-19 19:08:13 +0000144
Walter Dörwaldb1975432005-12-14 23:32:22 +0000145 @withpythonimplementation
Barry Warsaw70697632001-06-19 19:08:13 +0000146 def test_encode(self):
147 for p, e in self.STRINGS:
Walter Dörwald3b287702005-12-15 20:17:20 +0000148 infp = cStringIO.StringIO(p)
149 outfp = cStringIO.StringIO()
Walter Dörwaldb1975432005-12-14 23:32:22 +0000150 quopri.encode(infp, outfp, quotetabs=False)
Barry Warsaw70697632001-06-19 19:08:13 +0000151 self.assert_(outfp.getvalue() == e)
152
Walter Dörwaldb1975432005-12-14 23:32:22 +0000153 @withpythonimplementation
Barry Warsaw70697632001-06-19 19:08:13 +0000154 def test_decode(self):
155 for p, e in self.STRINGS:
Walter Dörwald3b287702005-12-15 20:17:20 +0000156 infp = cStringIO.StringIO(e)
157 outfp = cStringIO.StringIO()
Walter Dörwaldb1975432005-12-14 23:32:22 +0000158 quopri.decode(infp, outfp)
Barry Warsaw70697632001-06-19 19:08:13 +0000159 self.assert_(outfp.getvalue() == p)
160
Walter Dörwaldb1975432005-12-14 23:32:22 +0000161 @withpythonimplementation
Barry Warsaw70697632001-06-19 19:08:13 +0000162 def test_embedded_ws(self):
163 for p, e in self.ESTRINGS:
Walter Dörwaldb1975432005-12-14 23:32:22 +0000164 self.assert_(quopri.encodestring(p, quotetabs=True) == e)
165 self.assert_(quopri.decodestring(e) == p)
Barry Warsaw70697632001-06-19 19:08:13 +0000166
Walter Dörwaldb1975432005-12-14 23:32:22 +0000167 @withpythonimplementation
Martin v. Löwis16dc7f42001-09-30 20:32:11 +0000168 def test_encode_header(self):
169 for p, e in self.HSTRINGS:
Walter Dörwaldb1975432005-12-14 23:32:22 +0000170 self.assert_(quopri.encodestring(p, header=True) == e)
Martin v. Löwis16dc7f42001-09-30 20:32:11 +0000171
Walter Dörwaldb1975432005-12-14 23:32:22 +0000172 @withpythonimplementation
Martin v. Löwis16dc7f42001-09-30 20:32:11 +0000173 def test_decode_header(self):
174 for p, e in self.HSTRINGS:
Walter Dörwaldb1975432005-12-14 23:32:22 +0000175 self.assert_(quopri.decodestring(e, header=True) == p)
Tim Peters87cc0c32001-07-21 01:41:30 +0000176
Walter Dörwald3b287702005-12-15 20:17:20 +0000177 def test_scriptencode(self):
Tim Peters536cf992005-12-25 23:18:31 +0000178 (p, e) = self.STRINGS[-1]
179 (cin, cout) = os.popen2("%s -mquopri" % sys.executable)
180 cin.write(p)
181 cin.close()
182 self.assert_(cout.read() == e)
Walter Dörwald3b287702005-12-15 20:17:20 +0000183
184 def test_scriptdecode(self):
Tim Peters536cf992005-12-25 23:18:31 +0000185 (p, e) = self.STRINGS[-1]
186 (cin, cout) = os.popen2("%s -mquopri -d" % sys.executable)
187 cin.write(e)
188 cin.close()
189 self.assert_(cout.read() == p)
Walter Dörwald3b287702005-12-15 20:17:20 +0000190
Fred Drake2e2be372001-09-20 21:33:42 +0000191def test_main():
192 test_support.run_unittest(QuopriTestCase)
193
194
195if __name__ == "__main__":
196 test_main()