|
10 | 10 |
|
11 | 11 | from io import StringIO, BytesIO |
12 | 12 | from itertools import chain |
| 13 | +from random import choice |
13 | 14 |
|
14 | 15 | import email |
15 | 16 | import email.policy |
@@ -3353,16 +3354,70 @@ def test_pushCR_LF(self): |
3353 | 3354 | bsf.push(il) |
3354 | 3355 | nt += n |
3355 | 3356 | n1 = 0 |
3356 | | - while True: |
3357 | | - ol = bsf.readline() |
3358 | | - if ol == NeedMoreData: |
3359 | | - break |
| 3357 | + for ol in iter(bsf.readline, NeedMoreData): |
3360 | 3358 | om.append(ol) |
3361 | 3359 | n1 += 1 |
3362 | 3360 | self.assertEqual(n, n1) |
3363 | 3361 | self.assertEqual(len(om), nt) |
3364 | 3362 | self.assertEqual(''.join([il for il, n in imt]), ''.join(om)) |
3365 | 3363 |
|
| 3364 | + def test_push_random(self): |
| 3365 | + from email.feedparser import BufferedSubFile, NeedMoreData |
| 3366 | + |
| 3367 | + n = 10000 |
| 3368 | + chunksize = 5 |
| 3369 | + chars = 'abcd \t\r\n' |
| 3370 | + |
| 3371 | + s = ''.join(choice(chars) for i in range(n)) + '\n' |
| 3372 | + target = s.splitlines(True) |
| 3373 | + |
| 3374 | + bsf = BufferedSubFile() |
| 3375 | + lines = [] |
| 3376 | + for i in range(0, len(s), chunksize): |
| 3377 | + chunk = s[i:i+chunksize] |
| 3378 | + bsf.push(chunk) |
| 3379 | + lines.extend(iter(bsf.readline, NeedMoreData)) |
| 3380 | + self.assertEqual(lines, target) |
| 3381 | + |
| 3382 | + |
| 3383 | +class TestFeedParsers(TestEmailBase): |
| 3384 | + |
| 3385 | + def parse(self, chunks): |
| 3386 | + from email.feedparser import FeedParser |
| 3387 | + feedparser = FeedParser() |
| 3388 | + for chunk in chunks: |
| 3389 | + feedparser.feed(chunk) |
| 3390 | + return feedparser.close() |
| 3391 | + |
| 3392 | + def test_newlines(self): |
| 3393 | + m = self.parse(['a:\nb:\rc:\r\nd:\n']) |
| 3394 | + self.assertEqual(m.keys(), ['a', 'b', 'c', 'd']) |
| 3395 | + m = self.parse(['a:\nb:\rc:\r\nd:']) |
| 3396 | + self.assertEqual(m.keys(), ['a', 'b', 'c', 'd']) |
| 3397 | + m = self.parse(['a:\rb', 'c:\n']) |
| 3398 | + self.assertEqual(m.keys(), ['a', 'bc']) |
| 3399 | + m = self.parse(['a:\r', 'b:\n']) |
| 3400 | + self.assertEqual(m.keys(), ['a', 'b']) |
| 3401 | + m = self.parse(['a:\r', '\nb:\n']) |
| 3402 | + self.assertEqual(m.keys(), ['a', 'b']) |
| 3403 | + m = self.parse(['a:\x85b:\u2028c:\n']) |
| 3404 | + self.assertEqual(m.items(), [('a', '\x85'), ('b', '\u2028'), ('c', '')]) |
| 3405 | + m = self.parse(['a:\r', 'b:\x85', 'c:\n']) |
| 3406 | + self.assertEqual(m.items(), [('a', ''), ('b', '\x85'), ('c', '')]) |
| 3407 | + |
| 3408 | + def test_long_lines(self): |
| 3409 | + M, N = 1000, 100000 |
| 3410 | + m = self.parse(['a:b\n\n'] + ['x'*M] * N) |
| 3411 | + self.assertEqual(m.items(), [('a', 'b')]) |
| 3412 | + self.assertEqual(m.get_payload(), 'x'*M*N) |
| 3413 | + m = self.parse(['a:b\r\r'] + ['x'*M] * N) |
| 3414 | + self.assertEqual(m.items(), [('a', 'b')]) |
| 3415 | + self.assertEqual(m.get_payload(), 'x'*M*N) |
| 3416 | + m = self.parse(['a:b\r\r'] + ['x'*M+'\x85'] * N) |
| 3417 | + self.assertEqual(m.items(), [('a', 'b')]) |
| 3418 | + self.assertEqual(m.get_payload(), ('x'*M+'\x85')*N) |
| 3419 | + m = self.parse(['a:\r', 'b: '] + ['x'*M] * N) |
| 3420 | + self.assertEqual(m.items(), [('a', ''), ('b', 'x'*M*N)]) |
3366 | 3421 |
|
3367 | 3422 |
|
3368 | 3423 | class TestParsers(TestEmailBase): |
|
0 commit comments