Browse Source

tests: test various things that could suffer from libc++ eof() bug

rdb 7 years ago
parent
commit
e4daa0bf16
3 changed files with 178 additions and 0 deletions
  1. 9 0
      tests/express/test_hashval.py
  2. 12 0
      tests/express/test_multifile.py
  3. 157 0
      tests/prc/test_stream_reader.py

+ 9 - 0
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()

+ 12 - 0
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()

+ 157 - 0
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'