diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-01-07 21:19:34 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-01-07 21:19:34 (GMT) |
commit | 86821b2563915e4f11cde045da8ebe01beffa634 (patch) | |
tree | 76f272201bcdd36b1deef76af1f633fb9d2a0166 /Lib/test/test_bufio.py | |
parent | 4ddf0a01f7becb98b223225edeb48fd69e78934b (diff) | |
download | cpython-86821b2563915e4f11cde045da8ebe01beffa634.zip cpython-86821b2563915e4f11cde045da8ebe01beffa634.tar.gz cpython-86821b2563915e4f11cde045da8ebe01beffa634.tar.bz2 |
MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
variant that never needs to "search from the right".
Also fixed unlikely memory leak in get_line, if string size overflows INTMAX.
Also new std test test_bufio to make sure .readline() works.
Diffstat (limited to 'Lib/test/test_bufio.py')
-rw-r--r-- | Lib/test/test_bufio.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Lib/test/test_bufio.py b/Lib/test/test_bufio.py new file mode 100644 index 0000000..1a820d4 --- /dev/null +++ b/Lib/test/test_bufio.py @@ -0,0 +1,60 @@ +from test_support import TestFailed, TESTFN + +# Simple test to ensure that optimizations in fileobject.c deliver +# the expected results. For best testing, run this under a debug-build +# Python too (to exercise asserts in the C code). + +# Repeat string 'pattern' as often as needed to reach total length +# 'length'. Then call try_one with that string, a string one larger +# than that, and a string one smaller than that. The main driver +# feeds this all small sizes and various powers of 2, so we exercise +# all likely stdio buffer sizes, and "off by one" errors on both +# sides. +def drive_one(pattern, length): + q, r = divmod(length, len(pattern)) + teststring = pattern * q + pattern[:r] + assert len(teststring) == length + try_one(teststring) + try_one(teststring + "x") + try_one(teststring[:-1]) + +# Write s + "\n" + s to file, then open it and ensure that successive +# .readline()s deliver what we wrote. +def try_one(s): + # Since C doesn't guarantee we can write/read arbitrary bytes in text + # files, use binary mode. + f = open(TESTFN, "wb") + # write once with \n and once without + f.write(s) + f.write("\n") + f.write(s) + f.close() + f = open(TESTFN, "rb") + line = f.readline() + if line != s + "\n": + raise TestFailed("Expected %r got %r" % (s + "\n", line)) + line = f.readline() + if line != s: + raise TestFailed("Expected %r got %r" % (s, line)) + line = f.readline() + if line: + raise TestFailed("Expected EOF but got %r" % line) + f.close() + +# A pattern with prime length, to avoid simple relationships with +# stdio buffer sizes. +primepat = "1234567890\00\01\02\03\04\05\06\07" + +nullpat = "\0" * 1000 + +try: + for size in range(1, 257) + [512, 1000, 1024, 2048, 4096, 8192, 10000, + 16384, 32768, 65536, 1000000]: + drive_one(primepat, size) + drive_one(nullpat, size) +finally: + try: + import os + os.unlink(TESTFN) + except: + pass |