test_datagram.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import pytest
  2. from panda3d import core
  3. # Fixtures for generating interesting datagrams (and verification functions) on
  4. # the fly...
  5. @pytest.fixture(scope='module',
  6. params=[False, True],
  7. ids=['stdfloat_float', 'stdfloat_double'])
  8. def datagram_small(request):
  9. """Returns a small datagram, along with a verification function."""
  10. dg = core.Datagram()
  11. dg.set_stdfloat_double(request.param)
  12. dg.add_uint8(3)
  13. dg.add_uint16(14159)
  14. dg.add_uint32(0xDEADBEEF)
  15. dg.add_uint64(0x0123456789ABCDEF)
  16. dg.add_int8(-77)
  17. dg.add_int16(-1)
  18. dg.add_int32(-972965890)
  19. dg.add_int64(-1001001001001001)
  20. dg.add_string('this is a string')
  21. dg.add_string32('this is another string')
  22. dg.add_string('this is yet a third string')
  23. dg.add_stdfloat(800.2)
  24. dg.add_stdfloat(3.1415926)
  25. dg.add_stdfloat(2.7182818)
  26. def readback_function(dgi):
  27. assert dgi.get_remaining_size() > 0
  28. assert dgi.get_uint8() == 3
  29. assert dgi.get_uint16() == 14159
  30. assert dgi.get_uint32() == 0xDEADBEEF
  31. assert dgi.get_uint64() == 0x0123456789ABCDEF
  32. assert dgi.get_int8() == -77
  33. assert dgi.get_int16() == -1
  34. assert dgi.get_int32() == -972965890
  35. assert dgi.get_int64() == -1001001001001001
  36. assert dgi.get_string() == 'this is a string'
  37. assert dgi.get_string32() == 'this is another string'
  38. assert dgi.get_string() == 'this is yet a third string'
  39. assert dgi.get_stdfloat() == pytest.approx(800.2)
  40. assert dgi.get_stdfloat() == pytest.approx(3.1415926)
  41. assert dgi.get_stdfloat() == pytest.approx(2.7182818)
  42. assert dgi.get_remaining_size() == 0
  43. return dg, readback_function
  44. @pytest.fixture(scope='module')
  45. def datagram_large():
  46. """Returns a big datagram, along with a verification function."""
  47. dg = core.Datagram()
  48. for x in range(2000000):
  49. dg.add_uint32(x)
  50. dg.add_string('the magic words are squeamish ossifrage')
  51. def readback_function(dgi):
  52. assert dgi.get_remaining_size() > 0
  53. for x in range(2000000):
  54. assert dgi.get_uint32() == x
  55. assert dgi.get_string() == 'the magic words are squeamish ossifrage'
  56. assert dgi.get_remaining_size() == 0
  57. return dg, readback_function
  58. def test_datagram_bytes():
  59. """Tests that we can put and get a bytes object on Datagram."""
  60. dg = core.Datagram(b'abc\x00')
  61. dg.append_data(b'\xff123')
  62. assert bytes(dg) == b'abc\x00\xff123'
  63. dgi = core.DatagramIterator(dg)
  64. dgi.get_remaining_bytes() == b'abc\x00\xff123'
  65. def test_iterator(datagram_small):
  66. """This tests Datagram/DatagramIterator, and sort of serves as a self-check
  67. of the test fixtures too."""
  68. dg, verify = datagram_small
  69. dgi = core.DatagramIterator(dg)
  70. verify(dgi)
  71. # These test DatagramInputFile/DatagramOutputFile:
  72. def do_file_test(dg, verify, filename):
  73. dof = core.DatagramOutputFile()
  74. dof.open(filename)
  75. dof.put_datagram(dg)
  76. dof.close()
  77. dg2 = core.Datagram()
  78. dif = core.DatagramInputFile()
  79. dif.open(filename)
  80. assert dif.get_datagram(dg2)
  81. dif.close()
  82. # This is normally saved by the DatagramOutputFile header. We cheat here.
  83. dg2.set_stdfloat_double(dg.get_stdfloat_double())
  84. dgi = core.DatagramIterator(dg2)
  85. verify(dgi)
  86. def test_file_small(datagram_small, tmpdir):
  87. """This tests DatagramOutputFile/DatagramInputFile on small datagrams."""
  88. dg, verify = datagram_small
  89. p = tmpdir.join('datagram.bin')
  90. filename = core.Filename.from_os_specific(str(p))
  91. do_file_test(dg, verify, filename)
  92. def test_file_large(datagram_large, tmpdir):
  93. """This tests DatagramOutputFile/DatagramInputFile on very large datagrams."""
  94. dg, verify = datagram_large
  95. p = tmpdir.join('datagram.bin')
  96. filename = core.Filename.from_os_specific(str(p))
  97. do_file_test(dg, verify, filename)
  98. def test_file_corrupt(datagram_small, tmpdir):
  99. """This tests DatagramInputFile's handling of a corrupt size header."""
  100. dg, verify = datagram_small
  101. p = tmpdir.join('datagram.bin')
  102. filename = core.Filename.from_os_specific(str(p))
  103. dof = core.DatagramOutputFile()
  104. dof.open(filename)
  105. dof.put_datagram(dg)
  106. dof.close()
  107. # Corrupt the size header to 4GB
  108. with p.open(mode='wb') as f:
  109. f.seek(0)
  110. f.write(b'\xFF\xFF\xFF\xFF')
  111. dg2 = core.Datagram()
  112. dif = core.DatagramInputFile()
  113. dif.open(filename)
  114. assert not dif.get_datagram(dg2)
  115. dif.close()
  116. # Should we test that dg2 is unmodified?