blob: 2888ed7dfac36349056b5be35b39a034d54f8ba0 [file] [log] [blame]
// Copyright 2019 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_identifier_encoding.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "src/ledger/bin/storage/fake/fake_object_identifier_factory.h"
#include "src/ledger/bin/storage/impl/storage_test_utils.h"
#include "src/ledger/bin/storage/public/types.h"
#include "src/ledger/bin/testing/test_with_environment.h"
#include "src/ledger/lib/convert/convert.h"
namespace storage {
namespace {
using ObjectIdentifierEncodingTest = ::testing::TestWithParam<ObjectIdentifier>;
TEST_P(ObjectIdentifierEncodingTest, EncodeDecode) {
const ObjectIdentifier object_identifier = GetParam();
fake::FakeObjectIdentifierFactory factory;
std::string data = EncodeObjectIdentifier(object_identifier);
ObjectIdentifier output;
ASSERT_TRUE(DecodeObjectIdentifier(data, &factory, &output));
EXPECT_EQ(object_identifier, output);
}
INSTANTIATE_TEST_SUITE_P(ObjectIdentifierEncodingTest, ObjectIdentifierEncodingTest,
::testing::Values(ObjectIdentifier(0, ObjectDigest("\0pen"), nullptr),
ObjectIdentifier(78, ObjectDigest("pineapple"),
nullptr)));
TEST(ObjectIdentifierEncodingTest, ManuallyBuilt) {
flatbuffers::FlatBufferBuilder builder;
auto object_digest = convert::ToFlatBufferVector(&builder, "apples");
ObjectIdentifierStorageBuilder object_identifier_builder(builder);
object_identifier_builder.add_object_digest(object_digest);
object_identifier_builder.add_key_index(12);
builder.Finish(object_identifier_builder.Finish());
fake::FakeObjectIdentifierFactory factory;
ObjectIdentifier object_identifier;
ASSERT_TRUE(DecodeObjectIdentifier(convert::ToStringView(builder), &factory, &object_identifier));
EXPECT_EQ(object_identifier, factory.MakeObjectIdentifier(12, ObjectDigest("apples")));
}
TEST(ObjectIdentifierEncodingTest, MissingObjectDigest) {
flatbuffers::FlatBufferBuilder builder;
ObjectIdentifierStorageBuilder object_identifier_builder(builder);
object_identifier_builder.add_key_index(12);
builder.Finish(object_identifier_builder.Finish());
fake::FakeObjectIdentifierFactory factory;
ObjectIdentifier object_identifier;
ASSERT_FALSE(
DecodeObjectIdentifier(convert::ToStringView(builder), &factory, &object_identifier));
}
using ObjectIdentifierDigestPrefixedEncodingTest = ledger::TestWithEnvironment;
TEST_F(ObjectIdentifierDigestPrefixedEncodingTest, EncodeDecode) {
fake::FakeObjectIdentifierFactory factory;
const ObjectIdentifier object_identifier =
RandomObjectIdentifier(environment_.random(), &factory);
std::string data = EncodeDigestPrefixedObjectIdentifier(object_identifier);
ObjectIdentifier output;
ASSERT_TRUE(DecodeDigestPrefixedObjectIdentifier(data, &factory, &output));
EXPECT_EQ(object_identifier, output);
}
TEST_F(ObjectIdentifierDigestPrefixedEncodingTest, InvalidInput) {
fake::FakeObjectIdentifierFactory factory;
ObjectIdentifier output;
// Input too short.
EXPECT_FALSE(DecodeDigestPrefixedObjectIdentifier("foo", &factory, &output));
// Input too long.
EXPECT_FALSE(DecodeDigestPrefixedObjectIdentifier("0123456789ABCDEF0123456789ABCDEF012345",
&factory, &output));
// Invalid object digest.
EXPECT_FALSE(
DecodeDigestPrefixedObjectIdentifier("\xf"
"123456789ABCDEF0123456789ABCDEF01234",
&factory, &output));
}
} // namespace
} // namespace storage