12fb337e7SAlexey Samsonov //===- llvm/unittest/Support/CompressionTest.cpp - Compression tests ------===//
22fb337e7SAlexey Samsonov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62fb337e7SAlexey Samsonov //
72fb337e7SAlexey Samsonov //===----------------------------------------------------------------------===//
82fb337e7SAlexey Samsonov //
92fb337e7SAlexey Samsonov // This file implements unit tests for the Compression functions.
102fb337e7SAlexey Samsonov //
112fb337e7SAlexey Samsonov //===----------------------------------------------------------------------===//
122fb337e7SAlexey Samsonov 
132fb337e7SAlexey Samsonov #include "llvm/Support/Compression.h"
14857497b9SDavid Blaikie #include "llvm/ADT/SmallString.h"
15d9903888SChandler Carruth #include "llvm/ADT/StringRef.h"
162fb337e7SAlexey Samsonov #include "llvm/Config/config.h"
179a67b073SChandler Carruth #include "llvm/Support/Error.h"
182fb337e7SAlexey Samsonov #include "gtest/gtest.h"
192fb337e7SAlexey Samsonov 
202fb337e7SAlexey Samsonov using namespace llvm;
21ea61750cSCole Kissane using namespace llvm::compression;
222fb337e7SAlexey Samsonov 
232fb337e7SAlexey Samsonov namespace {
242fb337e7SAlexey Samsonov 
2531e5f712SPetr Hosek #if LLVM_ENABLE_ZLIB
testZlibCompression(StringRef Input,int Level)266b618a62SCole Kissane static void testZlibCompression(StringRef Input, int Level) {
27e690137dSFangrui Song   SmallVector<uint8_t, 0> Compressed;
28e690137dSFangrui Song   SmallVector<uint8_t, 0> Uncompressed;
29e690137dSFangrui Song   zlib::compress(arrayRefFromStringRef(Input), Compressed, Level);
30167ca4aeSGeorge Rimar 
312fb337e7SAlexey Samsonov   // Check that uncompressed buffer is the same as original.
32407c721cSFangrui Song   Error E = zlib::uncompress(Compressed, Uncompressed, Input.size());
33167ca4aeSGeorge Rimar   consumeError(std::move(E));
34167ca4aeSGeorge Rimar 
35e690137dSFangrui Song   EXPECT_EQ(Input, toStringRef(Uncompressed));
362fb337e7SAlexey Samsonov   if (Input.size() > 0) {
372fb337e7SAlexey Samsonov     // Uncompression fails if expected length is too short.
38167ca4aeSGeorge Rimar     E = zlib::uncompress(Compressed, Uncompressed, Input.size() - 1);
39167ca4aeSGeorge Rimar     EXPECT_EQ("zlib error: Z_BUF_ERROR", llvm::toString(std::move(E)));
402fb337e7SAlexey Samsonov   }
412fb337e7SAlexey Samsonov }
422fb337e7SAlexey Samsonov 
TEST(CompressionTest,Zlib)432fb337e7SAlexey Samsonov TEST(CompressionTest, Zlib) {
446b618a62SCole Kissane   testZlibCompression("", zlib::DefaultCompression);
452fb337e7SAlexey Samsonov 
466b618a62SCole Kissane   testZlibCompression("hello, world!", zlib::NoCompression);
476b618a62SCole Kissane   testZlibCompression("hello, world!", zlib::BestSizeCompression);
486b618a62SCole Kissane   testZlibCompression("hello, world!", zlib::BestSpeedCompression);
496b618a62SCole Kissane   testZlibCompression("hello, world!", zlib::DefaultCompression);
502fb337e7SAlexey Samsonov 
512fb337e7SAlexey Samsonov   const size_t kSize = 1024;
522fb337e7SAlexey Samsonov   char BinaryData[kSize];
536b618a62SCole Kissane   for (size_t i = 0; i < kSize; ++i)
542fb337e7SAlexey Samsonov     BinaryData[i] = i & 255;
552fb337e7SAlexey Samsonov   StringRef BinaryDataStr(BinaryData, kSize);
562fb337e7SAlexey Samsonov 
576b618a62SCole Kissane   testZlibCompression(BinaryDataStr, zlib::NoCompression);
586b618a62SCole Kissane   testZlibCompression(BinaryDataStr, zlib::BestSizeCompression);
596b618a62SCole Kissane   testZlibCompression(BinaryDataStr, zlib::BestSpeedCompression);
606b618a62SCole Kissane   testZlibCompression(BinaryDataStr, zlib::DefaultCompression);
612fb337e7SAlexey Samsonov }
622fb337e7SAlexey Samsonov #endif
632fb337e7SAlexey Samsonov 
64*e939bf67SCole Kissane #if LLVM_ENABLE_ZSTD
testZstdCompression(StringRef Input,int Level)65*e939bf67SCole Kissane static void testZstdCompression(StringRef Input, int Level) {
66*e939bf67SCole Kissane   SmallVector<uint8_t, 0> Compressed;
67*e939bf67SCole Kissane   SmallVector<uint8_t, 0> Uncompressed;
68*e939bf67SCole Kissane   zstd::compress(arrayRefFromStringRef(Input), Compressed, Level);
69*e939bf67SCole Kissane 
70*e939bf67SCole Kissane   // Check that uncompressed buffer is the same as original.
71*e939bf67SCole Kissane   Error E = zstd::uncompress(Compressed, Uncompressed, Input.size());
72*e939bf67SCole Kissane   consumeError(std::move(E));
73*e939bf67SCole Kissane 
74*e939bf67SCole Kissane   EXPECT_EQ(Input, toStringRef(Uncompressed));
75*e939bf67SCole Kissane   if (Input.size() > 0) {
76*e939bf67SCole Kissane     // Uncompression fails if expected length is too short.
77*e939bf67SCole Kissane     E = zstd::uncompress(Compressed, Uncompressed, Input.size() - 1);
78*e939bf67SCole Kissane     EXPECT_EQ("Destination buffer is too small", llvm::toString(std::move(E)));
79*e939bf67SCole Kissane   }
80*e939bf67SCole Kissane }
81*e939bf67SCole Kissane 
TEST(CompressionTest,Zstd)82*e939bf67SCole Kissane TEST(CompressionTest, Zstd) {
83*e939bf67SCole Kissane   testZstdCompression("", zstd::DefaultCompression);
84*e939bf67SCole Kissane 
85*e939bf67SCole Kissane   testZstdCompression("hello, world!", zstd::NoCompression);
86*e939bf67SCole Kissane   testZstdCompression("hello, world!", zstd::BestSizeCompression);
87*e939bf67SCole Kissane   testZstdCompression("hello, world!", zstd::BestSpeedCompression);
88*e939bf67SCole Kissane   testZstdCompression("hello, world!", zstd::DefaultCompression);
89*e939bf67SCole Kissane 
90*e939bf67SCole Kissane   const size_t kSize = 1024;
91*e939bf67SCole Kissane   char BinaryData[kSize];
92*e939bf67SCole Kissane   for (size_t i = 0; i < kSize; ++i)
93*e939bf67SCole Kissane     BinaryData[i] = i & 255;
94*e939bf67SCole Kissane   StringRef BinaryDataStr(BinaryData, kSize);
95*e939bf67SCole Kissane 
96*e939bf67SCole Kissane   testZstdCompression(BinaryDataStr, zstd::NoCompression);
97*e939bf67SCole Kissane   testZstdCompression(BinaryDataStr, zstd::BestSizeCompression);
98*e939bf67SCole Kissane   testZstdCompression(BinaryDataStr, zstd::BestSpeedCompression);
99*e939bf67SCole Kissane   testZstdCompression(BinaryDataStr, zstd::DefaultCompression);
100*e939bf67SCole Kissane }
101*e939bf67SCole Kissane #endif
1022fb337e7SAlexey Samsonov }
103