18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci 168bf80f4bSopenharmony_ci#include <gtest/gtest.h> 178bf80f4bSopenharmony_ci 188bf80f4bSopenharmony_ci#include <meta/base/shared_ptr.h> 198bf80f4bSopenharmony_ci 208bf80f4bSopenharmony_ci#include "src/test_runner.h" 218bf80f4bSopenharmony_ci 228bf80f4bSopenharmony_ciusing namespace testing::ext; 238bf80f4bSopenharmony_ci 248bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 258bf80f4bSopenharmony_ci 268bf80f4bSopenharmony_ciclass SharedPtrTest : public testing::Test { 278bf80f4bSopenharmony_cipublic: 288bf80f4bSopenharmony_ci static void SetUpTestSuite() 298bf80f4bSopenharmony_ci { 308bf80f4bSopenharmony_ci SetTest(); 318bf80f4bSopenharmony_ci } 328bf80f4bSopenharmony_ci static void TearDownTestSuite() 338bf80f4bSopenharmony_ci { 348bf80f4bSopenharmony_ci ResetTest(); 358bf80f4bSopenharmony_ci } 368bf80f4bSopenharmony_ci void SetUp() override {} 378bf80f4bSopenharmony_ci void TearDown() override {} 388bf80f4bSopenharmony_ci}; 398bf80f4bSopenharmony_ci 408bf80f4bSopenharmony_ci/** 418bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 428bf80f4bSopenharmony_ci * @tc.desc: test SharedPtrCanBeConvertedToSharedPtrWithConstType function 438bf80f4bSopenharmony_ci * @tc.type: FUNC 448bf80f4bSopenharmony_ci * @tc.require: I7DMS1 458bf80f4bSopenharmony_ci */ 468bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, SharedPtrCanBeConvertedToSharedPtrWithConstType, TestSize.Level1) 478bf80f4bSopenharmony_ci{ 488bf80f4bSopenharmony_ci constexpr auto initialValue = 120; 498bf80f4bSopenharmony_ci 508bf80f4bSopenharmony_ci BASE_NS::shared_ptr<const int> cptr = ptr; 518bf80f4bSopenharmony_ci 528bf80f4bSopenharmony_ci EXPECT_EQ(*cptr, initialValue); 538bf80f4bSopenharmony_ci} 548bf80f4bSopenharmony_ci 558bf80f4bSopenharmony_ci/** 568bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 578bf80f4bSopenharmony_ci * @tc.desc: test SharedPtrCanBeReturnedToSharedPtrWithConstType function 588bf80f4bSopenharmony_ci * @tc.type: FUNC 598bf80f4bSopenharmony_ci * @tc.require: I7DMS1 608bf80f4bSopenharmony_ci */ 618bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, SharedPtrCanBeReturnedAsSharedPtrWithConstType, TestSize.Level1) 628bf80f4bSopenharmony_ci{ 638bf80f4bSopenharmony_ci constexpr auto initialValue = 120; 648bf80f4bSopenharmony_ci 658bf80f4bSopenharmony_ci auto functionReturningSharedConstPtr = [ptr]() -> BASE_NS::shared_ptr<const int> { return ptr; }; 668bf80f4bSopenharmony_ci 678bf80f4bSopenharmony_ci auto cptr = functionReturningSharedConstPtr(); 688bf80f4bSopenharmony_ci 698bf80f4bSopenharmony_ci EXPECT_EQ(*cptr, initialValue); 708bf80f4bSopenharmony_ci} 718bf80f4bSopenharmony_ci 728bf80f4bSopenharmony_ci/** 738bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 748bf80f4bSopenharmony_ci * @tc.desc: test DefaultConstructedSharedPtrIsEmpty function 758bf80f4bSopenharmony_ci * @tc.type: FUNC 768bf80f4bSopenharmony_ci * @tc.require: I7DMS1 778bf80f4bSopenharmony_ci */ 788bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, DefaultConstructedSharedPtrIsEmpty, TestSize.Level1) 798bf80f4bSopenharmony_ci{ 808bf80f4bSopenharmony_ci BASE_NS::shared_ptr<int> ptr; 818bf80f4bSopenharmony_ci 828bf80f4bSopenharmony_ci const auto rawPtr = ptr.get(); 838bf80f4bSopenharmony_ci const bool boolOperatorResult = ptr.operator bool(); 848bf80f4bSopenharmony_ci 858bf80f4bSopenharmony_ci EXPECT_EQ(rawPtr, nullptr); 868bf80f4bSopenharmony_ci EXPECT_EQ(boolOperatorResult, false); 878bf80f4bSopenharmony_ci} 888bf80f4bSopenharmony_ci 898bf80f4bSopenharmony_ci/** 908bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 918bf80f4bSopenharmony_ci * @tc.desc: test CopiedSharedPtrExtendObjectLifetime function 928bf80f4bSopenharmony_ci * @tc.type: FUNC 938bf80f4bSopenharmony_ci * @tc.require: I7DMS1 948bf80f4bSopenharmony_ci */ 958bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, CopiedSharedPtrExtendObjectLifetime, TestSize.Level1) 968bf80f4bSopenharmony_ci{ 978bf80f4bSopenharmony_ci constexpr auto initialValue = 120; 988bf80f4bSopenharmony_ci BASE_NS::shared_ptr<const int> cptr; 998bf80f4bSopenharmony_ci 1008bf80f4bSopenharmony_ci { 1018bf80f4bSopenharmony_ci cptr = ptr; 1028bf80f4bSopenharmony_ci } 1038bf80f4bSopenharmony_ci 1048bf80f4bSopenharmony_ci EXPECT_EQ(*cptr, initialValue); 1058bf80f4bSopenharmony_ci} 1068bf80f4bSopenharmony_ci 1078bf80f4bSopenharmony_ci/** 1088bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 1098bf80f4bSopenharmony_ci * @tc.desc: test CopyConstructedSharedPtrExtendObjectLifetime function 1108bf80f4bSopenharmony_ci * @tc.type: FUNC 1118bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1128bf80f4bSopenharmony_ci */ 1138bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, CopyConstructedSharedPtrExtendObjectLifetime, TestSize.Level1) 1148bf80f4bSopenharmony_ci{ 1158bf80f4bSopenharmony_ci constexpr auto initialValue = 120; 1168bf80f4bSopenharmony_ci BASE_NS::shared_ptr<int> ptr = CreateShared<int>(initialValue); 1178bf80f4bSopenharmony_ci 1188bf80f4bSopenharmony_ci auto copy = BASE_NS::shared_ptr<int>(ptr); 1198bf80f4bSopenharmony_ci ptr.reset(); 1208bf80f4bSopenharmony_ci 1218bf80f4bSopenharmony_ci EXPECT_EQ(*copy, initialValue); 1228bf80f4bSopenharmony_ci} 1238bf80f4bSopenharmony_ci 1248bf80f4bSopenharmony_cistruct CountType { 1258bf80f4bSopenharmony_ci int count { 1 }; 1268bf80f4bSopenharmony_ci}; 1278bf80f4bSopenharmony_ci 1288bf80f4bSopenharmony_civoid CountDeleter(void* p) 1298bf80f4bSopenharmony_ci{ 1308bf80f4bSopenharmony_ci --static_cast<CountType*>(p)->count; 1318bf80f4bSopenharmony_ci} 1328bf80f4bSopenharmony_ci 1338bf80f4bSopenharmony_ci/** 1348bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 1358bf80f4bSopenharmony_ci * @tc.desc: test MoveMemoryLeakAndAssert function 1368bf80f4bSopenharmony_ci * @tc.type: FUNC 1378bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1388bf80f4bSopenharmony_ci */ 1398bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, MoveMemoryLeakAndAssert, TestSize.Level1) 1408bf80f4bSopenharmony_ci{ 1418bf80f4bSopenharmony_ci CountType test; 1428bf80f4bSopenharmony_ci { 1438bf80f4bSopenharmony_ci BASE_NS::shared_ptr<CountType> p(&test, CountDeleter); 1448bf80f4bSopenharmony_ci auto copy = p; 1458bf80f4bSopenharmony_ci p = BASE_NS::move(copy); 1468bf80f4bSopenharmony_ci } 1478bf80f4bSopenharmony_ci 1488bf80f4bSopenharmony_ci EXPECT_EQ(test.count, 0); 1498bf80f4bSopenharmony_ci} 1508bf80f4bSopenharmony_ci 1518bf80f4bSopenharmony_ci/** 1528bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 1538bf80f4bSopenharmony_ci * @tc.desc: test Expired function 1548bf80f4bSopenharmony_ci * @tc.type: FUNC 1558bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1568bf80f4bSopenharmony_ci */ 1578bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, Expired, TestSize.Level1) 1588bf80f4bSopenharmony_ci{ 1598bf80f4bSopenharmony_ci BASE_NS::weak_ptr<int> w = ptr; 1608bf80f4bSopenharmony_ci EXPECT_FALSE(w.expired()); 1618bf80f4bSopenharmony_ci ptr.reset(); 1628bf80f4bSopenharmony_ci EXPECT_TRUE(w.expired()); 1638bf80f4bSopenharmony_ci} 1648bf80f4bSopenharmony_ci 1658bf80f4bSopenharmony_ci/** 1668bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 1678bf80f4bSopenharmony_ci * @tc.desc: test Comparison function 1688bf80f4bSopenharmony_ci * @tc.type: FUNC 1698bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1708bf80f4bSopenharmony_ci */ 1718bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, Comparison, TestSize.Level1) 1728bf80f4bSopenharmony_ci{ 1738bf80f4bSopenharmony_ci auto p2 = p1; 1748bf80f4bSopenharmony_ci auto p3 = BASE_NS::shared_ptr<int>(p1.get(), [](void*) {}); 1758bf80f4bSopenharmony_ci 1768bf80f4bSopenharmony_ci EXPECT_EQ(p1, p2); 1778bf80f4bSopenharmony_ci EXPECT_EQ(p1, p3); 1788bf80f4bSopenharmony_ci EXPECT_EQ(p2, p3); 1798bf80f4bSopenharmony_ci} 1808bf80f4bSopenharmony_ci 1818bf80f4bSopenharmony_ci/** 1828bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 1838bf80f4bSopenharmony_ci * @tc.desc: test ExplicitDeleterBasicType function 1848bf80f4bSopenharmony_ci * @tc.type: FUNC 1858bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1868bf80f4bSopenharmony_ci */ 1878bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, ExplicitDeleterBasicType, TestSize.Level1) 1888bf80f4bSopenharmony_ci{ 1898bf80f4bSopenharmony_ci int count = 0; 1908bf80f4bSopenharmony_ci { 1918bf80f4bSopenharmony_ci auto p = BASE_NS::shared_ptr<int>(&count, [&](int *) { ++count; }); 1928bf80f4bSopenharmony_ci } 1938bf80f4bSopenharmony_ci EXPECT_EQ(count, 1); 1948bf80f4bSopenharmony_ci} 1958bf80f4bSopenharmony_ci 1968bf80f4bSopenharmony_cinamespace { 1978bf80f4bSopenharmony_cistruct ITestInterface : CORE_NS::IInterface { 1988bf80f4bSopenharmony_ci const IInterface* GetInterface(const BASE_NS::Uid& uid) const override 1998bf80f4bSopenharmony_ci { 2008bf80f4bSopenharmony_ci return this; 2018bf80f4bSopenharmony_ci } 2028bf80f4bSopenharmony_ci 2038bf80f4bSopenharmony_ci IInterface* GetInterface(const BASE_NS::Uid& uid) override 2048bf80f4bSopenharmony_ci { 2058bf80f4bSopenharmony_ci return this; 2068bf80f4bSopenharmony_ci } 2078bf80f4bSopenharmony_ci 2088bf80f4bSopenharmony_ci void Ref() override 2098bf80f4bSopenharmony_ci { 2108bf80f4bSopenharmony_ci ++count; 2118bf80f4bSopenharmony_ci } 2128bf80f4bSopenharmony_ci 2138bf80f4bSopenharmony_ci void Unref() override 2148bf80f4bSopenharmony_ci { 2158bf80f4bSopenharmony_ci --count; 2168bf80f4bSopenharmony_ci } 2178bf80f4bSopenharmony_ci int count { 0 }; 2188bf80f4bSopenharmony_ci}; 2198bf80f4bSopenharmony_ci} // namespace 2208bf80f4bSopenharmony_ci 2218bf80f4bSopenharmony_ci/** 2228bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 2238bf80f4bSopenharmony_ci * @tc.desc: test ExplicitDeleterInterface function 2248bf80f4bSopenharmony_ci * @tc.type: FUNC 2258bf80f4bSopenharmony_ci * @tc.require: I7DMS1 2268bf80f4bSopenharmony_ci */ 2278bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, ExplicitDeleterInterface, TestSize.Level1) 2288bf80f4bSopenharmony_ci{ 2298bf80f4bSopenharmony_ci { 2308bf80f4bSopenharmony_ci ITestInterface test; 2318bf80f4bSopenharmony_ci { 2328bf80f4bSopenharmony_ci auto p = BASE_NS::shared_ptr<ITestInterface>(&test); 2338bf80f4bSopenharmony_ci EXPECT_EQ(test.count, 1); 2348bf80f4bSopenharmony_ci } 2358bf80f4bSopenharmony_ci EXPECT_EQ(test.count, 0); 2368bf80f4bSopenharmony_ci } 2378bf80f4bSopenharmony_ci { 2388bf80f4bSopenharmony_ci ITestInterface test; 2398bf80f4bSopenharmony_ci { 2408bf80f4bSopenharmony_ci auto p = BASE_NS::shared_ptr<CORE_NS::IInterface>(&test); 2418bf80f4bSopenharmony_ci EXPECT_EQ(test.count, 1); 2428bf80f4bSopenharmony_ci } 2438bf80f4bSopenharmony_ci EXPECT_EQ(test.count, 0); 2448bf80f4bSopenharmony_ci } 2458bf80f4bSopenharmony_ci { 2468bf80f4bSopenharmony_ci int count = 0; 2478bf80f4bSopenharmony_ci ITestInterface test; 2488bf80f4bSopenharmony_ci { 2498bf80f4bSopenharmony_ci auto p = BASE_NS::shared_ptr<ITestInterface>(&test, [&count](ITestInterface*) { ++count; }); 2508bf80f4bSopenharmony_ci EXPECT_EQ(test.count, 0); 2518bf80f4bSopenharmony_ci } 2528bf80f4bSopenharmony_ci EXPECT_EQ(count, 1); 2538bf80f4bSopenharmony_ci EXPECT_EQ(test.count, 0); 2548bf80f4bSopenharmony_ci } 2558bf80f4bSopenharmony_ci} 2568bf80f4bSopenharmony_ci 2578bf80f4bSopenharmony_ci/** 2588bf80f4bSopenharmony_ci * @tc.name: SharedPtrTest 2598bf80f4bSopenharmony_ci * @tc.desc: test UniquePtrConversion function 2608bf80f4bSopenharmony_ci * @tc.type: FUNC 2618bf80f4bSopenharmony_ci * @tc.require: I7DMS1 2628bf80f4bSopenharmony_ci */ 2638bf80f4bSopenharmony_ciHWTEST_F(SharedPtrTest, UniquePtrConversion, TestSize.Level1) 2648bf80f4bSopenharmony_ci{ 2658bf80f4bSopenharmony_ci { 2668bf80f4bSopenharmony_ci BASE_NS::shared_ptr<int> shared(BASE_NS::move(unique)); 2678bf80f4bSopenharmony_ci ASSERT_TRUE(!unique); 2688bf80f4bSopenharmony_ci ASSERT_TRUE(shared); 2698bf80f4bSopenharmony_ci EXPECT_EQ(*shared, 2); 2708bf80f4bSopenharmony_ci } 2718bf80f4bSopenharmony_ci { 2728bf80f4bSopenharmony_ci ITestInterface object; 2738bf80f4bSopenharmony_ci object.Ref(); 2748bf80f4bSopenharmony_ci EXPECT_EQ(object.count, 1); 2758bf80f4bSopenharmony_ci BASE_NS::unique_ptr<ITestInterface, decltype(deleter)> unique(&object, deleter); 2768bf80f4bSopenharmony_ci BASE_NS::shared_ptr<CORE_NS::IInterface> shared(BASE_NS::move(unique)); 2778bf80f4bSopenharmony_ci ASSERT_TRUE(!unique); 2788bf80f4bSopenharmony_ci ASSERT_TRUE(shared); 2798bf80f4bSopenharmony_ci EXPECT_EQ(object.count, 1); 2808bf80f4bSopenharmony_ci shared.reset(); 2818bf80f4bSopenharmony_ci EXPECT_EQ(object.count, 0); 2828bf80f4bSopenharmony_ci } 2838bf80f4bSopenharmony_ci { 2848bf80f4bSopenharmony_ci int count = 0; 2858bf80f4bSopenharmony_ci { 2868bf80f4bSopenharmony_ci int value = 2; 2878bf80f4bSopenharmony_ci BASE_NS::unique_ptr<int, decltype(deleter)> unique(&value, deleter); 2888bf80f4bSopenharmony_ci BASE_NS::shared_ptr<int> shared(BASE_NS::move(unique)); 2898bf80f4bSopenharmony_ci ASSERT_TRUE(!unique); 2908bf80f4bSopenharmony_ci ASSERT_TRUE(shared); 2918bf80f4bSopenharmony_ci EXPECT_EQ(*shared, 2); 2928bf80f4bSopenharmony_ci EXPECT_EQ(count, 0); 2938bf80f4bSopenharmony_ci } 2948bf80f4bSopenharmony_ci EXPECT_EQ(count, 1); 2958bf80f4bSopenharmony_ci } 2968bf80f4bSopenharmony_ci { 2978bf80f4bSopenharmony_ci BASE_NS::shared_ptr<int> shared; 2988bf80f4bSopenharmony_ci shared = BASE_NS::move(unique); 2998bf80f4bSopenharmony_ci ASSERT_TRUE(!unique); 3008bf80f4bSopenharmony_ci ASSERT_TRUE(shared); 3018bf80f4bSopenharmony_ci EXPECT_EQ(*shared, 2); 3028bf80f4bSopenharmony_ci } 3038bf80f4bSopenharmony_ci { 3048bf80f4bSopenharmony_ci ITestInterface object; 3058bf80f4bSopenharmony_ci object.Ref(); 3068bf80f4bSopenharmony_ci EXPECT_EQ(object.count, 1); 3078bf80f4bSopenharmony_ci BASE_NS::unique_ptr<ITestInterface, decltype(deleter)> unique(&object, deleter); 3088bf80f4bSopenharmony_ci BASE_NS::shared_ptr<CORE_NS::IInterface> shared; 3098bf80f4bSopenharmony_ci shared = BASE_NS::move(unique); 3108bf80f4bSopenharmony_ci ASSERT_TRUE(!unique); 3118bf80f4bSopenharmony_ci ASSERT_TRUE(shared); 3128bf80f4bSopenharmony_ci EXPECT_EQ(object.count, 1); 3138bf80f4bSopenharmony_ci shared.reset(); 3148bf80f4bSopenharmony_ci EXPECT_EQ(object.count, 0); 3158bf80f4bSopenharmony_ci } 3168bf80f4bSopenharmony_ci} 3178bf80f4bSopenharmony_ci 3188bf80f4bSopenharmony_ciMETA_END_NAMESPACE()