blob: 61b0783260eeaf53da44f76b3f02c7bebe1b99e7 [file] [log] [blame]
Avi Drissman8ba1bad2022-09-13 19:22:361// Copyright 2019 The Chromium Authors
Chris Hamiltonf7effeb2020-05-19 21:43:122// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/performance_manager/owned_objects.h"
6
7#include "base/memory/ptr_util.h"
8#include "base/test/gtest_util.h"
9#include "testing/gmock/include/gmock/gmock.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace performance_manager {
13
14namespace {
15
16class Owned {
17 public:
18 Owned() = default;
19 virtual ~Owned() { OnDestructor(); }
20
21 Owned(const Owned&) = delete;
22 Owned& operator=(const Owned) = delete;
23
Patrick Monette32293e72024-08-12 21:44:4924 MOCK_METHOD(void, OnPassedTo, (void*));
25 MOCK_METHOD(void, OnTakenFrom, (void*));
26 MOCK_METHOD(void, OnDestructor, ());
Chris Hamiltonf7effeb2020-05-19 21:43:1227};
28
29} // namespace
30
31TEST(OwnedObjectsTest, ContainerWorksAsAdvertised) {
32 using Owner =
33 OwnedObjects<Owned, void*, &Owned::OnPassedTo, &Owned::OnTakenFrom>;
Dave Tapuska6439b7a2022-03-03 22:53:3434 std::unique_ptr<Owner> owner = std::make_unique<Owner>();
Chris Hamiltonf7effeb2020-05-19 21:43:1235
Dave Tapuska6439b7a2022-03-03 22:53:3436 std::unique_ptr<Owned> owned1 = std::make_unique<Owned>();
37 std::unique_ptr<Owned> owned2 = std::make_unique<Owned>();
Chris Hamiltonf7effeb2020-05-19 21:43:1238 auto* raw1 = owned1.get();
39 auto* raw2 = owned2.get();
40
41 // Pass both objects to the owner.
42 EXPECT_EQ(0u, owner->size());
43 EXPECT_CALL(*raw1, OnPassedTo(owner.get()));
44 owner->PassObject(std::move(owned1), owner.get());
45 EXPECT_EQ(1u, owner->size());
46 EXPECT_CALL(*raw2, OnPassedTo(owner.get()));
47 owner->PassObject(std::move(owned2), owner.get());
48 EXPECT_EQ(2u, owner->size());
49
50 // Take one back.
51 EXPECT_CALL(*raw1, OnTakenFrom(owner.get()));
52 owned1 = owner->TakeObject(raw1, owner.get());
53 EXPECT_EQ(1u, owner->size());
54
55 // Destroy that object and expect its destructor to have been invoked.
56 EXPECT_CALL(*raw1, OnDestructor());
57 owned1.reset();
58 raw1 = nullptr;
59
60 // Expect the container to explode if deleted with objects.
Joe Masonbe3fb0f02024-06-14 15:45:2261 EXPECT_CHECK_DEATH(owner.reset());
Chris Hamiltonf7effeb2020-05-19 21:43:1262
63 // Ask the container to release the remaining objects.
64 EXPECT_CALL(*raw2, OnTakenFrom(owner.get()));
65 EXPECT_CALL(*raw2, OnDestructor());
66 owner->ReleaseObjects(owner.get());
67 raw2 = nullptr;
68
69 // Destroying the container is now safe.
70 owner.reset();
71}
72
73} // namespace performance_manager