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