blob: 1856e37e5644255ce4e29eaf7a1a8b785d2fb63d [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/cloud_sync/impl/entry_payload_encoding.h"
#include "gmock/gmock.h"
#include "src/ledger/bin/cloud_sync/impl/entry_payload_generated.h"
#include "src/ledger/bin/storage/fake/fake_object_identifier_factory.h"
#include "src/ledger/bin/storage/public/types.h"
#include "src/ledger/lib/convert/convert.h"
namespace cloud_sync {
namespace {
using ::storage::fake::FakeObjectIdentifierFactory;
using EntryPayloadEncodingTest = ::testing::TestWithParam<storage::Entry>;
TEST_P(EntryPayloadEncodingTest, EncodeDecode) {
const storage::Entry entry = GetParam();
FakeObjectIdentifierFactory factory;
std::string payload = EncodeEntryPayload(entry, &factory);
storage::Entry output;
ASSERT_TRUE(DecodeEntryPayload(entry.entry_id, payload, &factory, &output));
EXPECT_EQ(entry, output);
}
INSTANTIATE_TEST_SUITE_P(
EntryPayloadEncodingTest, EntryPayloadEncodingTest,
::testing::Values(
storage::Entry{"entry_name",
storage::ObjectIdentifier(12, storage::ObjectDigest("bananas"), nullptr),
storage::KeyPriority::EAGER, "entry_id"},
storage::Entry{"lazy_entry",
storage::ObjectIdentifier(0, storage::ObjectDigest("apple"), nullptr),
storage::KeyPriority::LAZY, "entry_id2"}));
TEST(EntryPayloadEncodingTest, ManuallyBuilt) {
FakeObjectIdentifierFactory factory;
flatbuffers::FlatBufferBuilder builder;
storage::ObjectIdentifier object_identifier =
storage::ObjectIdentifier(12, storage::ObjectDigest("bananas"), nullptr);
auto entry_name = convert::ToFlatBufferVector(&builder, "entry_name");
auto object_identifier_off = convert::ToFlatBufferVector(
&builder, factory.ObjectIdentifierToStorageBytes(object_identifier));
EntryPayloadBuilder entry_builder(builder);
entry_builder.add_entry_name(entry_name);
entry_builder.add_object_identifier(object_identifier_off);
entry_builder.add_priority(KeyPriority_EAGER);
builder.Finish(entry_builder.Finish());
storage::Entry entry;
ASSERT_TRUE(DecodeEntryPayload("some_id", builder, &factory, &entry));
EXPECT_EQ(entry, (storage::Entry{"entry_name", object_identifier, storage::KeyPriority::EAGER,
"some_id"}));
}
TEST(EntryPayloadEncodingTest, NoName) {
FakeObjectIdentifierFactory factory;
flatbuffers::FlatBufferBuilder builder;
auto object_identifier = convert::ToFlatBufferVector(
&builder, factory.ObjectIdentifierToStorageBytes(
storage::ObjectIdentifier(12, storage::ObjectDigest("bananas"), nullptr)));
EntryPayloadBuilder entry_builder(builder);
entry_builder.add_object_identifier(object_identifier);
entry_builder.add_priority(KeyPriority_EAGER);
builder.Finish(entry_builder.Finish());
storage::Entry entry;
ASSERT_FALSE(DecodeEntryPayload("some_id", builder, &factory, &entry));
}
TEST(EntryPayloadEncodingTest, NoObjectIdentifier) {
FakeObjectIdentifierFactory factory;
flatbuffers::FlatBufferBuilder builder;
auto entry_name = convert::ToFlatBufferVector(&builder, "entry_name");
EntryPayloadBuilder entry_builder(builder);
entry_builder.add_entry_name(entry_name);
entry_builder.add_priority(KeyPriority_EAGER);
builder.Finish(entry_builder.Finish());
storage::Entry entry;
ASSERT_FALSE(DecodeEntryPayload("some_id", builder, &factory, &entry));
}
TEST(EntryPayloadEncodingTest, InvalidObjectIdentifier) {
FakeObjectIdentifierFactory factory;
flatbuffers::FlatBufferBuilder builder;
auto entry_name = convert::ToFlatBufferVector(&builder, "entry_name");
auto object_identifier = convert::ToFlatBufferVector(&builder, "fgjdhjfgdjkh");
EntryPayloadBuilder entry_builder(builder);
entry_builder.add_entry_name(entry_name);
entry_builder.add_object_identifier(object_identifier);
entry_builder.add_priority(KeyPriority_EAGER);
builder.Finish(entry_builder.Finish());
storage::Entry entry;
ASSERT_FALSE(DecodeEntryPayload("some_id", builder, &factory, &entry));
}
} // namespace
} // namespace cloud_sync