blob: 23270d094dafe433d936fa7142293bfddeae9b98 [file] [log] [blame]
// Copyright 2019 The Chromium 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 "components/performance_manager/registered_objects.h"
#include "base/memory/ptr_util.h"
#include "base/test/gtest_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace performance_manager {
namespace {
class Registered {
public:
Registered() = default;
virtual ~Registered() = default;
virtual uintptr_t GetTypeId() const = 0;
};
class Foo : public Registered {
public:
Foo() = default;
~Foo() override = default;
static uintptr_t TypeId() { return 0; }
uintptr_t GetTypeId() const override { return TypeId(); }
};
class Bar : public Registered {
public:
Bar() = default;
~Bar() override = default;
static uintptr_t TypeId() { return 1; }
uintptr_t GetTypeId() const override { return TypeId(); }
};
} // namespace
TEST(RegisteredObjectsTest, ContainerWorksAsAdvertised) {
std::unique_ptr<RegisteredObjects<Registered>> registry(
new RegisteredObjects<Registered>());
ASSERT_NE(Foo::TypeId(), Bar::TypeId());
EXPECT_FALSE(registry->GetRegisteredObject(Foo::TypeId()));
EXPECT_FALSE(registry->GetRegisteredObject(Bar::TypeId()));
// Insertion works.
Foo foo;
EXPECT_EQ(0u, registry->size());
registry->RegisterObject(&foo);
EXPECT_EQ(1u, registry->size());
EXPECT_EQ(&foo, registry->GetRegisteredObject(Foo::TypeId()));
EXPECT_FALSE(registry->GetRegisteredObject(Bar::TypeId()));
// Inserting again fails.
EXPECT_DCHECK_DEATH(registry->RegisterObject(&foo));
// Unregistered the wrong object fails.
Foo foo2;
EXPECT_DCHECK_DEATH(registry->UnregisterObject(&foo2));
// Unregistering works.
registry->UnregisterObject(&foo);
EXPECT_EQ(0u, registry->size());
EXPECT_FALSE(registry->GetRegisteredObject(Foo::TypeId()));
EXPECT_FALSE(registry->GetRegisteredObject(Bar::TypeId()));
// Unregistering again fails.
EXPECT_DCHECK_DEATH(registry->UnregisterObject(&foo));
EXPECT_DCHECK_DEATH(registry->UnregisterObject(&foo2));
// Registering multiple objects works.
Bar bar;
registry->RegisterObject(&foo);
EXPECT_EQ(1u, registry->size());
registry->RegisterObject(&bar);
EXPECT_EQ(2u, registry->size());
EXPECT_EQ(&foo, registry->GetRegisteredObject(Foo::TypeId()));
EXPECT_EQ(&bar, registry->GetRegisteredObject(Bar::TypeId()));
// Expect the container to explode if deleted with objects.
EXPECT_DCHECK_DEATH(registry.reset());
// Empty the registry.
registry->UnregisterObject(&bar);
EXPECT_EQ(1u, registry->size());
registry->UnregisterObject(&foo);
EXPECT_EQ(0u, registry->size());
}
} // namespace performance_manager