aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/streams/zstd/zstd_ut.cpp
blob: 01618193faefb73ce657a648b37a179f052360fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "zstd.h" 
 
#include <library/cpp/testing/unittest/registar.h>
 
#include <util/random/fast.h> 
#include <util/stream/null.h> 
#include <util/stream/str.h> 
 
Y_UNIT_TEST_SUITE(TZstdTestSuite) { 
    TString Compress(TString data, int quality = -1) { 
        TString compressed; 
        TStringOutput output(compressed); 
        TZstdCompress compressStream(&output, quality); 
        compressStream.Write(data.data(), data.size()); 
        compressStream.Finish(); 
        output.Finish(); 
        return compressed; 
    } 
 
    TString Decompress(TString data) { 
        TStringInput input(data); 
        TZstdDecompress decompressStream(&input); 
        return decompressStream.ReadAll(); 
    } 
 
    void TestCase(const TString& s) { 
        UNIT_ASSERT_VALUES_EQUAL(s, Decompress(Compress(s, -1))); 
        UNIT_ASSERT_VALUES_EQUAL(s, Decompress(Compress(s, 0))); 
        UNIT_ASSERT_VALUES_EQUAL(s, Decompress(Compress(s, 22))); 
        UNIT_ASSERT_VALUES_EQUAL(s, Decompress(Compress(s, 11))); 
        UNIT_ASSERT_VALUES_EQUAL(s, Decompress(Compress(s, 100500))); 
    } 
 
    TString GenerateRandomString(size_t size) { 
        TReallyFastRng32 rng(42); 
        TString result; 
        result.reserve(size + sizeof(ui64)); 
        while (result.size() < size) { 
            ui64 value = rng.GenRand64(); 
            result += TStringBuf(reinterpret_cast<const char*>(&value), sizeof(value)); 
        } 
        result.resize(size); 
        return result; 
    } 
 
    Y_UNIT_TEST(TestHelloWorld) { 
        TestCase("hello world"); 
    } 
 
    Y_UNIT_TEST(TestSeveralStreamsWithSameQuality) { 
        auto s1 = GenerateRandomString(1 << 15); 
        auto s2 = GenerateRandomString(1 << 15); 
        auto c1 = Compress(s1); 
        auto c2 = Compress(s2); 
        UNIT_ASSERT_VALUES_EQUAL(s1 + s2, Decompress(c1 + c2)); 
    } 
 
    Y_UNIT_TEST(TestSeveralStreamsWithDifferentQuality) { 
        auto s1 = GenerateRandomString(1 << 15); 
        auto s2 = GenerateRandomString(1 << 15); 
        auto c1 = Compress(s1, 1); 
        auto c2 = Compress(s2, 2); 
        UNIT_ASSERT_VALUES_EQUAL(s1 + s2, Decompress(c1 + c2)); 
    } 
 
    Y_UNIT_TEST(TestIncompleteStream) { 
        TString manyAs(64 * 1024, 'a'); 
        auto compressed = Compress(manyAs); 
        TString truncated(compressed.data(), compressed.size() - 1); 
        UNIT_CHECK_GENERATED_EXCEPTION(Decompress(truncated), std::exception); 
    } 
 
    Y_UNIT_TEST(Test64KB) { 
        auto manyAs = TString(64 * 1024, 'a'); 
        TString str("Hello from the Matrix!@#% How are you?}{\n\t\a"); 
        TestCase(manyAs + str + manyAs); 
    } 
 
    Y_UNIT_TEST(Test1MB) { 
        TestCase(GenerateRandomString(1 * 1024 * 1024)); 
    } 
 
    Y_UNIT_TEST(TestEmpty) { 
        TestCase(""); 
    } 
 
    Y_UNIT_TEST(TestWriteAfterFinish) { 
        TNullOutput output; 
        TZstdCompress compressStream(&output); 
        compressStream.Finish(); 
        UNIT_ASSERT_EXCEPTION_CONTAINS(compressStream.Write("a", 1), std::exception, "Cannot use stream after finish."); 
        UNIT_ASSERT_EXCEPTION_CONTAINS(compressStream.Flush(), std::exception, "Cannot use stream after finish."); 
    } 
}