// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by the GPL v2 license that can
// be found in the LICENSE file.
//
// Tests for verity::FileHasher

#include <utility>

#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>

#include "verity/file_hasher.h"

namespace verity {

namespace {
// Just 32 byte salt. (There is no meaning to this pattern.)
constexpr char kSalt[] =
    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789";
}  // namespace

class FileHasherTest : public ::testing::Test {
 public:
  FileHasherTest() {}
  virtual ~FileHasherTest() = default;
  void SetUp() {
    EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
    target_file_.reset(new base::File(
        temp_dir_.GetPath().Append("target_file.bin"),
        base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE));
    EXPECT_TRUE(target_file_->IsValid());

    auto test_data_path = base::FilePath(getenv("SRC")).Append("test_data");
    small_file_.reset(
        new base::File(test_data_path.Append("small_file.bin"),
                       base::File::FLAG_OPEN | base::File::FLAG_READ));
    EXPECT_TRUE(small_file_->IsValid());
  }

 protected:
  base::ScopedTempDir temp_dir_;

  // This file is created by the following command:
  // `dd if=/dev/urandom of=small_file.bin count=2 bs=4096`
  std::unique_ptr<base::File> small_file_;
  std::unique_ptr<base::File> target_file_;
};

TEST_F(FileHasherTest, EndToEnd) {
  verity::FileHasher hasher(std::move(small_file_), std::move(target_file_), 0,
                            kSha256HashName);
  EXPECT_TRUE(hasher.Initialize());
  hasher.set_salt(reinterpret_cast<const char*>(kSalt));
  EXPECT_TRUE(hasher.Hash());
  EXPECT_TRUE(hasher.Store());

  hasher.PrintTable(true);
  EXPECT_EQ(hasher.GetTable(true),
            "0 16 verity payload=ROOT_DEV hashtree=HASH_DEV hashstart=16 "
            "alg=sha256 root_hexdigest=21f0268f4a293d8110074c678a651c638d"
            "56a610dd2662975a35d451d3258018 salt=abcdef0123456789abcdef01"
            "23456789abcdef0123456789abcdef0123456789");
}

TEST_F(FileHasherTest, BadSourceFile) {
  verity::FileHasher hasher(nullptr, std::move(target_file_), 0,
                            kSha256HashName);
  EXPECT_FALSE(hasher.Initialize());
}

TEST_F(FileHasherTest, BadTargetFile) {
  verity::FileHasher hasher(std::move(small_file_), nullptr, 0,
                            kSha256HashName);
  EXPECT_FALSE(hasher.Initialize());
}

TEST_F(FileHasherTest, BadAlgorithmName) {
  verity::FileHasher hasher(std::move(small_file_), std::move(target_file_), 0,
                            "foo");
  EXPECT_FALSE(hasher.Initialize());
}

TEST_F(FileHasherTest, BadBlockSize) {
  // The source file size is just 2 4KiB blocks.
  verity::FileHasher hasher(std::move(small_file_), std::move(target_file_), 3,
                            kSha256HashName);
  EXPECT_FALSE(hasher.Initialize());
}

}  // namespace verity
