// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "bsdiff/brotli_compressor.h"

#include <gtest/gtest.h>

#include "bsdiff/brotli_decompressor.h"

namespace {

constexpr uint8_t kHelloWorld[] = {
    0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x0a,
};
}  // namespace

namespace bsdiff {

TEST(BrotliCompressorTest, BrotliCompressorSmoke) {
  BrotliCompressor brotli_compressor(11);
  EXPECT_TRUE(brotli_compressor.Write(kHelloWorld, sizeof(kHelloWorld)));
  EXPECT_TRUE(brotli_compressor.Finish());
  std::vector<uint8_t> compressed_data = brotli_compressor.GetCompressedData();
  EXPECT_GT(compressed_data.size(), static_cast<size_t>(0));

  // Run decompressor and check we can get the exact same data as kHelloWorld.
  std::vector<uint8_t> decompressed_data(sizeof(kHelloWorld));
  BrotliDecompressor brotli_decompressor;
  EXPECT_TRUE(brotli_decompressor.SetInputData(compressed_data.data(),
                                               compressed_data.size()));
  EXPECT_TRUE(
      brotli_decompressor.Read(decompressed_data.data(), sizeof(kHelloWorld)));
  EXPECT_TRUE(brotli_decompressor.Close());
  EXPECT_EQ(
      std::vector<uint8_t>(kHelloWorld, kHelloWorld + sizeof(kHelloWorld)),
      decompressed_data);
}

TEST(BrotliCompressorTest, BrotliCompressorEmptyStream) {
  uint8_t unused_value = 0;
  BrotliCompressor brotli_compressor(11);
  EXPECT_TRUE(brotli_compressor.Write(&unused_value, 0));
  EXPECT_TRUE(brotli_compressor.Finish());

  std::vector<uint8_t> compressed_data = brotli_compressor.GetCompressedData();

  // Check that we can close the decompressor without errors.
  BrotliDecompressor brotli_decompressor;
  EXPECT_TRUE(brotli_decompressor.SetInputData(compressed_data.data(),
                                               compressed_data.size()));
  EXPECT_TRUE(brotli_decompressor.Close());
}

}  // namespace bsdiff
