owned_objects_unittest.cc 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/performance_manager/owned_objects.h"
  5. #include "base/memory/ptr_util.h"
  6. #include "base/test/gtest_util.h"
  7. #include "testing/gmock/include/gmock/gmock.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. namespace performance_manager {
  10. namespace {
  11. class Owned {
  12. public:
  13. Owned() = default;
  14. virtual ~Owned() { OnDestructor(); }
  15. Owned(const Owned&) = delete;
  16. Owned& operator=(const Owned) = delete;
  17. MOCK_METHOD1(OnPassedTo, void(void*));
  18. MOCK_METHOD1(OnTakenFrom, void(void*));
  19. MOCK_METHOD0(OnDestructor, void());
  20. };
  21. } // namespace
  22. TEST(OwnedObjectsTest, ContainerWorksAsAdvertised) {
  23. using Owner =
  24. OwnedObjects<Owned, void*, &Owned::OnPassedTo, &Owned::OnTakenFrom>;
  25. std::unique_ptr<Owner> owner = std::make_unique<Owner>();
  26. std::unique_ptr<Owned> owned1 = std::make_unique<Owned>();
  27. std::unique_ptr<Owned> owned2 = std::make_unique<Owned>();
  28. auto* raw1 = owned1.get();
  29. auto* raw2 = owned2.get();
  30. // Pass both objects to the owner.
  31. EXPECT_EQ(0u, owner->size());
  32. EXPECT_CALL(*raw1, OnPassedTo(owner.get()));
  33. owner->PassObject(std::move(owned1), owner.get());
  34. EXPECT_EQ(1u, owner->size());
  35. EXPECT_CALL(*raw2, OnPassedTo(owner.get()));
  36. owner->PassObject(std::move(owned2), owner.get());
  37. EXPECT_EQ(2u, owner->size());
  38. // Take one back.
  39. EXPECT_CALL(*raw1, OnTakenFrom(owner.get()));
  40. owned1 = owner->TakeObject(raw1, owner.get());
  41. EXPECT_EQ(1u, owner->size());
  42. // Destroy that object and expect its destructor to have been invoked.
  43. EXPECT_CALL(*raw1, OnDestructor());
  44. owned1.reset();
  45. raw1 = nullptr;
  46. // Expect the container to explode if deleted with objects.
  47. EXPECT_DCHECK_DEATH(owner.reset());
  48. // Ask the container to release the remaining objects.
  49. EXPECT_CALL(*raw2, OnTakenFrom(owner.get()));
  50. EXPECT_CALL(*raw2, OnDestructor());
  51. owner->ReleaseObjects(owner.get());
  52. raw2 = nullptr;
  53. // Destroying the container is now safe.
  54. owner.reset();
  55. }
  56. } // namespace performance_manager