blob: 6650314e286237f8cfc13b5836f7faed461c6a44 [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_factory_impl.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "src/ledger/bin/storage/impl/object_digest.h"
#include "src/ledger/bin/storage/impl/storage_test_utils.h"
#include "src/ledger/bin/testing/test_with_environment.h"
namespace storage {
namespace {
using ObjectIdentifierFactoryImplTest = ledger::TestWithEnvironment;
TEST_F(ObjectIdentifierFactoryImplTest, CountsAndCleansUp) {
const ObjectDigest digest = RandomObjectDigest(environment_.random());
const ObjectDigest another_digest = RandomObjectDigest(environment_.random());
ObjectIdentifierFactoryImpl factory;
EXPECT_EQ(factory.count(digest), 0);
EXPECT_EQ(factory.size(), 0);
auto identifier_1 = factory.MakeObjectIdentifier(0u, 0u, digest);
EXPECT_EQ(factory.count(digest), 1);
EXPECT_EQ(factory.size(), 1);
// Tracking is per-digest, not per-identifier.
auto identifier_2 = factory.MakeObjectIdentifier(1u, 2u, digest);
EXPECT_EQ(factory.count(digest), 2);
EXPECT_EQ(factory.size(), 1);
// Distinct digests are tracked separately.
auto identifier_3 = factory.MakeObjectIdentifier(0u, 0u, another_digest);
EXPECT_EQ(factory.count(digest), 2);
EXPECT_EQ(factory.count(another_digest), 1);
EXPECT_EQ(factory.size(), 2);
// Identifiers are tracked across copies.
auto identifier_4 = identifier_3;
EXPECT_EQ(factory.count(digest), 2);
EXPECT_EQ(factory.count(another_digest), 2);
EXPECT_EQ(factory.size(), 2);
// Counts are not increased by moves.
auto identifier_5 = std::move(identifier_4);
EXPECT_EQ(factory.count(digest), 2);
EXPECT_EQ(factory.count(another_digest), 2);
EXPECT_EQ(factory.size(), 2);
identifier_1 = ObjectIdentifier();
EXPECT_EQ(factory.count(digest), 1);
EXPECT_EQ(factory.count(another_digest), 2);
EXPECT_EQ(factory.size(), 2);
identifier_2 = ObjectIdentifier();
EXPECT_EQ(factory.count(digest), 0);
EXPECT_EQ(factory.count(another_digest), 2);
EXPECT_EQ(factory.size(), 1);
identifier_3 = ObjectIdentifier();
EXPECT_EQ(factory.count(digest), 0);
EXPECT_EQ(factory.count(another_digest), 1);
EXPECT_EQ(factory.size(), 1);
identifier_5 = ObjectIdentifier();
EXPECT_EQ(factory.count(digest), 0);
EXPECT_EQ(factory.count(another_digest), 0);
EXPECT_EQ(factory.size(), 0);
}
TEST_F(ObjectIdentifierFactoryImplTest, ObjectOutlivingFactory) {
const ObjectDigest digest = RandomObjectDigest(environment_.random());
ObjectIdentifier identifier;
{
ObjectIdentifierFactoryImpl factory;
EXPECT_EQ(factory.count(digest), 0);
EXPECT_EQ(factory.size(), 0);
identifier = factory.MakeObjectIdentifier(0u, 0u, digest);
EXPECT_EQ(factory.count(digest), 1);
EXPECT_EQ(factory.size(), 1);
EXPECT_EQ(identifier.factory(), &factory);
}
// When the factory is destroyed, the identifier stops being tracked.
EXPECT_EQ(identifier.factory(), nullptr);
}
} // namespace
} // namespace storage