CompressionLZ4Test.cpp 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 <AzCore/UnitTest/TestTypes.h>
  9. #include <Compression/CompressionLZ4API.h>
  10. #include <Clients/DecompressorLZ4Impl.h>
  11. namespace CompressionLZ4Test
  12. {
  13. class DecompressionLZ4Fixture
  14. : public UnitTest::LeakDetectionFixture
  15. {
  16. public:
  17. DecompressionLZ4Fixture() = default;
  18. ~DecompressionLZ4Fixture() = default;
  19. protected:
  20. };
  21. TEST_F(DecompressionLZ4Fixture, LZ4Decompressor_DecompressBlock_Succeeds)
  22. {
  23. auto compressionAlgorithmId = CompressionLZ4::GetLZ4CompressionAlgorithmId();
  24. auto decompressorLz4 = AZStd::make_unique<CompressionLZ4::DecompressorLZ4>();
  25. EXPECT_EQ(compressionAlgorithmId, decompressorLz4->GetCompressionAlgorithmId());
  26. // The compressed data for Hello World has a 0xb0 before it
  27. constexpr AZStd::string_view dataToUncompress = "\xb0" R"(Hello World)";
  28. AZStd::vector<AZStd::byte> decompressionBuffer;
  29. // Use a buffer size of at least 10x to fit the decompressed data
  30. constexpr size_t DecompressBufferSize = dataToUncompress.size() * 10;
  31. // Resize the decompression output buffer to store the decompressed content
  32. decompressionBuffer.resize_no_construct(DecompressBufferSize);
  33. AZStd::span compressedData(reinterpret_cast<const AZStd::byte*>(dataToUncompress.data()), dataToUncompress.size());
  34. Compression::DecompressionResultData decompressionResultData = decompressorLz4->DecompressBlock(
  35. decompressionBuffer, compressedData);
  36. EXPECT_TRUE(static_cast<bool>(decompressionResultData));
  37. EXPECT_TRUE(static_cast<bool>(decompressionResultData.m_decompressionOutcome));
  38. EXPECT_GT(decompressionResultData.GetUncompressedByteCount(), 0);
  39. EXPECT_NE(nullptr, decompressionResultData.GetUncompressedByteData());
  40. // Resize the decompression buffer to the exact size
  41. decompressionBuffer.resize_no_construct(decompressionResultData.GetUncompressedByteCount());
  42. AZStd::string_view uncompressedString(reinterpret_cast<char*>(decompressionResultData.GetUncompressedByteData()),
  43. decompressionResultData.GetUncompressedByteCount());
  44. EXPECT_EQ("Hello World", uncompressedString);
  45. }
  46. TEST_F(DecompressionLZ4Fixture, LZ4Compressor_CompressBlock_WithBufferTooSmall_Fails)
  47. {
  48. auto compressionAlgorithmId = CompressionLZ4::GetLZ4CompressionAlgorithmId();
  49. auto decompressorLz4 = AZStd::make_unique<CompressionLZ4::DecompressorLZ4>();
  50. EXPECT_EQ(compressionAlgorithmId, decompressorLz4->GetCompressionAlgorithmId());
  51. constexpr AZStd::string_view dataToUncompress = "\xb0" R"(Hello World)";
  52. AZStd::span compressedData(reinterpret_cast<const AZStd::byte*>(dataToUncompress.data()), dataToUncompress.size());
  53. // The decompression output buffer has a size of zero, so decompression should fail
  54. AZStd::vector<AZStd::byte> decompressionBuffer;
  55. Compression::DecompressionResultData decompressionResultData = decompressorLz4->DecompressBlock(
  56. decompressionBuffer, compressedData);
  57. EXPECT_FALSE(static_cast<bool>(decompressionResultData));
  58. EXPECT_FALSE(static_cast<bool>(decompressionResultData.m_decompressionOutcome));
  59. EXPECT_EQ(0, decompressionResultData.GetUncompressedByteCount());
  60. EXPECT_EQ(nullptr, decompressionResultData.GetUncompressedByteData());
  61. }
  62. }