1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <gtest/gtest.h>
16 #include <memory>
17 #include <algorithm>
18 #include <functional>
19 #include "uri.h"
20 #define private public
21 #include "data_ability_observer_proxy.h"
22 #include "dataobs_mgr_inner.h"
23 #include "dataobs_mgr_errors.h"
24 #include "mock_data_ability_observer_stub.h"
25
26 using namespace OHOS;
27 using namespace testing::ext;
28 using namespace testing;
29
30 using Uri = OHOS::Uri;
31 using ObsListType = OHOS::AAFwk::DataObsMgrInner::ObsListType;
32 using ObsRecipientMapType = OHOS::AAFwk::DataObsMgrInner::ObsRecipientMapType;
33
34 namespace OHOS {
35 namespace AAFwk {
36 class DataObsMgrInnerTest : public testing::Test {
37 public:
38 static void SetUpTestCase(void);
39 static void TearDownTestCase(void);
40 void SetUp();
41 void TearDown();
42 std::shared_ptr<DataObsMgrInner> dataObsMgrInner_ = nullptr;
43 };
SetUpTestCase(void)44 void DataObsMgrInnerTest::SetUpTestCase(void)
45 {}
TearDownTestCase(void)46 void DataObsMgrInnerTest::TearDownTestCase(void)
47 {}
SetUp()48 void DataObsMgrInnerTest::SetUp()
49 {
50 std::shared_ptr<DataObsMgrInner> dataObsMgrInner_ = std::make_shared<DataObsMgrInner>();
51 }
TearDown()52 void DataObsMgrInnerTest::TearDown()
53 {}
54
55 /*
56 * Feature: DataObsMgrInner
57 * Function: Register and unregister function test
58 * SubFunction: HandleRegisterObserver/HandleRegisterObserver
59 * FunctionPoints: NA
60 * EnvConditions: NA
61 * CaseDescription:NA
62 */
63 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleRegisterObserver_0100, TestSize.Level1)
64 {
65 if (dataObsMgrInner_ == nullptr) {
66 return;
67 }
68
69 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
70 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
71
72 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
73 dataObsMgrInner_->HandleRegisterObserver(uri, callback);
74
75 EXPECT_EQ(dataObsMgrInner_->ObsExistInMap(callback), true);
76 dataObsMgrInner_->HandleUnregisterObserver(uri, callback);
77 EXPECT_EQ(dataObsMgrInner_->ObsExistInMap(callback), false);
78 }
79
80 /*
81 * Feature: DataObsMgrInner
82 * Function: Register function test
83 * SubFunction: HandleRegisterObserver
84 * FunctionPoints: NA
85 * EnvConditions: NA
86 * CaseDescription:NA
87 */
88 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleRegisterObserver_0200, TestSize.Level1)
89 {
90 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
91 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
92 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
93 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
94 ObsListType obsList;
95 obsList.push_back(callback);
96 dataObsMgrInner->obsmap_.emplace(uri.ToString(), obsList);
97 int res = dataObsMgrInner->HandleRegisterObserver(uri, callback);
98 EXPECT_EQ(res, OBS_EXIST);
99 }
100
101 /*
102 * Feature: DataObsMgrInner
103 * Function: Register function test
104 * SubFunction: HandleRegisterObserver
105 * FunctionPoints: NA
106 * EnvConditions: NA
107 * CaseDescription:NA
108 */
109 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleRegisterObserver_0300, TestSize.Level1)
110 {
111 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
112 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
113 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
114 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
115 const sptr<IDataAbilityObserver> callback1(new (std::nothrow) DataAbilityObserverProxy(observer));
116 ObsListType obsList;
117 obsList.push_back(callback1);
118 dataObsMgrInner->obsmap_.emplace(uri.ToString(), obsList);
119 int res = dataObsMgrInner->HandleRegisterObserver(uri, callback);
120 EXPECT_EQ(res, OBS_EXIST);
121 }
122
123 /*
124 * Feature: DataObsMgrInner
125 * Function: Unregister function test
126 * SubFunction: HandleUnregisterObserver
127 * FunctionPoints: NA
128 * EnvConditions: NA
129 * CaseDescription:NA
130 */
131 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleUnregisterObserver_0100, TestSize.Level1)
132 {
133 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
134 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
135 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
136 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
137 dataObsMgrInner->obsmap_.clear();
138 int res = dataObsMgrInner->HandleUnregisterObserver(uri, callback);
139 EXPECT_EQ(res, NO_OBS_FOR_URI);
140 }
141
142 /*
143 * Feature: DataObsMgrInner
144 * Function: Unregister function test
145 * SubFunction: HandleUnregisterObserver
146 * FunctionPoints: NA
147 * EnvConditions: NA
148 * CaseDescription:NA
149 */
150 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleUnregisterObserver_0200, TestSize.Level1)
151 {
152 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
153 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
154 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
155 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
156 ObsListType obsList;
157 obsList.push_back(callback);
158 dataObsMgrInner->obsmap_.emplace(uri.ToString(), obsList);
159 int res = dataObsMgrInner->HandleUnregisterObserver(uri, callback);
160 EXPECT_EQ(res, NO_ERROR);
161 }
162
163 /*
164 * Feature: DataObsMgrInner
165 * Function: Unregister function test
166 * SubFunction: HandleUnregisterObserver
167 * FunctionPoints: NA
168 * EnvConditions: NA
169 * CaseDescription:NA
170 */
171 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleUnregisterObserver_0300, TestSize.Level1)
172 {
173 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
174 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
175 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
176 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
177 const sptr<IDataAbilityObserver> callback2(new (std::nothrow) DataAbilityObserverProxy(observer));
178 ObsListType obsList;
179 obsList.push_back(callback);
180 obsList.push_back(callback2);
181 dataObsMgrInner->obsmap_.emplace(uri.ToString(), obsList);
182 dataObsMgrInner->obsmap_.emplace("exit", obsList);
183 int res = dataObsMgrInner->HandleUnregisterObserver(uri, callback);
184 EXPECT_EQ(res, NO_ERROR);
185 }
186
187 /*
188 * Feature: DataObsMgrInner
189 * Function: Register and unregister function test
190 * SubFunction: OnChange
191 * FunctionPoints: When the data changes, call the OnChange function of the registered dataabilityobserver
192 * EnvConditions: NA
193 * CaseDescription:NA
194 */
195 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleNotifyChange_0100, TestSize.Level1)
196 {
197 if (dataObsMgrInner_ == nullptr) {
198 return;
199 }
200 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
201 sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub(new (std::nothrow) MockDataAbilityObserverStub());
202
203 EXPECT_CALL(*mockDataAbilityObserverStub, OnChange()).Times(1);
204
205 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(mockDataAbilityObserverStub));
206 dataObsMgrInner_->HandleRegisterObserver(uri, callback);
207 dataObsMgrInner_->HandleNotifyChange(uri);
208 }
209
210 /*
211 * Feature: DataObsMgrInner
212 * Function: Unregister function test
213 * SubFunction: HandleUnregisterObserver
214 * FunctionPoints: NA
215 * EnvConditions: NA
216 * CaseDescription:NA
217 */
218 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleNotifyChange_0200, TestSize.Level1)
219 {
220 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
221 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
222 dataObsMgrInner->obsmap_.clear();
223 int res = dataObsMgrInner->HandleNotifyChange(uri);
224 EXPECT_EQ(res, NO_OBS_FOR_URI);
225 }
226
227 /*
228 * Feature: DataObsMgrInner
229 * Function: Unregister function test
230 * SubFunction: HandleUnregisterObserver
231 * FunctionPoints: NA
232 * EnvConditions: NA
233 * CaseDescription:NA
234 */
235 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleNotifyChange_0300, TestSize.Level1)
236 {
237 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
238 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
239 ObsListType obsList;
240 obsList.push_back(nullptr);
241 dataObsMgrInner->obsmap_.emplace(uri.ToString(), obsList);
242 int res = dataObsMgrInner->HandleNotifyChange(uri);
243 EXPECT_EQ(res, NO_ERROR);
244 }
245
246 /*
247 * Feature: DataObsMgrInner
248 * Function: Unregister function test
249 * SubFunction: CheckRegisteFull
250 * FunctionPoints: NA
251 * EnvConditions: NA
252 * CaseDescription:NA
253 */
254 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_CheckRegisteFull_0100, TestSize.Level1)
255 {
256 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
257 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
258 ObsListType obsList;
259 while (obsList.size() < dataObsMgrInner->obs_max_) {
260 obsList.push_back(nullptr);
261 }
262 dataObsMgrInner->obsmap_.emplace(uri.ToString(), obsList);
263 bool res = dataObsMgrInner->CheckRegisteFull(uri);
264 EXPECT_TRUE(res);
265 }
266
267 /*
268 * Feature: DataObsMgrInner
269 * Function: Unregister function test
270 * SubFunction: CheckRegisteFull
271 * FunctionPoints: NA
272 * EnvConditions: NA
273 * CaseDescription:NA
274 */
275 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_CheckRegisteFull_0200, TestSize.Level1)
276 {
277 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
278 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
279 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
280 sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
281 ObsListType obsList;
282 obsList.push_back(callback);
283 dataObsMgrInner->obsmap_.emplace(uri.ToString(), obsList);
284 bool res = dataObsMgrInner->CheckRegisteFull(uri);
285 EXPECT_FALSE(res);
286 }
287
288 /*
289 * Feature: DataObsMgrInner
290 * Function: GetObsListFromMap/RemoveObsFromMap/ObsExistInMap function test
291 * SubFunction: NA
292 * FunctionPoints: NA
293 * EnvConditions: NA
294 * CaseDescription:NA
295 */
296 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_GetRemoveObsListFromMap_ObsExistInMap_0100, TestSize.Level1)
297 {
298 if (dataObsMgrInner_ == nullptr) {
299 return;
300 }
301 Uri uri("dataability://device_id/com.domainname.dataability.persondata/person/10");
302 sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub(new (std::nothrow) MockDataAbilityObserverStub());
303 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(mockDataAbilityObserverStub));
304 dataObsMgrInner_->HandleRegisterObserver(uri, callback);
305
306 sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub2(new (std::nothrow) MockDataAbilityObserverStub());
307 const sptr<IDataAbilityObserver> callback2(
308 new (std::nothrow) DataAbilityObserverProxy(mockDataAbilityObserverStub2));
309
310 dataObsMgrInner_->HandleRegisterObserver(uri, callback2);
311 ObsListType obslist;
312 dataObsMgrInner_->GetObsListFromMap(uri, obslist);
313 EXPECT_EQ((std::size_t)2, obslist.size());
314 EXPECT_EQ(true, dataObsMgrInner_->ObsExistInMap(callback));
315 EXPECT_EQ(true, dataObsMgrInner_->ObsExistInMap(callback2));
316
317 dataObsMgrInner_->RemoveObsFromMap(callback->AsObject());
318 EXPECT_EQ(false, dataObsMgrInner_->ObsExistInMap(callback));
319 obslist.clear();
320 dataObsMgrInner_->GetObsListFromMap(uri, obslist);
321 EXPECT_EQ((std::size_t)1, obslist.size());
322 EXPECT_EQ(false, dataObsMgrInner_->ObsExistInMap(callback));
323
324 dataObsMgrInner_->RemoveObsFromMap(callback2->AsObject());
325 EXPECT_EQ(false, dataObsMgrInner_->ObsExistInMap(callback2));
326 obslist.clear();
327 dataObsMgrInner_->GetObsListFromMap(uri, obslist);
328 EXPECT_EQ((std::size_t)0, obslist.size());
329 EXPECT_EQ(false, dataObsMgrInner_->ObsExistInMap(callback2));
330 }
331
332 /*
333 * Feature: DataObsMgrInner
334 * Function: AddObsDeathRecipient/RemoveObsDeathRecipient function test
335 * SubFunction: NA
336 * FunctionPoints: NA
337 * EnvConditions: NA
338 * CaseDescription:NA
339 */
340 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_AddRemove_ObsDeathRecipient_0100, TestSize.Level1)
341 {
342 if (dataObsMgrInner_ == nullptr) {
343 return;
344 }
345
346 sptr<IRemoteObject> observer(new (std::nothrow) MockDataAbilityObserverStub());
347 sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
348 dataObsMgrInner_->AddObsDeathRecipient(callback);
349 dataObsMgrInner_->AddObsDeathRecipient(nullptr);
350
351 ObsRecipientMapType::const_iterator it;
352 it = dataObsMgrInner_->recipientMap_.find(observer);
353 EXPECT_EQ(true, it != dataObsMgrInner_->recipientMap_.end());
354
355 dataObsMgrInner_->RemoveObsDeathRecipient(callback->AsObject());
356 dataObsMgrInner_->RemoveObsDeathRecipient(nullptr);
357 it = dataObsMgrInner_->recipientMap_.find(observer);
358 EXPECT_EQ(false, it != dataObsMgrInner_->recipientMap_.end());
359
360 dataObsMgrInner_->recipientMap_.clear();
361 dataObsMgrInner_->RemoveObsDeathRecipient(callback->AsObject());
362 }
363
364 /*
365 * Feature: DataObsMgrInner
366 * Function: Unregister function test
367 * SubFunction: OnCallBackDied
368 * FunctionPoints: NA
369 * EnvConditions: NA
370 * CaseDescription:NA
371 */
372 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_OnCallBackDied_0100, TestSize.Level1)
373 {
374 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
375 dataObsMgrInner->OnCallBackDied(nullptr);
376
377 sptr<IRemoteObject> remoteObject;
378 wptr<IRemoteObject> remote(remoteObject);
379 dataObsMgrInner->SetHandler(nullptr);
380 dataObsMgrInner->OnCallBackDied(remote);
381
382 auto handler = std::make_shared<EventHandler>(AppExecFwk::EventRunner::Create());
383 dataObsMgrInner->SetHandler(handler);
384 dataObsMgrInner->OnCallBackDied(remote);
385 }
386
387 /*
388 * Feature: DataObsMgrInner
389 * Function: Unregister function test
390 * SubFunction: HandleCallBackDiedTask
391 * FunctionPoints: NA
392 * EnvConditions: NA
393 * CaseDescription:NA
394 */
395 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_HandleCallBackDiedTask_0100, TestSize.Level1)
396 {
397 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
398 dataObsMgrInner->HandleCallBackDiedTask(nullptr);
399
400 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
401 dataObsMgrInner->OnCallBackDied(observer);
402 }
403
404 /*
405 * Feature: DataObsMgrInner
406 * Function: Unregister function test
407 * SubFunction: RemoveObsFromMap
408 * FunctionPoints: NA
409 * EnvConditions: NA
410 * CaseDescription:NA
411 */
412 HWTEST_F(DataObsMgrInnerTest, DataObsMgrInner_RemoveObsFromMap_0100, TestSize.Level1)
413 {
414 std::shared_ptr<DataObsMgrInner> dataObsMgrInner = std::make_shared<DataObsMgrInner>();
415 std::string uri1 = "uri1";
416 std::string uri2 = "uri2";
417 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
418 const sptr<IDataAbilityObserver> callback1(new (std::nothrow) DataAbilityObserverProxy(observer));
419 const sptr<IDataAbilityObserver> callback2(new (std::nothrow) DataAbilityObserverProxy(observer));
420 ObsListType obsList1;
421 ObsListType obsList2;
422 ObsListType obsList3;
423 obsList1.push_back(callback1);
424 obsList2.push_back(callback1);
425 obsList2.push_back(callback2);
426 dataObsMgrInner->obsmap_.emplace(uri1, obsList1);
427 dataObsMgrInner->obsmap_.emplace(uri2, obsList2);
428 dataObsMgrInner->RemoveObsFromMap(callback2->AsObject());
429 }
430 } // namespace AAFwk
431 } // namespace OHOS
432