MultiplayerCompressionTest.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <lz4.h>
  9. #include <AzCore/UnitTest/TestTypes.h>
  10. #include <LZ4Compressor.h>
  11. #include <AzCore/Compression/Compression.h>
  12. #include <AzCore/std/chrono/chrono.h>
  13. #include <AzNetworking/DataStructures/ByteBuffer.h>
  14. #include <AzNetworking/Serialization/NetworkInputSerializer.h>
  15. #include <AzTest/AzTest.h>
  16. class MultiplayerCompressionTest
  17. : public UnitTest::LeakDetectionFixture
  18. {
  19. };
  20. TEST_F(MultiplayerCompressionTest, MultiplayerCompression_CompressTest)
  21. {
  22. AzNetworking::UdpPacketEncodingBuffer buffer;
  23. buffer.Resize(buffer.GetCapacity());
  24. // Setup and marshal a highly compressable buffer for LZ4
  25. AZStd::chrono::steady_clock::time_point startTime = AZStd::chrono::steady_clock::now();
  26. memset(buffer.GetBuffer(), 255, buffer.GetCapacity());
  27. size_t maxCompressedSize = buffer.GetSize() + 32U;
  28. size_t compressedSize = std::numeric_limits<size_t>::max();
  29. size_t uncompressedSize = std::numeric_limits<size_t>::max();
  30. size_t consumedSize = std::numeric_limits<size_t>::max();
  31. char* pCompressedBuffer = new char[maxCompressedSize];
  32. char* pDecompressedBuffer = new char[buffer.GetSize()];
  33. //Run and test compress
  34. MultiplayerCompression::LZ4Compressor lz4Compressor;
  35. startTime = AZStd::chrono::steady_clock::now();
  36. AzNetworking::CompressorError compressStatus = lz4Compressor.Compress(buffer.GetBuffer(), buffer.GetSize(), pCompressedBuffer, maxCompressedSize, compressedSize);
  37. [[maybe_unused]] const AZ::u64 compressTime = (AZStd::chrono::steady_clock::now() - startTime).count();
  38. ASSERT_TRUE(compressStatus == AzNetworking::CompressorError::Ok);
  39. EXPECT_TRUE(compressedSize < maxCompressedSize);
  40. //Run and test decompress
  41. startTime = AZStd::chrono::steady_clock::now();
  42. AzNetworking::CompressorError decompressStatus = lz4Compressor.Decompress(pCompressedBuffer, compressedSize, pDecompressedBuffer, buffer.GetSize(), consumedSize, uncompressedSize);
  43. [[maybe_unused]] const AZ::u64 decompressTime = (AZStd::chrono::steady_clock::now() - startTime).count();
  44. ASSERT_TRUE(decompressStatus == AzNetworking::CompressorError::Ok);
  45. EXPECT_TRUE(uncompressedSize = buffer.GetSize());
  46. EXPECT_TRUE(memcmp(pDecompressedBuffer, buffer.GetBuffer(), uncompressedSize) == 0);
  47. delete [] pCompressedBuffer;
  48. delete [] pDecompressedBuffer;
  49. //Expected [Profile]: Uncompressed Size: 2048 B Compressed Size: 21 B
  50. AZ_TracePrintf("Multiplayer Compression Test", "Uncompressed Size:(%llu B) Compressed Size:(%llu B) \n", uncompressedSize, compressedSize);
  51. //Expected [Profile]: Marshal Time : 84 mcs Unmarshal Time : 98 mcs Compress Time : 182 mcs Decompress Time : 7 mcs (times will vary with hardware)
  52. AZ_TracePrintf("Multiplayer Compression Test", "Compress Time:(%llu mcs) Decompress Time:(%llu mcs) \n", compressTime, decompressTime);
  53. }
  54. TEST_F(MultiplayerCompressionTest, MultiplayerCompression_OversizeTest)
  55. {
  56. size_t badInputSize = LZ4_MAX_INPUT_SIZE + 1;
  57. size_t bufferSize = 4;
  58. char* badInput = new char[badInputSize];
  59. char* pBuffer = new char[bufferSize];
  60. size_t compressedSize = 0;
  61. MultiplayerCompression::LZ4Compressor lz4Compressor;
  62. AzNetworking::CompressorError compressStatus = lz4Compressor.Compress(badInput, badInputSize, pBuffer, bufferSize, compressedSize);
  63. EXPECT_TRUE(compressStatus == AzNetworking::CompressorError::InsufficientBuffer);
  64. delete [] badInput;
  65. delete [] pBuffer;
  66. }
  67. TEST_F(MultiplayerCompressionTest, MultiplayerCompressionTest_UndersizeTest)
  68. {
  69. size_t badInputSize = LZ4_MAX_INPUT_SIZE + 1;
  70. size_t bufferSize = 4;
  71. char* badInput = new char[badInputSize];
  72. char* pBuffer = new char[bufferSize];
  73. size_t consumedSize = 0;
  74. size_t uncompressedSize = 0;
  75. MultiplayerCompression::LZ4Compressor lz4Compressor;
  76. AzNetworking::CompressorError decompressStatus = lz4Compressor.Decompress(badInput, badInputSize, pBuffer, bufferSize, consumedSize, uncompressedSize);
  77. EXPECT_TRUE(decompressStatus == AzNetworking::CompressorError::CorruptData);
  78. delete [] badInput;
  79. delete [] pBuffer;
  80. }
  81. TEST_F(MultiplayerCompressionTest, MultiplayerCompressionTest_NullTest)
  82. {
  83. size_t compressedSize = 0;
  84. size_t consumedSize = 0;
  85. size_t uncompressedSize = 0;
  86. MultiplayerCompression::LZ4Compressor lz4Compressor;
  87. AzNetworking::CompressorError compressStatus = lz4Compressor.Compress(nullptr, 4, nullptr, 4, compressedSize);
  88. EXPECT_TRUE(compressStatus == AzNetworking::CompressorError::Uninitialized);
  89. AzNetworking::CompressorError decompressStatus = lz4Compressor.Decompress(nullptr, 4, nullptr, 4, consumedSize, uncompressedSize);
  90. EXPECT_TRUE(decompressStatus == AzNetworking::CompressorError::Uninitialized);
  91. }
  92. AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);