// 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> registry( new RegisteredObjects()); 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