From aed9a9d3fa176d4e36637779db4826a91db7ddc8 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Sun, 10 Nov 2024 11:59:27 -0800 Subject: [PATCH] fml: Improve CFTest.SupportsCustomRetainRelease test (flutter/engine#56480) Eliminates the use of statics in CFTest.SupportsCustomRetainRelease (introduced in https://github.com/flutter/engine/pull/56463), "clever" as it was. Issue: https://github.com/flutter/flutter/issues/137801 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style --- .../fml/platform/darwin/cf_utils_unittests.mm | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/engine/src/flutter/fml/platform/darwin/cf_utils_unittests.mm b/engine/src/flutter/fml/platform/darwin/cf_utils_unittests.mm index dba51e1c2a..d18ab0dad6 100644 --- a/engine/src/flutter/fml/platform/darwin/cf_utils_unittests.mm +++ b/engine/src/flutter/fml/platform/darwin/cf_utils_unittests.mm @@ -8,18 +8,19 @@ namespace fml { +// Test state used in CFTest.SupportsCustomRetainRelease. +struct CFRefTestState { + bool retain_called; + bool release_called; +}; + // Template specialization used in CFTest.SupportsCustomRetainRelease. template <> -struct CFRefTraits { - static bool retain_called; - static bool release_called; - - static constexpr int64_t kNullValue = 0; - static void Retain(int64_t instance) { retain_called = true; } - static void Release(int64_t instance) { release_called = true; } +struct CFRefTraits { + static constexpr CFRefTestState* kNullValue = nullptr; + static void Retain(CFRefTestState* instance) { instance->retain_called = true; } + static void Release(CFRefTestState* instance) { instance->release_called = true; } }; -bool CFRefTraits::retain_called = false; -bool CFRefTraits::release_called = false; namespace testing { @@ -98,18 +99,21 @@ TEST(CFTest, RetainSharesOwnership) { } TEST(CFTest, SupportsCustomRetainRelease) { - CFRef ref(1); - ASSERT_EQ(ref.Get(), 1); - ASSERT_FALSE(CFRefTraits::retain_called); - ASSERT_FALSE(CFRefTraits::release_called); + CFRefTestState instance{}; + CFRef ref(&instance); + ASSERT_EQ(ref.Get(), &instance); + ASSERT_FALSE(instance.retain_called); + ASSERT_FALSE(instance.release_called); ref.Reset(); - ASSERT_EQ(ref.Get(), 0); - ASSERT_TRUE(CFRefTraits::release_called); - ref.Retain(2); - ASSERT_EQ(ref.Get(), 2); - ASSERT_TRUE(CFRefTraits::retain_called); - CFRefTraits::retain_called = false; - CFRefTraits::release_called = false; + ASSERT_EQ(ref.Get(), nullptr); + ASSERT_FALSE(instance.retain_called); + ASSERT_TRUE(instance.release_called); + + CFRefTestState other_instance{}; + ref.Retain(&other_instance); + ASSERT_EQ(ref.Get(), &other_instance); + ASSERT_TRUE(other_instance.retain_called); + ASSERT_FALSE(other_instance.release_called); } } // namespace testing