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