1*a3a45f30SXin Li // Copyright 2018 The Chromium OS Authors. All rights reserved.
2*a3a45f30SXin Li // Use of this source code is governed by a BSD-style license that can be
3*a3a45f30SXin Li // found in the LICENSE file.
4*a3a45f30SXin Li
5*a3a45f30SXin Li #include "bsdiff/brotli_decompressor.h"
6*a3a45f30SXin Li
7*a3a45f30SXin Li #include <memory>
8*a3a45f30SXin Li #include <string>
9*a3a45f30SXin Li #include <vector>
10*a3a45f30SXin Li
11*a3a45f30SXin Li #include <gtest/gtest.h>
12*a3a45f30SXin Li
13*a3a45f30SXin Li namespace {
14*a3a45f30SXin Li
15*a3a45f30SXin Li // echo -n "Hello!" | brotli -9 | hexdump -v -e '" " 11/1 "0x%02x, " "\n"'
16*a3a45f30SXin Li constexpr uint8_t kBrotliHello[] = {
17*a3a45f30SXin Li 0x8b, 0x02, 0x80, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x03,
18*a3a45f30SXin Li };
19*a3a45f30SXin Li
20*a3a45f30SXin Li } // namespace
21*a3a45f30SXin Li
22*a3a45f30SXin Li namespace bsdiff {
23*a3a45f30SXin Li
24*a3a45f30SXin Li class BrotliDecompressorTest : public testing::Test {
25*a3a45f30SXin Li protected:
SetUp()26*a3a45f30SXin Li void SetUp() {
27*a3a45f30SXin Li decompressor_.reset(new BrotliDecompressor());
28*a3a45f30SXin Li EXPECT_NE(nullptr, decompressor_.get());
29*a3a45f30SXin Li }
30*a3a45f30SXin Li
31*a3a45f30SXin Li std::unique_ptr<BrotliDecompressor> decompressor_;
32*a3a45f30SXin Li };
33*a3a45f30SXin Li
TEST_F(BrotliDecompressorTest,SmokeTest)34*a3a45f30SXin Li TEST_F(BrotliDecompressorTest, SmokeTest) {
35*a3a45f30SXin Li EXPECT_TRUE(decompressor_->SetInputData(kBrotliHello, sizeof(kBrotliHello)));
36*a3a45f30SXin Li std::vector<uint8_t> output_data(6);
37*a3a45f30SXin Li EXPECT_TRUE(decompressor_->Read(output_data.data(), output_data.size()));
38*a3a45f30SXin Li std::string hello = "Hello!";
39*a3a45f30SXin Li EXPECT_EQ(std::vector<uint8_t>(hello.begin(), hello.end()), output_data);
40*a3a45f30SXin Li }
41*a3a45f30SXin Li
TEST_F(BrotliDecompressorTest,ReadingFromEmptyFileTest)42*a3a45f30SXin Li TEST_F(BrotliDecompressorTest, ReadingFromEmptyFileTest) {
43*a3a45f30SXin Li uint8_t data = 0;
44*a3a45f30SXin Li EXPECT_TRUE(decompressor_->SetInputData(&data, 0));
45*a3a45f30SXin Li
46*a3a45f30SXin Li uint8_t output_data[10];
47*a3a45f30SXin Li EXPECT_FALSE(decompressor_->Read(output_data, sizeof(output_data)));
48*a3a45f30SXin Li }
49*a3a45f30SXin Li
50*a3a45f30SXin Li // Check that we fail to read from a truncated file.
TEST_F(BrotliDecompressorTest,ReadingFromTruncatedFileTest)51*a3a45f30SXin Li TEST_F(BrotliDecompressorTest, ReadingFromTruncatedFileTest) {
52*a3a45f30SXin Li // We feed only half of the compressed file.
53*a3a45f30SXin Li EXPECT_TRUE(
54*a3a45f30SXin Li decompressor_->SetInputData(kBrotliHello, sizeof(kBrotliHello) / 2));
55*a3a45f30SXin Li uint8_t output_data[6];
56*a3a45f30SXin Li EXPECT_FALSE(decompressor_->Read(output_data, sizeof(output_data)));
57*a3a45f30SXin Li }
58*a3a45f30SXin Li
59*a3a45f30SXin Li // Check that we fail to read more than it is available in the file.
TEST_F(BrotliDecompressorTest,ReadingMoreThanAvailableTest)60*a3a45f30SXin Li TEST_F(BrotliDecompressorTest, ReadingMoreThanAvailableTest) {
61*a3a45f30SXin Li EXPECT_TRUE(decompressor_->SetInputData(kBrotliHello, sizeof(kBrotliHello)));
62*a3a45f30SXin Li uint8_t output_data[1000];
63*a3a45f30SXin Li EXPECT_FALSE(decompressor_->Read(output_data, sizeof(output_data)));
64*a3a45f30SXin Li }
65*a3a45f30SXin Li
66*a3a45f30SXin Li } // namespace bsdiff
67