diff --git a/interfaces/inner_kits/src/ipc/dhfwk_sa_manager.cpp b/interfaces/inner_kits/src/ipc/dhfwk_sa_manager.cpp index 78c24914b2e6a828d11102c4229c69c8538235af..29c30e52642a8b585d18f96f9207678a95adcc8d 100644 --- a/interfaces/inner_kits/src/ipc/dhfwk_sa_manager.cpp +++ b/interfaces/inner_kits/src/ipc/dhfwk_sa_manager.cpp @@ -192,6 +192,10 @@ int32_t DHFWKSAManager::AddPublisherListenerToCache(const DHTopic topic, sptr listener) { std::lock_guard publisherListenersLock(publisherListenersMutex_); + if (publisherListenersCache_.find(topic) == publisherListenersCache_.end()) { + DHLOGE("Can not find the topic: %{public}u In publisherListenersCache_.", static_cast(topic)); + return; + } publisherListenersCache_[topic].erase(listener); } diff --git a/services/distributedhardwarefwkservice/include/publisher/publisher.h b/services/distributedhardwarefwkservice/include/publisher/publisher.h index e7307c5bfb6da46dbb465a8f6df1380c36b3d062..f496127a19beffb17d1d1c17179c1fc6d4b2b3a1 100644 --- a/services/distributedhardwarefwkservice/include/publisher/publisher.h +++ b/services/distributedhardwarefwkservice/include/publisher/publisher.h @@ -31,6 +31,7 @@ public: void RegisterListener(const DHTopic topic, const sptr listener); void UnregisterListener(const DHTopic topic, const sptr listener); void PublishMessage(const DHTopic topic, const std::string &message); + bool IsTopicExist(const DHTopic topic); private: Publisher(); std::unordered_map> publisherItems_; diff --git a/services/distributedhardwarefwkservice/src/publisher/publisher.cpp b/services/distributedhardwarefwkservice/src/publisher/publisher.cpp index e5a9729e6ed546339c9af26c81ecf161d4614ede..ccca747bb111d4d1a952c2d3a9c790cd39552c3d 100644 --- a/services/distributedhardwarefwkservice/src/publisher/publisher.cpp +++ b/services/distributedhardwarefwkservice/src/publisher/publisher.cpp @@ -15,6 +15,8 @@ #include "publisher.h" +#include "distributed_hardware_log.h" + namespace OHOS { namespace DistributedHardware { IMPLEMENT_SINGLE_INSTANCE(Publisher); @@ -38,17 +40,35 @@ Publisher::~Publisher() void Publisher::RegisterListener(const DHTopic topic, const sptr listener) { + if (!IsTopicExist(topic)) { + return; + } publisherItems_[topic]->AddListener(listener); } void Publisher::UnregisterListener(const DHTopic topic, const sptr listener) { + if (!IsTopicExist(topic)) { + return; + } publisherItems_[topic]->RemoveListener(listener); } void Publisher::PublishMessage(const DHTopic topic, const std::string &message) { + if (!IsTopicExist(topic)) { + return; + } publisherItems_[topic]->PublishMessage(message); } + +bool Publisher::IsTopicExist(const DHTopic topic) +{ + if (publisherItems_.find(topic) == publisherItems_.end()) { + DHLOGE("The topic: %{public}u is not exist.", static_cast(topic)); + return false; + } + return true; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/distributedhardwarefwkservice/test/unittest/common/publisher/src/publisher_item_test.cpp b/services/distributedhardwarefwkservice/test/unittest/common/publisher/src/publisher_item_test.cpp index 7d74ee60468f7f78ec00e49b901879e5f9a40dd8..c8aaae6a1a0278433f9c51960a7aafc4ae47e872 100644 --- a/services/distributedhardwarefwkservice/test/unittest/common/publisher/src/publisher_item_test.cpp +++ b/services/distributedhardwarefwkservice/test/unittest/common/publisher/src/publisher_item_test.cpp @@ -15,6 +15,8 @@ #include "publisher_item_test.h" +#include "publisher.h" + using namespace testing::ext; using namespace std; namespace OHOS { @@ -111,5 +113,47 @@ HWTEST_F(PublisherItemTest, PublishMessage_002, TestSize.Level0) item.PublishMessage(message); EXPECT_EQ(false, item.listeners_.empty()); } + +HWTEST_F(PublisherItemTest, RegisterListener_001, TestSize.Level0) +{ + DHTopic topic = DHTopic::TOPIC_MIN; + sptr listener(new MockIPublisherListener()); + EXPECT_NO_FATAL_FAILURE(Publisher::GetInstance().RegisterListener(topic, listener)); +} + +HWTEST_F(PublisherItemTest, RegisterListener_002, TestSize.Level0) +{ + DHTopic topic = DHTopic::TOPIC_LOW_LATENCY; + sptr listener(new MockIPublisherListener()); + EXPECT_NO_FATAL_FAILURE(Publisher::GetInstance().RegisterListener(topic, listener)); +} + +HWTEST_F(PublisherItemTest, UnregisterListener_001, TestSize.Level0) +{ + DHTopic topic = DHTopic::TOPIC_MIN; + sptr listener(new MockIPublisherListener()); + EXPECT_NO_FATAL_FAILURE(Publisher::GetInstance().UnregisterListener(topic, listener)); +} + +HWTEST_F(PublisherItemTest, UnregisterListener_002, TestSize.Level0) +{ + DHTopic topic = DHTopic::TOPIC_LOW_LATENCY; + sptr listener(new MockIPublisherListener()); + EXPECT_NO_FATAL_FAILURE(Publisher::GetInstance().UnregisterListener(topic, listener)); +} + +HWTEST_F(PublisherItemTest, Publisher_PublishMessage_001, TestSize.Level0) +{ + DHTopic topic = DHTopic::TOPIC_MIN; + std::string message = "message_test"; + EXPECT_NO_FATAL_FAILURE(Publisher::GetInstance().PublishMessage(topic, message)); +} + +HWTEST_F(PublisherItemTest, Publisher_PublishMessage_002, TestSize.Level0) +{ + DHTopic topic = DHTopic::TOPIC_LOW_LATENCY; + std::string message = "message_test"; + EXPECT_NO_FATAL_FAILURE(Publisher::GetInstance().PublishMessage(topic, message)); +} } // namespace DistributedHardware } // namespace OHOS