// Copyright 2017 The Fuchsia 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 "src/ledger/bin/storage/impl/object_digest.h"

#include "gtest/gtest.h"
#include "src/ledger/bin/encryption/primitives/hash.h"

namespace storage {
namespace {

fxl::StringView operator"" _s(const char* str, size_t size) {
  return fxl::StringView(str, size);
}

// Test for object ids smaller than the inlining threshold.
using ObjectDigestSmallTest = ::testing::TestWithParam<fxl::StringView>;

TEST_P(ObjectDigestSmallTest, Index) {
  ObjectDigest object_digest =
      ComputeObjectDigest(PieceType::INDEX, ObjectType::BLOB, GetParam());
  ASSERT_TRUE(IsDigestValid(object_digest));
  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
  EXPECT_EQ(PieceType::INDEX, info.piece_type);
  EXPECT_EQ(ObjectType::BLOB, info.object_type);
  EXPECT_EQ(InlinedPiece::YES, info.inlined);
  EXPECT_EQ(GetParam(), ExtractObjectDigestData(object_digest));
}

TEST_P(ObjectDigestSmallTest, Value) {
  ObjectDigest object_digest =
      ComputeObjectDigest(PieceType::CHUNK, ObjectType::TREE_NODE, GetParam());
  ASSERT_TRUE(IsDigestValid(object_digest));
  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
  EXPECT_EQ(PieceType::CHUNK, info.piece_type);
  EXPECT_EQ(InlinedPiece::YES, info.inlined);
  EXPECT_EQ(ObjectType::TREE_NODE, info.object_type);
  EXPECT_EQ(GetParam(), ExtractObjectDigestData(object_digest));
}

INSTANTIATE_TEST_SUITE_P(ObjectDigestTest, ObjectDigestSmallTest,
                         ::testing::Values("", "hello", "world\0withzero"_s,
                                           "01234567890123456789012345678901"));

// Test for object ids bigger than the inlining threshold.
using ObjectDigestBigTest = ::testing::TestWithParam<fxl::StringView>;

TEST_P(ObjectDigestBigTest, Index) {
  ObjectDigest object_digest =
      ComputeObjectDigest(PieceType::INDEX, ObjectType::TREE_NODE, GetParam());
  ASSERT_TRUE(IsDigestValid(object_digest));
  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
  EXPECT_EQ(PieceType::INDEX, info.piece_type);
  EXPECT_EQ(ObjectType::TREE_NODE, info.object_type);
  EXPECT_EQ(InlinedPiece::NO, info.inlined);
  EXPECT_EQ(encryption::SHA256WithLengthHash(GetParam()),
            ExtractObjectDigestData(object_digest));
}

TEST_P(ObjectDigestBigTest, Value) {
  ObjectDigest object_digest =
      ComputeObjectDigest(PieceType::CHUNK, ObjectType::BLOB, GetParam());
  ASSERT_TRUE(IsDigestValid(object_digest));
  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
  EXPECT_EQ(PieceType::CHUNK, info.piece_type);
  EXPECT_EQ(ObjectType::BLOB, info.object_type);
  EXPECT_EQ(InlinedPiece::NO, info.inlined);
  EXPECT_EQ(encryption::SHA256WithLengthHash(GetParam()),
            ExtractObjectDigestData(object_digest));
}

INSTANTIATE_TEST_SUITE_P(
    ObjectDigestTest, ObjectDigestBigTest,
    ::testing::Values("012345678901234567890123456789012",
                      "012345678900123456789001234567890012"
                      "345678900123456789001234567890012345"
                      "67890"));
}  // namespace
}  // namespace storage
