1
from test import support
2
from test.support import bigmemtest, _1G, _2G, _4G, precisionbigmemtest
9
# Bigmem testing houserules:
11
# - Try not to allocate too many large objects. It's okay to rely on
12
# refcounting semantics, but don't forget that 's = create_largestring()'
13
# doesn't release the old 's' (if it exists) until well after its new
14
# value has been created. Use 'del s' before the create_largestring call.
16
# - Do *not* compare large objects using assertEquals or similar. It's a
17
# lengthy operation and the errormessage will be utterly useless due to
18
# its size. To make sure whether a result has the right contents, better
19
# to use the strip or count methods, or compare meaningful slices.
21
# - Don't forget to test for large indices, offsets and results and such,
22
# in addition to large sizes.
24
# - When repeating an object (say, a substring, or a small list) to create
25
# a large object, make the subobject of a length that is not a power of
26
# 2. That way, int-wrapping problems are more easily detected.
28
# - While the bigmemtest decorator speaks of 'minsize', all tests will
29
# actually be called with a much smaller number too, in the normal
30
# test run (5Kb currently.) This is so the tests themselves get frequent
31
# testing. Consequently, always make all large allocations based on the
32
# passed-in 'size', and don't rely on the size being very large. Also,
33
# memuse-per-size should remain sane (less than a few thousand); if your
34
# test uses more, adjust 'size' upward, instead.
36
# BEWARE: it seems that one failing test can yield other subsequent tests to
37
# fail as well. I do not know whether it is due to memory fragmentation
38
# issues, or other specifics of the platform malloc() routine.
40
character_size = 4 if sys.maxunicode > 0xFFFF else 2
45
@bigmemtest(minsize=_2G, memuse=2)
46
def test_capitalize(self, size):
48
SUBSTR = self.from_latin1(' abc def ghi')
49
s = _('-') * size + SUBSTR
51
self.assertEquals(caps[-len(SUBSTR):],
53
self.assertEquals(caps.lstrip(_('-')), SUBSTR)
55
@bigmemtest(minsize=_2G + 10, memuse=1)
56
def test_center(self, size):
57
SUBSTR = self.from_latin1(' abc def ghi')
58
s = SUBSTR.center(size)
59
self.assertEquals(len(s), size)
60
lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2
63
self.assertEquals(s[lpadsize:-rpadsize], SUBSTR)
64
self.assertEquals(s.strip(), SUBSTR.strip())
66
@bigmemtest(minsize=_2G, memuse=2)
67
def test_count(self, size):
69
SUBSTR = _(' abc def ghi')
70
s = _('.') * size + SUBSTR
71
self.assertEquals(s.count(_('.')), size)
73
self.assertEquals(s.count(_('.')), size + 1)
74
self.assertEquals(s.count(_(' ')), 3)
75
self.assertEquals(s.count(_('i')), 1)
76
self.assertEquals(s.count(_('j')), 0)
78
@bigmemtest(minsize=_2G, memuse=2)
79
def test_endswith(self, size):
81
SUBSTR = _(' abc def ghi')
82
s = _('-') * size + SUBSTR
83
self.failUnless(s.endswith(SUBSTR))
84
self.failUnless(s.endswith(s))
86
self.failUnless(s2.endswith(s))
87
self.failIf(s.endswith(_('a') + SUBSTR))
88
self.failIf(SUBSTR.endswith(s))
90
@bigmemtest(minsize=_2G + 10, memuse=2)
91
def test_expandtabs(self, size):
95
self.assertEquals(s.expandtabs(), s)
97
slen, remainder = divmod(size, tabsize)
99
s = s.expandtabs(tabsize)
100
self.assertEquals(len(s), size - remainder)
101
self.assertEquals(len(s.strip(_(' '))), 0)
103
@bigmemtest(minsize=_2G, memuse=2)
104
def test_find(self, size):
106
SUBSTR = _(' abc def ghi')
108
s = _('').join([SUBSTR, _('-') * size, SUBSTR])
109
self.assertEquals(s.find(_(' ')), 0)
110
self.assertEquals(s.find(SUBSTR), 0)
111
self.assertEquals(s.find(_(' '), sublen), sublen + size)
112
self.assertEquals(s.find(SUBSTR, len(SUBSTR)), sublen + size)
113
self.assertEquals(s.find(_('i')), SUBSTR.find(_('i')))
114
self.assertEquals(s.find(_('i'), sublen),
115
sublen + size + SUBSTR.find(_('i')))
116
self.assertEquals(s.find(_('i'), size),
117
sublen + size + SUBSTR.find(_('i')))
118
self.assertEquals(s.find(_('j')), -1)
120
@bigmemtest(minsize=_2G, memuse=2)
121
def test_index(self, size):
123
SUBSTR = _(' abc def ghi')
125
s = _('').join([SUBSTR, _('-') * size, SUBSTR])
126
self.assertEquals(s.index(_(' ')), 0)
127
self.assertEquals(s.index(SUBSTR), 0)
128
self.assertEquals(s.index(_(' '), sublen), sublen + size)
129
self.assertEquals(s.index(SUBSTR, sublen), sublen + size)
130
self.assertEquals(s.index(_('i')), SUBSTR.index(_('i')))
131
self.assertEquals(s.index(_('i'), sublen),
132
sublen + size + SUBSTR.index(_('i')))
133
self.assertEquals(s.index(_('i'), size),
134
sublen + size + SUBSTR.index(_('i')))
135
self.assertRaises(ValueError, s.index, _('j'))
137
@bigmemtest(minsize=_2G, memuse=2)
138
def test_isalnum(self, size):
141
s = _('a') * size + SUBSTR
142
self.failUnless(s.isalnum())
144
self.failIf(s.isalnum())
146
@bigmemtest(minsize=_2G, memuse=2)
147
def test_isalpha(self, size):
149
SUBSTR = _('zzzzzzz')
150
s = _('a') * size + SUBSTR
151
self.failUnless(s.isalpha())
153
self.failIf(s.isalpha())
155
@bigmemtest(minsize=_2G, memuse=2)
156
def test_isdigit(self, size):
159
s = _('9') * size + SUBSTR
160
self.failUnless(s.isdigit())
162
self.failIf(s.isdigit())
164
@bigmemtest(minsize=_2G, memuse=2)
165
def test_islower(self, size):
168
chr(c) for c in range(255) if not chr(c).isupper()))
169
repeats = size // len(chars) + 2
171
self.failUnless(s.islower())
173
self.failIf(s.islower())
175
@bigmemtest(minsize=_2G, memuse=2)
176
def test_isspace(self, size):
178
whitespace = _(' \f\n\r\t\v')
179
repeats = size // len(whitespace) + 2
180
s = whitespace * repeats
181
self.failUnless(s.isspace())
183
self.failIf(s.isspace())
185
@bigmemtest(minsize=_2G, memuse=2)
186
def test_istitle(self, size):
189
s = _('').join([_('A'), _('a') * size, SUBSTR])
190
self.failUnless(s.istitle())
192
self.failUnless(s.istitle())
194
self.failIf(s.istitle())
196
@bigmemtest(minsize=_2G, memuse=2)
197
def test_isupper(self, size):
200
chr(c) for c in range(255) if not chr(c).islower()))
201
repeats = size // len(chars) + 2
203
self.failUnless(s.isupper())
205
self.failIf(s.isupper())
207
@bigmemtest(minsize=_2G, memuse=2)
208
def test_join(self, size):
211
x = s.join([_('aaaaa'), _('bbbbb')])
212
self.assertEquals(x.count(_('a')), 5)
213
self.assertEquals(x.count(_('b')), 5)
214
self.failUnless(x.startswith(_('aaaaaA')))
215
self.failUnless(x.endswith(_('Abbbbb')))
217
@bigmemtest(minsize=_2G + 10, memuse=1)
218
def test_ljust(self, size):
220
SUBSTR = _(' abc def ghi')
221
s = SUBSTR.ljust(size)
222
self.failUnless(s.startswith(SUBSTR + _(' ')))
223
self.assertEquals(len(s), size)
224
self.assertEquals(s.strip(), SUBSTR.strip())
226
@bigmemtest(minsize=_2G + 10, memuse=2)
227
def test_lower(self, size):
231
self.assertEquals(len(s), size)
232
self.assertEquals(s.count(_('a')), size)
234
@bigmemtest(minsize=_2G + 10, memuse=1)
235
def test_lstrip(self, size):
237
SUBSTR = _('abc def ghi')
238
s = SUBSTR.rjust(size)
239
self.assertEquals(len(s), size)
240
self.assertEquals(s.lstrip(), SUBSTR.lstrip())
242
s = SUBSTR.ljust(size)
243
self.assertEquals(len(s), size)
244
# Type-specific optimization
245
if isinstance(s, (str, bytes)):
246
stripped = s.lstrip()
247
self.failUnless(stripped is s)
249
@bigmemtest(minsize=_2G + 10, memuse=2)
250
def test_replace(self, size):
254
s = s.replace(_(' '), replacement)
255
self.assertEquals(len(s), size)
256
self.assertEquals(s.count(replacement), size)
257
s = s.replace(replacement, _(' '), size - 4)
258
self.assertEquals(len(s), size)
259
self.assertEquals(s.count(replacement), 4)
260
self.assertEquals(s[-10:], _(' aaaa'))
262
@bigmemtest(minsize=_2G, memuse=2)
263
def test_rfind(self, size):
265
SUBSTR = _(' abc def ghi')
267
s = _('').join([SUBSTR, _('-') * size, SUBSTR])
268
self.assertEquals(s.rfind(_(' ')), sublen + size + SUBSTR.rfind(_(' ')))
269
self.assertEquals(s.rfind(SUBSTR), sublen + size)
270
self.assertEquals(s.rfind(_(' '), 0, size), SUBSTR.rfind(_(' ')))
271
self.assertEquals(s.rfind(SUBSTR, 0, sublen + size), 0)
272
self.assertEquals(s.rfind(_('i')), sublen + size + SUBSTR.rfind(_('i')))
273
self.assertEquals(s.rfind(_('i'), 0, sublen), SUBSTR.rfind(_('i')))
274
self.assertEquals(s.rfind(_('i'), 0, sublen + size),
275
SUBSTR.rfind(_('i')))
276
self.assertEquals(s.rfind(_('j')), -1)
278
@bigmemtest(minsize=_2G, memuse=2)
279
def test_rindex(self, size):
281
SUBSTR = _(' abc def ghi')
283
s = _('').join([SUBSTR, _('-') * size, SUBSTR])
284
self.assertEquals(s.rindex(_(' ')),
285
sublen + size + SUBSTR.rindex(_(' ')))
286
self.assertEquals(s.rindex(SUBSTR), sublen + size)
287
self.assertEquals(s.rindex(_(' '), 0, sublen + size - 1),
288
SUBSTR.rindex(_(' ')))
289
self.assertEquals(s.rindex(SUBSTR, 0, sublen + size), 0)
290
self.assertEquals(s.rindex(_('i')),
291
sublen + size + SUBSTR.rindex(_('i')))
292
self.assertEquals(s.rindex(_('i'), 0, sublen), SUBSTR.rindex(_('i')))
293
self.assertEquals(s.rindex(_('i'), 0, sublen + size),
294
SUBSTR.rindex(_('i')))
295
self.assertRaises(ValueError, s.rindex, _('j'))
297
@bigmemtest(minsize=_2G + 10, memuse=1)
298
def test_rjust(self, size):
300
SUBSTR = _(' abc def ghi')
301
s = SUBSTR.ljust(size)
302
self.failUnless(s.startswith(SUBSTR + _(' ')))
303
self.assertEquals(len(s), size)
304
self.assertEquals(s.strip(), SUBSTR.strip())
306
@bigmemtest(minsize=_2G + 10, memuse=1)
307
def test_rstrip(self, size):
309
SUBSTR = _(' abc def ghi')
310
s = SUBSTR.ljust(size)
311
self.assertEquals(len(s), size)
312
self.assertEquals(s.rstrip(), SUBSTR.rstrip())
314
s = SUBSTR.rjust(size)
315
self.assertEquals(len(s), size)
316
# Type-specific optimization
317
if isinstance(s, (str, bytes)):
318
stripped = s.rstrip()
319
self.failUnless(stripped is s)
321
# The test takes about size bytes to build a string, and then about
322
# sqrt(size) substrings of sqrt(size) in size and a list to
323
# hold sqrt(size) items. It's close but just over 2x size.
324
@bigmemtest(minsize=_2G, memuse=2.1)
325
def test_split_small(self, size):
327
# Crudely calculate an estimate so that the result of s.split won't
328
# take up an inordinate amount of memory
329
chunksize = int(size ** 0.5 + 2)
330
SUBSTR = _('a') + _(' ') * chunksize
331
s = SUBSTR * chunksize
333
self.assertEquals(len(l), chunksize)
336
self.assertEquals(item, expected)
339
self.assertEquals(len(l), chunksize + 1)
340
expected = _(' ') * chunksize
341
for item in filter(None, l):
342
self.assertEquals(item, expected)
344
# Allocates a string of twice size (and briefly two) and a list of
345
# size. Because of internal affairs, the s.split() call produces a
346
# list of size times the same one-character string, so we only
347
# suffer for the list size. (Otherwise, it'd cost another 48 times
348
# size in bytes!) Nevertheless, a list of size takes
350
@bigmemtest(minsize=_2G + 5, memuse=10)
351
def test_split_large(self, size):
353
s = _(' a') * size + _(' ')
355
self.assertEquals(len(l), size)
356
self.assertEquals(set(l), set([_('a')]))
359
self.assertEquals(len(l), size + 1)
360
self.assertEquals(set(l), set([_(' ')]))
362
@bigmemtest(minsize=_2G, memuse=2.1)
363
def test_splitlines(self, size):
365
# Crudely calculate an estimate so that the result of s.split won't
366
# take up an inordinate amount of memory
367
chunksize = int(size ** 0.5 + 2) // 2
368
SUBSTR = _(' ') * chunksize + _('\n') + _(' ') * chunksize + _('\r\n')
369
s = SUBSTR * chunksize
371
self.assertEquals(len(l), chunksize * 2)
372
expected = _(' ') * chunksize
374
self.assertEquals(item, expected)
376
@bigmemtest(minsize=_2G, memuse=2)
377
def test_startswith(self, size):
379
SUBSTR = _(' abc def ghi')
380
s = _('-') * size + SUBSTR
381
self.failUnless(s.startswith(s))
382
self.failUnless(s.startswith(_('-') * size))
383
self.failIf(s.startswith(SUBSTR))
385
@bigmemtest(minsize=_2G, memuse=1)
386
def test_strip(self, size):
388
SUBSTR = _(' abc def ghi ')
389
s = SUBSTR.rjust(size)
390
self.assertEquals(len(s), size)
391
self.assertEquals(s.strip(), SUBSTR.strip())
393
s = SUBSTR.ljust(size)
394
self.assertEquals(len(s), size)
395
self.assertEquals(s.strip(), SUBSTR.strip())
397
@bigmemtest(minsize=_2G, memuse=2)
398
def test_swapcase(self, size):
400
SUBSTR = _("aBcDeFG12.'\xa9\x00")
402
repeats = size // sublen + 2
405
self.assertEquals(len(s), sublen * repeats)
406
self.assertEquals(s[:sublen * 3], SUBSTR.swapcase() * 3)
407
self.assertEquals(s[-sublen * 3:], SUBSTR.swapcase() * 3)
409
@bigmemtest(minsize=_2G, memuse=2)
410
def test_title(self, size):
412
SUBSTR = _('SpaaHAaaAaham')
413
s = SUBSTR * (size // len(SUBSTR) + 2)
415
self.failUnless(s.startswith((SUBSTR * 3).title()))
416
self.failUnless(s.endswith(SUBSTR.lower() * 3))
418
@bigmemtest(minsize=_2G, memuse=2)
419
def test_translate(self, size):
426
SUBSTR = _('aZz.z.Aaz.')
427
if not isinstance(SUBSTR, str):
428
# Workaround the inexistence of bytes.maketrans()
429
chars = bytearray(range(256))
430
for k, v in trans.items():
434
repeats = size // sublen + 2
436
s = s.translate(trans)
437
self.assertEquals(len(s), repeats * sublen)
438
self.assertEquals(s[:sublen], SUBSTR.translate(trans))
439
self.assertEquals(s[-sublen:], SUBSTR.translate(trans))
440
self.assertEquals(s.count(_('.')), 0)
441
self.assertEquals(s.count(_('!')), repeats * 2)
442
self.assertEquals(s.count(_('z')), repeats * 3)
444
@bigmemtest(minsize=_2G + 5, memuse=2)
445
def test_upper(self, size):
449
self.assertEquals(len(s), size)
450
self.assertEquals(s.count(_('A')), size)
452
@bigmemtest(minsize=_2G + 20, memuse=1)
453
def test_zfill(self, size):
455
SUBSTR = _('-568324723598234')
456
s = SUBSTR.zfill(size)
457
self.failUnless(s.endswith(_('0') + SUBSTR[1:]))
458
self.failUnless(s.startswith(_('-0')))
459
self.assertEquals(len(s), size)
460
self.assertEquals(s.count(_('0')), size - len(SUBSTR))
462
# This test is meaningful even with size < 2G, as long as the
463
# doubled string is > 2G (but it tests more if both are > 2G :)
464
@bigmemtest(minsize=_1G + 2, memuse=3)
465
def test_concat(self, size):
468
self.assertEquals(len(s), size)
470
self.assertEquals(len(s), size * 2)
471
self.assertEquals(s.count(_('.')), size * 2)
473
# This test is meaningful even with size < 2G, as long as the
474
# repeated string is > 2G (but it tests more if both are > 2G :)
475
@bigmemtest(minsize=_1G + 2, memuse=3)
476
def test_repeat(self, size):
479
self.assertEquals(len(s), size)
481
self.assertEquals(len(s), size * 2)
482
self.assertEquals(s.count(_('.')), size * 2)
484
@bigmemtest(minsize=_2G + 20, memuse=2)
485
def test_slice_and_getitem(self, size):
487
SUBSTR = _('0123456789')
489
s = SUBSTR * (size // sublen)
490
stepsize = len(s) // 100
491
stepsize = stepsize - (stepsize % sublen)
492
for i in range(0, len(s) - stepsize, stepsize):
493
self.assertEquals(s[i], SUBSTR[0])
494
self.assertEquals(s[i:i + sublen], SUBSTR)
495
self.assertEquals(s[i:i + sublen:2], SUBSTR[::2])
497
self.assertEquals(s[i + sublen - 1:i - 1:-3],
499
# Make sure we do some slicing and indexing near the end of the
501
self.assertEquals(s[len(s) - 1], SUBSTR[-1])
502
self.assertEquals(s[-1], SUBSTR[-1])
503
self.assertEquals(s[len(s) - 10], SUBSTR[0])
504
self.assertEquals(s[-sublen], SUBSTR[0])
505
self.assertEquals(s[len(s):], _(''))
506
self.assertEquals(s[len(s) - 1:], SUBSTR[-1:])
507
self.assertEquals(s[-1:], SUBSTR[-1:])
508
self.assertEquals(s[len(s) - sublen:], SUBSTR)
509
self.assertEquals(s[-sublen:], SUBSTR)
510
self.assertEquals(len(s[:]), len(s))
511
self.assertEquals(len(s[:len(s) - 5]), len(s) - 5)
512
self.assertEquals(len(s[5:-5]), len(s) - 10)
514
self.assertRaises(IndexError, operator.getitem, s, len(s))
515
self.assertRaises(IndexError, operator.getitem, s, len(s) + 1)
516
self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31)
518
@bigmemtest(minsize=_2G, memuse=2)
519
def test_contains(self, size):
521
SUBSTR = _('0123456789')
522
edge = _('-') * (size // 2)
523
s = _('').join([edge, SUBSTR, edge])
525
self.failUnless(SUBSTR in s)
526
self.failIf(SUBSTR * 2 in s)
527
self.failUnless(_('-') in s)
528
self.failIf(_('a') in s)
530
self.failUnless(_('a') in s)
532
@bigmemtest(minsize=_2G + 10, memuse=2)
533
def test_compare(self, size):
537
self.assertEqual(s1, s2)
540
self.failIf(s1 == s2)
543
self.failIf(s1 == s2)
545
@bigmemtest(minsize=_2G + 10, memuse=1)
546
def test_hash(self, size):
547
# Not sure if we can do any meaningful tests here... Even if we
548
# start relying on the exact algorithm used, the result will be
549
# different depending on the size of the C 'long int'. Even this
550
# test is dodgy (there's no *guarantee* that the two things should
551
# have a different hash, even if they, in the current
552
# implementation, almost always do.)
557
s = _('\x00') * (size + 1)
558
self.failIf(h1 == hash(s))
561
class StrTest(unittest.TestCase, BaseStrTest):
563
def from_latin1(self, s):
566
def basic_encode_test(self, size, enc, c='.', expectedsize=None):
567
if expectedsize is None:
571
self.assertEquals(len(s.encode(enc)), expectedsize)
574
# HACK: adjust memory use of tests inherited from BaseStrTest
575
# according to character size.
577
for name in dir(BaseStrTest):
578
if not name.startswith('test_'):
580
meth = getattr(type(self), name)
583
except AttributeError:
585
meth.memuse = character_size * memuse
586
self._adjusted[name] = memuse
589
for name, memuse in self._adjusted.items():
590
getattr(type(self), name).memuse = memuse
592
@bigmemtest(minsize=_2G + 2, memuse=character_size + 1)
593
def test_encode(self, size):
594
return self.basic_encode_test(size, 'utf-8')
596
@precisionbigmemtest(size=_4G // 6 + 2, memuse=character_size + 1)
597
def test_encode_raw_unicode_escape(self, size):
599
return self.basic_encode_test(size, 'raw_unicode_escape')
601
pass # acceptable on 32-bit
603
@precisionbigmemtest(size=_4G // 5 + 70, memuse=character_size + 1)
604
def test_encode_utf7(self, size):
606
return self.basic_encode_test(size, 'utf7')
608
pass # acceptable on 32-bit
610
@precisionbigmemtest(size=_4G // 4 + 5, memuse=character_size + 4)
611
def test_encode_utf32(self, size):
613
return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4)
615
pass # acceptable on 32-bit
617
@precisionbigmemtest(size=_2G - 1, memuse=character_size + 1)
618
def test_encode_ascii(self, size):
619
return self.basic_encode_test(size, 'ascii', c='A')
621
@precisionbigmemtest(size=_4G // 5, memuse=character_size * (6 + 1))
622
def test_unicode_repr_overflow(self, size):
627
pass # acceptable on 32-bit
629
self.failUnless(s == eval(r))
631
@bigmemtest(minsize=_2G + 10, memuse=character_size * 2)
632
def test_format(self, size):
635
self.assertEqual(s, sf)
638
self.assertEquals(len(sf), len(s) + 4)
639
self.failUnless(sf.startswith('..-'))
640
self.failUnless(sf.endswith('-..'))
645
s = ''.join([edge, '%s', edge])
648
self.assertEquals(len(s), size * 2 + 3)
649
self.assertEquals(s.count('.'), 3)
650
self.assertEquals(s.count('-'), size * 2)
652
@bigmemtest(minsize=_2G + 10, memuse=character_size * 2)
653
def test_repr_small(self, size):
656
self.assertEquals(len(s), size + 2)
657
self.assertEquals(s[0], "'")
658
self.assertEquals(s[-1], "'")
659
self.assertEquals(s.count('-'), size)
661
# repr() will create a string four times as large as this 'binary
662
# string', but we don't want to allocate much more than twice
663
# size in total. (We do extra testing in test_repr_large())
667
self.assertEquals(len(s), size * 4 + 2)
668
self.assertEquals(s[0], "'")
669
self.assertEquals(s[-1], "'")
670
self.assertEquals(s.count('\\'), size)
671
self.assertEquals(s.count('0'), size * 2)
673
@bigmemtest(minsize=_2G + 10, memuse=character_size * 5)
674
def test_repr_large(self, size):
677
self.assertEquals(len(s), size * 4 + 2)
678
self.assertEquals(s[0], "'")
679
self.assertEquals(s[-1], "'")
680
self.assertEquals(s.count('\\'), size)
681
self.assertEquals(s.count('0'), size * 2)
683
@bigmemtest(minsize=2**32 / 5, memuse=character_size * 7)
684
def test_unicode_repr(self, size):
686
for f in (repr, ascii):
688
self.failUnless(len(r) > size)
689
self.failUnless(r.endswith(r"\uaaaa'"), r[-10:])
692
# The character takes 4 bytes even in UCS-2 builds because it will
693
# be decomposed into surrogates.
694
@bigmemtest(minsize=2**32 / 5, memuse=4 + character_size * 9)
695
def test_unicode_repr_wide(self, size):
696
s = "\U0001AAAA" * size
697
for f in (repr, ascii):
699
self.failUnless(len(r) > size)
700
self.failUnless(r.endswith(r"\U0001aaaa'"), r[-12:])
704
class BytesTest(unittest.TestCase, BaseStrTest):
706
def from_latin1(self, s):
707
return s.encode("latin1")
709
@bigmemtest(minsize=_2G + 2, memuse=1 + character_size)
710
def test_decode(self, size):
711
s = self.from_latin1('.') * size
712
self.assertEquals(len(s.decode('utf-8')), size)
715
class BytearrayTest(unittest.TestCase, BaseStrTest):
717
def from_latin1(self, s):
718
return bytearray(s.encode("latin1"))
720
@bigmemtest(minsize=_2G + 2, memuse=1 + character_size)
721
def test_decode(self, size):
722
s = self.from_latin1('.') * size
723
self.assertEquals(len(s.decode('utf-8')), size)
726
test_split_large = None
728
class TupleTest(unittest.TestCase):
730
# Tuples have a small, fixed-sized head and an array of pointers to
731
# data. Since we're testing 64-bit addressing, we can assume that the
732
# pointers are 8 bytes, and that thus that the tuples take up 8 bytes
735
# As a side-effect of testing long tuples, these tests happen to test
736
# having more than 2<<31 references to any given object. Hence the
737
# use of different types of objects as contents in different tests.
739
@bigmemtest(minsize=_2G + 2, memuse=16)
740
def test_compare(self, size):
743
self.assertEqual(t1, t2)
745
t2 = ('',) * (size + 1)
746
self.failIf(t1 == t2)
749
self.failIf(t1 == t2)
751
# Test concatenating into a single tuple of more than 2G in length,
752
# and concatenating a tuple of more than 2G in length separately, so
753
# the smaller test still gets run even if there isn't memory for the
754
# larger test (but we still let the tester know the larger test is
755
# skipped, in verbose mode.)
756
def basic_concat_test(self, size):
758
self.assertEquals(len(t), size)
760
self.assertEquals(len(t), size * 2)
762
@bigmemtest(minsize=_2G // 2 + 2, memuse=24)
763
def test_concat_small(self, size):
764
return self.basic_concat_test(size)
766
@bigmemtest(minsize=_2G + 2, memuse=24)
767
def test_concat_large(self, size):
768
return self.basic_concat_test(size)
770
@bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
771
def test_contains(self, size):
772
t = (1, 2, 3, 4, 5) * size
773
self.assertEquals(len(t), size * 5)
774
self.failUnless(5 in t)
775
self.failIf((1, 2, 3, 4, 5) in t)
778
@bigmemtest(minsize=_2G + 10, memuse=8)
779
def test_hash(self, size):
783
t2 = (0,) * (size + 1)
784
self.failIf(h1 == hash(t2))
786
@bigmemtest(minsize=_2G + 10, memuse=8)
787
def test_index_and_slice(self, size):
789
self.assertEquals(len(t), size)
790
self.assertEquals(t[-1], None)
791
self.assertEquals(t[5], None)
792
self.assertEquals(t[size - 1], None)
793
self.assertRaises(IndexError, operator.getitem, t, size)
794
self.assertEquals(t[:5], (None,) * 5)
795
self.assertEquals(t[-5:], (None,) * 5)
796
self.assertEquals(t[20:25], (None,) * 5)
797
self.assertEquals(t[-25:-20], (None,) * 5)
798
self.assertEquals(t[size - 5:], (None,) * 5)
799
self.assertEquals(t[size - 5:size], (None,) * 5)
800
self.assertEquals(t[size - 6:size - 2], (None,) * 4)
801
self.assertEquals(t[size:size], ())
802
self.assertEquals(t[size:size+5], ())
804
# Like test_concat, split in two.
805
def basic_test_repeat(self, size):
807
self.assertEquals(len(t), size)
809
self.assertEquals(len(t), size * 2)
811
@bigmemtest(minsize=_2G // 2 + 2, memuse=24)
812
def test_repeat_small(self, size):
813
return self.basic_test_repeat(size)
815
@bigmemtest(minsize=_2G + 2, memuse=24)
816
def test_repeat_large(self, size):
817
return self.basic_test_repeat(size)
819
@bigmemtest(minsize=_1G - 1, memuse=12)
820
def test_repeat_large_2(self, size):
821
return self.basic_test_repeat(size)
823
@precisionbigmemtest(size=_1G - 1, memuse=9)
824
def test_from_2G_generator(self, size):
826
t = tuple(range(size))
828
pass # acceptable on 32-bit
832
self.assertEquals(item, count)
834
self.assertEquals(count, size)
836
@precisionbigmemtest(size=_1G - 25, memuse=9)
837
def test_from_almost_2G_generator(self, size):
839
t = tuple(range(size))
842
self.assertEquals(item, count)
844
self.assertEquals(count, size)
846
pass # acceptable, expected on 32-bit
848
# Like test_concat, split in two.
849
def basic_test_repr(self, size):
852
# The repr of a tuple of 0's is exactly three times the tuple length.
853
self.assertEquals(len(s), size * 3)
854
self.assertEquals(s[:5], '(0, 0')
855
self.assertEquals(s[-5:], '0, 0)')
856
self.assertEquals(s.count('0'), size)
858
@bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
859
def test_repr_small(self, size):
860
return self.basic_test_repr(size)
862
@bigmemtest(minsize=_2G + 2, memuse=8 + 3)
863
def test_repr_large(self, size):
864
return self.basic_test_repr(size)
866
class ListTest(unittest.TestCase):
868
# Like tuples, lists have a small, fixed-sized head and an array of
869
# pointers to data, so 8 bytes per size. Also like tuples, we make the
870
# lists hold references to various objects to test their refcount
873
@bigmemtest(minsize=_2G + 2, memuse=16)
874
def test_compare(self, size):
877
self.assertEqual(l1, l2)
879
l2 = [''] * (size + 1)
880
self.failIf(l1 == l2)
883
self.failIf(l1 == l2)
885
# Test concatenating into a single list of more than 2G in length,
886
# and concatenating a list of more than 2G in length separately, so
887
# the smaller test still gets run even if there isn't memory for the
888
# larger test (but we still let the tester know the larger test is
889
# skipped, in verbose mode.)
890
def basic_test_concat(self, size):
892
self.assertEquals(len(l), size)
894
self.assertEquals(len(l), size * 2)
896
@bigmemtest(minsize=_2G // 2 + 2, memuse=24)
897
def test_concat_small(self, size):
898
return self.basic_test_concat(size)
900
@bigmemtest(minsize=_2G + 2, memuse=24)
901
def test_concat_large(self, size):
902
return self.basic_test_concat(size)
904
def basic_test_inplace_concat(self, size):
905
l = [sys.stdout] * size
907
self.assertEquals(len(l), size * 2)
908
self.failUnless(l[0] is l[-1])
909
self.failUnless(l[size - 1] is l[size + 1])
911
@bigmemtest(minsize=_2G // 2 + 2, memuse=24)
912
def test_inplace_concat_small(self, size):
913
return self.basic_test_inplace_concat(size)
915
@bigmemtest(minsize=_2G + 2, memuse=24)
916
def test_inplace_concat_large(self, size):
917
return self.basic_test_inplace_concat(size)
919
@bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
920
def test_contains(self, size):
921
l = [1, 2, 3, 4, 5] * size
922
self.assertEquals(len(l), size * 5)
923
self.failUnless(5 in l)
924
self.failIf([1, 2, 3, 4, 5] in l)
927
@bigmemtest(minsize=_2G + 10, memuse=8)
928
def test_hash(self, size):
930
self.failUnlessRaises(TypeError, hash, l)
932
@bigmemtest(minsize=_2G + 10, memuse=8)
933
def test_index_and_slice(self, size):
935
self.assertEquals(len(l), size)
936
self.assertEquals(l[-1], None)
937
self.assertEquals(l[5], None)
938
self.assertEquals(l[size - 1], None)
939
self.assertRaises(IndexError, operator.getitem, l, size)
940
self.assertEquals(l[:5], [None] * 5)
941
self.assertEquals(l[-5:], [None] * 5)
942
self.assertEquals(l[20:25], [None] * 5)
943
self.assertEquals(l[-25:-20], [None] * 5)
944
self.assertEquals(l[size - 5:], [None] * 5)
945
self.assertEquals(l[size - 5:size], [None] * 5)
946
self.assertEquals(l[size - 6:size - 2], [None] * 4)
947
self.assertEquals(l[size:size], [])
948
self.assertEquals(l[size:size+5], [])
951
self.assertEquals(len(l), size)
952
self.assertEquals(l[-3:], [None, 5, None])
953
self.assertEquals(l.count(5), 1)
954
self.assertRaises(IndexError, operator.setitem, l, size, 6)
955
self.assertEquals(len(l), size)
957
l[size - 7:] = [1, 2, 3, 4, 5]
959
self.assertEquals(len(l), size)
960
self.assertEquals(l[-7:], [None, None, 1, 2, 3, 4, 5])
962
l[:7] = [1, 2, 3, 4, 5]
964
self.assertEquals(len(l), size)
965
self.assertEquals(l[:7], [1, 2, 3, 4, 5, None, None])
969
self.assertEquals(len(l), size)
970
self.assertEquals(l[-1], 4)
974
self.assertEquals(len(l), size)
975
self.assertEquals(l[-1], 2)
979
self.assertEquals(len(l), size)
980
self.assertEquals(l[0], 2)
984
self.assertEquals(len(l), size)
985
self.assertEquals(l[0], 4)
987
# Like test_concat, split in two.
988
def basic_test_repeat(self, size):
992
self.assertEquals(len(l), size)
994
self.assertEquals(len(l), size * 2)
996
@bigmemtest(minsize=_2G // 2 + 2, memuse=24)
997
def test_repeat_small(self, size):
998
return self.basic_test_repeat(size)
1000
@bigmemtest(minsize=_2G + 2, memuse=24)
1001
def test_repeat_large(self, size):
1002
return self.basic_test_repeat(size)
1004
def basic_test_inplace_repeat(self, size):
1007
self.assertEquals(len(l), size)
1008
self.failUnless(l[0] is l[-1])
1013
self.assertEquals(len(l), size * 2)
1014
self.failUnless(l[size - 1] is l[-1])
1016
@bigmemtest(minsize=_2G // 2 + 2, memuse=16)
1017
def test_inplace_repeat_small(self, size):
1018
return self.basic_test_inplace_repeat(size)
1020
@bigmemtest(minsize=_2G + 2, memuse=16)
1021
def test_inplace_repeat_large(self, size):
1022
return self.basic_test_inplace_repeat(size)
1024
def basic_test_repr(self, size):
1027
# The repr of a list of 0's is exactly three times the list length.
1028
self.assertEquals(len(s), size * 3)
1029
self.assertEquals(s[:5], '[0, 0')
1030
self.assertEquals(s[-5:], '0, 0]')
1031
self.assertEquals(s.count('0'), size)
1033
@bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
1034
def test_repr_small(self, size):
1035
return self.basic_test_repr(size)
1037
@bigmemtest(minsize=_2G + 2, memuse=8 + 3)
1038
def test_repr_large(self, size):
1039
return self.basic_test_repr(size)
1041
# list overallocates ~1/8th of the total size (on first expansion) so
1042
# the single list.append call puts memuse at 9 bytes per size.
1043
@bigmemtest(minsize=_2G, memuse=9)
1044
def test_append(self, size):
1045
l = [object()] * size
1047
self.assertEquals(len(l), size+1)
1048
self.failUnless(l[-3] is l[-2])
1049
self.failIf(l[-2] is l[-1])
1051
@bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1052
def test_count(self, size):
1053
l = [1, 2, 3, 4, 5] * size
1054
self.assertEquals(l.count(1), size)
1055
self.assertEquals(l.count("1"), 0)
1057
def basic_test_extend(self, size):
1060
self.assertEquals(len(l), size * 2)
1061
self.failUnless(l[0] is l[-1])
1062
self.failUnless(l[size - 1] is l[size + 1])
1064
@bigmemtest(minsize=_2G // 2 + 2, memuse=16)
1065
def test_extend_small(self, size):
1066
return self.basic_test_extend(size)
1068
@bigmemtest(minsize=_2G + 2, memuse=16)
1069
def test_extend_large(self, size):
1070
return self.basic_test_extend(size)
1072
@bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1073
def test_index(self, size):
1074
l = [1, 2, 3, 4, 5] * size
1076
self.assertEquals(l.index(1), 0)
1077
self.assertEquals(l.index(5, size - 5), size - 1)
1078
self.assertEquals(l.index(5, size - 5, size), size - 1)
1079
self.assertRaises(ValueError, l.index, 1, size - 4, size)
1080
self.assertRaises(ValueError, l.index, 6)
1082
# This tests suffers from overallocation, just like test_append.
1083
@bigmemtest(minsize=_2G + 10, memuse=9)
1084
def test_insert(self, size):
1086
l.insert(size - 1, "A")
1088
self.assertEquals(len(l), size)
1089
self.assertEquals(l[-3:], [1.0, "A", 1.0])
1091
l.insert(size + 1, "B")
1093
self.assertEquals(len(l), size)
1094
self.assertEquals(l[-3:], ["A", 1.0, "B"])
1098
self.assertEquals(len(l), size)
1099
self.assertEquals(l[:3], [1.0, "C", 1.0])
1100
self.assertEquals(l[size - 3:], ["A", 1.0, "B"])
1102
@bigmemtest(minsize=_2G // 5 + 4, memuse=8 * 5)
1103
def test_pop(self, size):
1104
l = ["a", "b", "c", "d", "e"] * size
1106
self.assertEquals(len(l), size)
1110
self.assertEquals(len(l), size)
1111
self.assertEquals(item, "e")
1112
self.assertEquals(l[-2:], ["c", "d"])
1116
self.assertEquals(len(l), size)
1117
self.assertEquals(item, "a")
1118
self.assertEquals(l[:2], ["b", "c"])
1120
item = l.pop(size - 2)
1122
self.assertEquals(len(l), size)
1123
self.assertEquals(item, "c")
1124
self.assertEquals(l[-2:], ["b", "d"])
1126
@bigmemtest(minsize=_2G + 10, memuse=8)
1127
def test_remove(self, size):
1129
self.assertEquals(len(l), size)
1133
self.assertEquals(len(l), size)
1135
# Because of the earlier l.remove(), this append doesn't trigger
1139
self.assertEquals(len(l), size)
1140
self.assertEquals(l[-2:], [10, 5])
1143
self.assertEquals(len(l), size)
1144
self.assertEquals(l[-2:], [10, 10])
1146
@bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1147
def test_reverse(self, size):
1148
l = [1, 2, 3, 4, 5] * size
1150
self.assertEquals(len(l), size * 5)
1151
self.assertEquals(l[-5:], [5, 4, 3, 2, 1])
1152
self.assertEquals(l[:5], [5, 4, 3, 2, 1])
1154
@bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1155
def test_sort(self, size):
1156
l = [1, 2, 3, 4, 5] * size
1158
self.assertEquals(len(l), size * 5)
1159
self.assertEquals(l.count(1), size)
1160
self.assertEquals(l[:10], [1] * 10)
1161
self.assertEquals(l[-10:], [5] * 10)
1164
support.run_unittest(StrTest, BytesTest, BytearrayTest,
1165
TupleTest, ListTest)
1167
if __name__ == '__main__':
1168
if len(sys.argv) > 1:
1169
support.set_memlimit(sys.argv[1])