1 /*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "ZstdUtil.h"
18
19 #include <gtest/gtest.h>
20 #include <vector>
21
22 using namespace simpleperf;
23
24 // @CddTest = 6.1/C-0-2
TEST(ZstdUtil,smoke)25 TEST(ZstdUtil, smoke) {
26 std::unique_ptr<Compressor> compressor = CreateZstdCompressor();
27 ASSERT_TRUE(compressor);
28 std::unique_ptr<Decompressor> decompressor = CreateZstdDecompressor();
29 ASSERT_TRUE(decompressor);
30
31 // Compress and decompress input_a.
32 std::vector<char> input_a(65536);
33 for (size_t i = 0; i < input_a.size(); i++) {
34 input_a[i] = static_cast<char>(i % 256);
35 }
36
37 std::vector<char> compressed_output;
38 auto get_compressor_output = [&]() {
39 std::string_view output = compressor->GetOutputData();
40 compressed_output.insert(compressed_output.end(), output.begin(), output.end());
41 compressor->ConsumeOutputData(output.size());
42 };
43
44 std::vector<char> decompressed_output;
45 auto get_decompressor_output = [&]() {
46 std::string_view output = decompressor->GetOutputData();
47 decompressed_output.insert(decompressed_output.end(), output.begin(), output.end());
48 decompressor->ConsumeOutputData(output.size());
49 };
50
51 ASSERT_TRUE(compressor->AddInputData(input_a.data(), input_a.size() / 2));
52 get_compressor_output();
53 ASSERT_TRUE(compressor->AddInputData(input_a.data() + input_a.size() / 2,
54 input_a.size() - input_a.size() / 2));
55 ASSERT_TRUE(compressor->FlushOutputData());
56 get_compressor_output();
57 ASSERT_NE(compressed_output.size(), 0);
58 ASSERT_EQ(compressor->TotalInputSize(), input_a.size());
59 ASSERT_EQ(compressor->TotalOutputSize(), compressed_output.size());
60
61 // Flush with no new input doesn't affect output.
62 ASSERT_TRUE(compressor->FlushOutputData());
63 ASSERT_TRUE(compressor->GetOutputData().empty());
64
65 ASSERT_TRUE(decompressor->AddInputData(compressed_output.data(), compressed_output.size() / 2));
66 get_decompressor_output();
67 ASSERT_TRUE(decompressor->AddInputData(compressed_output.data() + compressed_output.size() / 2,
68 compressed_output.size() - compressed_output.size() / 2));
69 get_decompressor_output();
70 ASSERT_EQ(decompressed_output, input_a);
71
72 // Compress and decompress input_b.
73 std::vector<char> input_b(65536);
74 for (size_t i = 0; i < input_b.size(); i++) {
75 input_b[i] = static_cast<char>(i % 32);
76 }
77 compressed_output.clear();
78 decompressed_output.clear();
79 ASSERT_TRUE(compressor->AddInputData(input_b.data(), input_b.size()));
80 ASSERT_TRUE(compressor->FlushOutputData());
81 get_compressor_output();
82 ASSERT_NE(compressed_output.size(), 0);
83 ASSERT_TRUE(decompressor->AddInputData(compressed_output.data(), compressed_output.size()));
84 get_decompressor_output();
85 ASSERT_EQ(decompressed_output, input_b);
86 }
87