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 <gmock/gmock.h> 178bf80f4bSopenharmony_ci#include <gtest/gtest.h> 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ci#include <meta/api/container/container_observer.h> 208bf80f4bSopenharmony_ci#include <meta/api/make_callback.h> 218bf80f4bSopenharmony_ci#include <meta/base/ref_uri.h> 228bf80f4bSopenharmony_ci 238bf80f4bSopenharmony_ci#include "src/test_runner.h" 248bf80f4bSopenharmony_ci#include "src/test_utils.h" 258bf80f4bSopenharmony_ci#include "src/testing_objects.h" 268bf80f4bSopenharmony_ci#include "src/util.h" 278bf80f4bSopenharmony_ci 288bf80f4bSopenharmony_ciusing namespace testing; 298bf80f4bSopenharmony_ciusing namespace testing::ext; 308bf80f4bSopenharmony_ci 318bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 328bf80f4bSopenharmony_ci 338bf80f4bSopenharmony_ciclass IntfContainerObserverTest : public testing::Test { 348bf80f4bSopenharmony_cipublic: 358bf80f4bSopenharmony_ci void SetUp() override 368bf80f4bSopenharmony_ci { 378bf80f4bSopenharmony_ci container_ = interface_pointer_cast<IContainer>(CreateTestContainer("Base")); 388bf80f4bSopenharmony_ci ASSERT_NE(container_, nullptr); 398bf80f4bSopenharmony_ci ASSERT_NE(observer_.GetIObject(), nullptr); 408bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("Object1_1")); 418bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("SameNameDifferentUid")); 428bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("ObjectDupe")); 438bf80f4bSopenharmony_ci container1_1_ = interface_pointer_cast<IContainer>(CreateTestContainer("Container1_1")); 448bf80f4bSopenharmony_ci container_->Add(interface_pointer_cast<IObject>(container1_1_)); 458bf80f4bSopenharmony_ci container1_1_->Add(CreateTestType<IObject>("Object2_1")); 468bf80f4bSopenharmony_ci container1_1_->Add(CreateTestType<IObject>("ObjectDupe")); 478bf80f4bSopenharmony_ci container1_1_->Add(CreateTestType<IObject>("SameNameDifferentUid")); 488bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("Object1_3")); 498bf80f4bSopenharmony_ci container2_1_ = interface_pointer_cast<IContainer>(CreateTestContainer("SameNameDifferentUid")); 508bf80f4bSopenharmony_ci container1_1_->Add(interface_pointer_cast<IObject>(container2_1_)); 518bf80f4bSopenharmony_ci 528bf80f4bSopenharmony_ci observer_.Container(container_) 538bf80f4bSopenharmony_ci .OnDescendantAdded([this](const ChildChangedInfo& info) { OnAdded(info); }) 548bf80f4bSopenharmony_ci .OnDescendantRemoved([this](const ChildChangedInfo& info) { OnRemoved(info); }) 558bf80f4bSopenharmony_ci .OnDescendantMoved([this](const ChildMovedInfo& info) { OnMoved(info); }); 568bf80f4bSopenharmony_ci } 578bf80f4bSopenharmony_ci void TearDown() override 588bf80f4bSopenharmony_ci { 598bf80f4bSopenharmony_ci container_.reset(); 608bf80f4bSopenharmony_ci observer_.ResetIObject(); 618bf80f4bSopenharmony_ci } 628bf80f4bSopenharmony_ci static void SetUpTestSuite() 638bf80f4bSopenharmony_ci { 648bf80f4bSopenharmony_ci SetTest(); 658bf80f4bSopenharmony_ci } 668bf80f4bSopenharmony_ci static void TearDownTestSuite() 678bf80f4bSopenharmony_ci { 688bf80f4bSopenharmony_ci ResetTest(); 698bf80f4bSopenharmony_ci } 708bf80f4bSopenharmony_ci 718bf80f4bSopenharmony_ciprotected: 728bf80f4bSopenharmony_ci void OnAdded(const ChildChangedInfo& info) 738bf80f4bSopenharmony_ci { 748bf80f4bSopenharmony_ci addedCalls_.push_back(info); 758bf80f4bSopenharmony_ci } 768bf80f4bSopenharmony_ci void OnRemoved(const ChildChangedInfo& info) 778bf80f4bSopenharmony_ci { 788bf80f4bSopenharmony_ci removedCalls_.push_back(info); 798bf80f4bSopenharmony_ci } 808bf80f4bSopenharmony_ci void OnMoved(const ChildMovedInfo& info) 818bf80f4bSopenharmony_ci { 828bf80f4bSopenharmony_ci movedCalls_.push_back(info); 838bf80f4bSopenharmony_ci } 848bf80f4bSopenharmony_ci 858bf80f4bSopenharmony_ci BASE_NS::vector<ChildChangedInfo> addedCalls_; 868bf80f4bSopenharmony_ci BASE_NS::vector<ChildChangedInfo> removedCalls_; 878bf80f4bSopenharmony_ci BASE_NS::vector<ChildMovedInfo> movedCalls_; 888bf80f4bSopenharmony_ci 898bf80f4bSopenharmony_ci IContainer::Ptr container_; 908bf80f4bSopenharmony_ci IContainer::Ptr container1_1_; 918bf80f4bSopenharmony_ci IContainer::Ptr container2_1_; 928bf80f4bSopenharmony_ci META_NS::ContainerObserver observer_; 938bf80f4bSopenharmony_ci}; 948bf80f4bSopenharmony_ci 958bf80f4bSopenharmony_ci/** 968bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest 978bf80f4bSopenharmony_ci * @tc.desc: test AddDirectChild function 988bf80f4bSopenharmony_ci * @tc.type: FUNC 998bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1008bf80f4bSopenharmony_ci */ 1018bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, AddDirectChild, TestSize.Level1) 1028bf80f4bSopenharmony_ci{ 1038bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("DirectChild"); 1048bf80f4bSopenharmony_ci ASSERT_TRUE(container_->Add(child)); 1058bf80f4bSopenharmony_ci 1068bf80f4bSopenharmony_ci ASSERT_THAT(addedCalls_, SizeIs(1)); 1078bf80f4bSopenharmony_ci ASSERT_THAT(removedCalls_, SizeIs(0)); 1088bf80f4bSopenharmony_ci ASSERT_THAT(movedCalls_, SizeIs(0)); 1098bf80f4bSopenharmony_ci 1108bf80f4bSopenharmony_ci auto info = addedCalls_[0]; 1118bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 1128bf80f4bSopenharmony_ci EXPECT_EQ(info.parent.lock(), container_); 1138bf80f4bSopenharmony_ci} 1148bf80f4bSopenharmony_ci 1158bf80f4bSopenharmony_ci/** 1168bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest 1178bf80f4bSopenharmony_ci * @tc.desc: test AddDescendantChild function 1188bf80f4bSopenharmony_ci * @tc.type: FUNC 1198bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1208bf80f4bSopenharmony_ci */ 1218bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, AddDescendantChild, TestSize.Level1) 1228bf80f4bSopenharmony_ci{ 1238bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("Descendant"); 1248bf80f4bSopenharmony_ci ASSERT_TRUE(container2_1_->Add(child)); 1258bf80f4bSopenharmony_ci 1268bf80f4bSopenharmony_ci ASSERT_THAT(addedCalls_, SizeIs(1)); 1278bf80f4bSopenharmony_ci ASSERT_THAT(removedCalls_, SizeIs(0)); 1288bf80f4bSopenharmony_ci ASSERT_THAT(movedCalls_, SizeIs(0)); 1298bf80f4bSopenharmony_ci 1308bf80f4bSopenharmony_ci auto info = addedCalls_[0]; 1318bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 1328bf80f4bSopenharmony_ci EXPECT_EQ(info.parent.lock(), container2_1_); 1338bf80f4bSopenharmony_ci} 1348bf80f4bSopenharmony_ci 1358bf80f4bSopenharmony_ci/** 1368bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest 1378bf80f4bSopenharmony_ci * @tc.desc: test ChangedAfterChild function 1388bf80f4bSopenharmony_ci * @tc.type: FUNC 1398bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1408bf80f4bSopenharmony_ci */ 1418bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, ChangeAfterChild, TestSize.Level1) 1428bf80f4bSopenharmony_ci{ 1438bf80f4bSopenharmony_ci auto container = CreateTestContainer<IContainer>("DescendantContainer"); 1448bf80f4bSopenharmony_ci ASSERT_TRUE(container2_1_->Add(container)); 1458bf80f4bSopenharmony_ci 1468bf80f4bSopenharmony_ci ASSERT_THAT(addedCalls_, SizeIs(1)); 1478bf80f4bSopenharmony_ci ASSERT_THAT(removedCalls_, SizeIs(0)); 1488bf80f4bSopenharmony_ci ASSERT_THAT(movedCalls_, SizeIs(0)); 1498bf80f4bSopenharmony_ci 1508bf80f4bSopenharmony_ci auto info = addedCalls_[0]; 1518bf80f4bSopenharmony_ci EXPECT_EQ(info.object, interface_pointer_cast<IObject>(container)); 1528bf80f4bSopenharmony_ci EXPECT_EQ(info.parent.lock(), container2_1_); 1538bf80f4bSopenharmony_ci 1548bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("DescendantChild"); 1558bf80f4bSopenharmony_ci ASSERT_TRUE(container->Add(child)); 1568bf80f4bSopenharmony_ci 1578bf80f4bSopenharmony_ci ASSERT_THAT(addedCalls_, SizeIs(2)); 1588bf80f4bSopenharmony_ci ASSERT_THAT(removedCalls_, SizeIs(0)); 1598bf80f4bSopenharmony_ci ASSERT_THAT(movedCalls_, SizeIs(0)); 1608bf80f4bSopenharmony_ci 1618bf80f4bSopenharmony_ci info = addedCalls_[1]; 1628bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 1638bf80f4bSopenharmony_ci EXPECT_EQ(info.parent.lock(), container); 1648bf80f4bSopenharmony_ci 1658bf80f4bSopenharmony_ci EXPECT_TRUE(container1_1_->Remove(container2_1_)); 1668bf80f4bSopenharmony_ci 1678bf80f4bSopenharmony_ci EXPECT_TRUE(container->Remove(child)); 1688bf80f4bSopenharmony_ci ASSERT_THAT(addedCalls_, SizeIs(2)); 1698bf80f4bSopenharmony_ci ASSERT_THAT(removedCalls_, SizeIs(1)); 1708bf80f4bSopenharmony_ci ASSERT_THAT(movedCalls_, SizeIs(0)); 1718bf80f4bSopenharmony_ci 1728bf80f4bSopenharmony_ci info = removedCalls_[0]; 1738bf80f4bSopenharmony_ci EXPECT_EQ(info.object, interface_pointer_cast<IObject>(container2_1_)); 1748bf80f4bSopenharmony_ci EXPECT_EQ(info.parent.lock(), container1_1_); 1758bf80f4bSopenharmony_ci} 1768bf80f4bSopenharmony_ci 1778bf80f4bSopenharmony_ci/** 1788bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest 1798bf80f4bSopenharmony_ci * @tc.desc: test RemoveDescendant function 1808bf80f4bSopenharmony_ci * @tc.type: FUNC 1818bf80f4bSopenharmony_ci * @tc.require: I7DMS1 1828bf80f4bSopenharmony_ci */ 1838bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, RemoveDescendant, TestSize.Level1) 1848bf80f4bSopenharmony_ci{ 1858bf80f4bSopenharmony_ci container_->Remove(container1_1_); 1868bf80f4bSopenharmony_ci ASSERT_THAT(addedCalls_, SizeIs(0)); 1878bf80f4bSopenharmony_ci ASSERT_THAT(removedCalls_, SizeIs(1)); 1888bf80f4bSopenharmony_ci ASSERT_THAT(movedCalls_, SizeIs(0)); 1898bf80f4bSopenharmony_ci 1908bf80f4bSopenharmony_ci auto info = removedCalls_[0]; 1918bf80f4bSopenharmony_ci EXPECT_EQ(info.object, interface_pointer_cast<IObject>(container1_1_)); 1928bf80f4bSopenharmony_ci EXPECT_EQ(info.parent.lock(), container_); 1938bf80f4bSopenharmony_ci removedCalls_.clear(); 1948bf80f4bSopenharmony_ci 1958bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("Descendant"); 1968bf80f4bSopenharmony_ci container1_1_->Add(child); 1978bf80f4bSopenharmony_ci 1988bf80f4bSopenharmony_ci ASSERT_THAT(addedCalls_, SizeIs(0)); 1998bf80f4bSopenharmony_ci ASSERT_THAT(removedCalls_, SizeIs(0)); 2008bf80f4bSopenharmony_ci ASSERT_THAT(movedCalls_, SizeIs(0)); 2018bf80f4bSopenharmony_ci} 2028bf80f4bSopenharmony_ci 2038bf80f4bSopenharmony_ciMETA_END_NAMESPACE()