From e4daa0bf16c5fd439ed4b7396f734f85a4368645 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 10 Jan 2019 21:55:07 +0100 Subject: [PATCH] tests: test various things that could suffer from libc++ eof() bug --- tests/express/test_hashval.py | 9 ++ tests/express/test_multifile.py | 12 +++ tests/prc/test_stream_reader.py | 157 ++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 tests/express/test_hashval.py create mode 100644 tests/express/test_multifile.py create mode 100644 tests/prc/test_stream_reader.py diff --git a/tests/express/test_hashval.py b/tests/express/test_hashval.py new file mode 100644 index 0000000000..b2334e24d9 --- /dev/null +++ b/tests/express/test_hashval.py @@ -0,0 +1,9 @@ +from panda3d import core +import random + + +def test_hashval_hex(): + hex = '%032x' % random.getrandbits(32 * 4) + val = core.HashVal() + val.input_hex(core.StringStream(hex.encode('ascii'))) + assert str(val) == hex.lower() diff --git a/tests/express/test_multifile.py b/tests/express/test_multifile.py new file mode 100644 index 0000000000..8618688eb2 --- /dev/null +++ b/tests/express/test_multifile.py @@ -0,0 +1,12 @@ +from panda3d.core import Multifile, StringStream, IStreamWrapper + + +def test_multifile_read_empty(): + stream = StringStream(b'pmf\x00\n\r\x01\x00\x01\x00\x01\x00\x00\x00\xdb\x9d7\\\x00\x00\x00\x00') + wrapper = IStreamWrapper(stream) + + m = Multifile() + assert m.open_read(wrapper) + assert m.is_read_valid() + assert m.get_num_subfiles() == 0 + m.close() diff --git a/tests/prc/test_stream_reader.py b/tests/prc/test_stream_reader.py new file mode 100644 index 0000000000..de40e40b80 --- /dev/null +++ b/tests/prc/test_stream_reader.py @@ -0,0 +1,157 @@ +from panda3d.core import StreamReader, StringStream +import pytest + + +def test_streamreader_string(): + # Empty string + stream = StringStream(b'\x00\x00') + reader = StreamReader(stream, False) + assert reader.get_string() == '' + + # String size but no string contents + stream = StringStream(b'\x01\x00') + reader = StreamReader(stream, False) + assert reader.get_string() == '' + + # String of length 1 + stream = StringStream(b'\x01\x00A') + reader = StreamReader(stream, False) + assert reader.get_string() == 'A' + + # String with excess data + stream = StringStream(b'\x01\x00AB') + reader = StreamReader(stream, False) + assert reader.get_string() == 'A' + + # EOF before end of string + stream = StringStream(b'\x03\x00AB') + reader = StreamReader(stream, False) + assert reader.get_string() == 'AB' + + # Preserves null bytes + stream = StringStream(b'\x02\x00\x00\x00') + reader = StreamReader(stream, False) + assert reader.get_string() == '\x00\x00' + + +def test_streamreader_string32(): + # Empty string + stream = StringStream(b'\x00\x00\x00\x00') + reader = StreamReader(stream, False) + assert reader.get_string32() == '' + + # String size but no string contents + stream = StringStream(b'\x01\x00\x00\x00') + reader = StreamReader(stream, False) + assert reader.get_string32() == '' + + # String of length 1 + stream = StringStream(b'\x01\x00\x00\x00A') + reader = StreamReader(stream, False) + assert reader.get_string32() == 'A' + + # String with excess data + stream = StringStream(b'\x01\x00\x00\x00AB') + reader = StreamReader(stream, False) + assert reader.get_string32() == 'A' + + # EOF before end of string + stream = StringStream(b'\x04\x00\x00\x00AB') + reader = StreamReader(stream, False) + assert reader.get_string32() == 'AB' + + # Preserves null bytes + stream = StringStream(b'\x02\x00\x00\x00\x00\x00') + reader = StreamReader(stream, False) + assert reader.get_string32() == '\x00\x00' + + +def test_streamreader_z_string(): + # Empty stream + stream = StringStream(b'') + reader = StreamReader(stream, False) + assert reader.get_z_string() == '' + + # Empty string + stream = StringStream(b'\x00') + reader = StreamReader(stream, False) + assert reader.get_z_string() == '' + + # String of length 1 + stream = StringStream(b'A\x00') + reader = StreamReader(stream, False) + assert reader.get_z_string() == 'A' + + # String with excess data + stream = StringStream(b'ABC\x00AB') + reader = StreamReader(stream, False) + assert reader.get_z_string() == 'ABC' + + # EOF before end of string + stream = StringStream(b'ABC') + reader = StreamReader(stream, False) + assert reader.get_z_string() == 'ABC' + + +def test_streamreader_fixed_string(): + # Zero-length string + stream = StringStream(b'ABC') + reader = StreamReader(stream, False) + assert reader.get_fixed_string(0) == '' + + # Empty stream + stream = StringStream(b'') + reader = StreamReader(stream, False) + assert reader.get_fixed_string(1) == '' + + # Empty string + stream = StringStream(b'\x00') + reader = StreamReader(stream, False) + assert reader.get_fixed_string(1) == '' + + # String of length 1 + stream = StringStream(b'A') + reader = StreamReader(stream, False) + assert reader.get_fixed_string(1) == 'A' + + # String of length 1, excess data + stream = StringStream(b'ABC\x00') + reader = StreamReader(stream, False) + assert reader.get_fixed_string(1) == 'A' + + # EOF before end of string + stream = StringStream(b'AB') + reader = StreamReader(stream, False) + assert reader.get_fixed_string(4) == 'AB' + + +def test_streamreader_readline(): + # Empty stream + stream = StringStream(b'') + reader = StreamReader(stream, False) + assert reader.readline() == b'' + assert reader.readline() == b'' + + # Single line without newline + stream = StringStream(b'A') + reader = StreamReader(stream, False) + assert reader.readline() == b'A' + assert reader.readline() == b'' + + # Single newline + stream = StringStream(b'\n') + reader = StreamReader(stream, False) + assert reader.readline() == b'\n' + assert reader.readline() == b'' + + # Line with text followed by empty line + stream = StringStream(b'A\n\n') + reader = StreamReader(stream, False) + assert reader.readline() == b'A\n' + assert reader.readline() == b'\n' + assert reader.readline() == b'' + + # Preserve null byte + stream = StringStream(b'\x00\x00') + reader = StreamReader(stream, False) + assert reader.readline() == b'\x00\x00'