1 /*
2 * Copyright (c) 2023 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 "dataobs_mgr_inner_common.h"
20 #include "uri.h"
21 #define private public
22 #include "data_ability_observer_proxy.h"
23 #include "dataobs_mgr_errors.h"
24 #include "dataobs_mgr_inner_pref.h"
25 #include "hilog_tag_wrapper.h"
26 #include "mock_data_ability_observer_stub.h"
27
28 using namespace OHOS;
29 using namespace testing::ext;
30 using namespace testing;
31
32
33 namespace OHOS {
34 namespace AAFwk {
35 using Uri = OHOS::Uri;
36 using ObsListType = std::list<struct ObserverNode>;
37 using ObsRecipientMapType = OHOS::AAFwk::DataObsMgrInnerPref::ObsRecipientMapType;
38 class DataObsMgrInnerPrefTest : public testing::Test {
39 public:
40 static void SetUpTestCase(void);
41 static void TearDownTestCase(void);
42 void SetUp();
43 void TearDown();
44 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInnerPref_ = nullptr;
45 };
SetUpTestCase(void)46 void DataObsMgrInnerPrefTest::SetUpTestCase(void) {}
TearDownTestCase(void)47 void DataObsMgrInnerPrefTest::TearDownTestCase(void) {}
SetUp()48 void DataObsMgrInnerPrefTest::SetUp()
49 {
50 dataObsMgrInnerPref_ = std::make_shared<DataObsMgrInnerPref>();
51 }
TearDown()52 void DataObsMgrInnerPrefTest::TearDown() {}
53
54 static constexpr int64_t USER_TEST = 100;
55
56 /*
57 * Feature: DataObsMgrInnerPref
58 * Function: Register and unregister function test
59 * SubFunction: HandleRegisterObserver/HandleRegisterObserver
60 * FunctionPoints: NA
61 * EnvConditions: NA
62 * CaseDescription:NA
63 */
64 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0100, TestSize.Level1)
65 {
66 if (dataObsMgrInnerPref_ == nullptr) {
67 return;
68 }
69
70 Uri uri("sharepreferences://data/preferences/preferences_test");
71 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
72
73 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
74 dataObsMgrInnerPref_->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
75
76 EXPECT_EQ(dataObsMgrInnerPref_->HaveRegistered(callback), true);
77 dataObsMgrInnerPref_->HandleUnregisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
78 EXPECT_EQ(dataObsMgrInnerPref_->HaveRegistered(callback), false);
79 }
80
81 /*
82 * Feature: DataObsMgrInnerPref
83 * Function: Register function test
84 * SubFunction: HandleRegisterObserver
85 * FunctionPoints: NA
86 * EnvConditions: NA
87 * CaseDescription:NA
88 */
89 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0200, TestSize.Level1)
90 {
91 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
92 Uri uri("sharepreferences://data/preferences/preferences_test");
93 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
94 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
95 ObsListType obsList;
96 obsList.push_back(ObserverNode(callback, USER_TEST, 0));
97 dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
98 int res = dataObsMgrInner->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
99 EXPECT_EQ(res, OBS_EXIST);
100 }
101
102 /*
103 * Feature: DataObsMgrInnerPref
104 * Function: Register function test
105 * SubFunction: HandleRegisterObserver
106 * FunctionPoints: NA
107 * EnvConditions: NA
108 * CaseDescription:NA
109 */
110 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0300, TestSize.Level1)
111 {
112 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
113 Uri uri("sharepreferences://data/preferences/preferences_test");
114 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
115 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
116 const sptr<IDataAbilityObserver> callback1(new (std::nothrow) DataAbilityObserverProxy(observer));
117 ObsListType obsList;
118 obsList.push_back(ObserverNode(callback1, USER_TEST, 0));
119 dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
120 int res = dataObsMgrInner->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
121 EXPECT_EQ(res, OBS_EXIST);
122 }
123
124 /*
125 * Feature: DataObsMgrInnerPref
126 * Function: Register function test
127 * SubFunction: HandleRegisterObserver
128 * FunctionPoints: NA
129 * EnvConditions: NA
130 * CaseDescription: Register max observer
131 */
132 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0400, TestSize.Level1)
133 {
134 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
135 Uri uri("sharepreferences://data/preferences/preferences_test");
136 int res = 0;
137
138 int times = DataObsMgrInnerPref::OBS_NUM_MAX;
139 for (int i = 0; i <= times; i++) {
140 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
141 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
142 res = dataObsMgrInner->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
143 EXPECT_EQ(res, NO_ERROR);
144 }
145 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
146 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
147 res = dataObsMgrInner->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
148 EXPECT_EQ(res, DATAOBS_SERVICE_OBS_LIMMIT);
149
150 // other token success
151 sptr<MockDataAbilityObserverStub> observer2(new (std::nothrow) MockDataAbilityObserverStub());
152 const sptr<IDataAbilityObserver> callback2(new (std::nothrow) DataAbilityObserverProxy(observer));
153 res = dataObsMgrInner->HandleRegisterObserver(uri, ObserverNode(callback2, USER_TEST, 1));
154 EXPECT_EQ(res, NO_ERROR);
155
156 // other uri success
157 Uri uri2("sharepreferences://data/preferences/preferences_test/2");
158 sptr<MockDataAbilityObserverStub> observer3(new (std::nothrow) MockDataAbilityObserverStub());
159 const sptr<IDataAbilityObserver> callback3(new (std::nothrow) DataAbilityObserverProxy(observer3));
160 res = dataObsMgrInner->HandleRegisterObserver(uri2, ObserverNode(callback3, USER_TEST, 0));
161 EXPECT_EQ(res, NO_ERROR);
162 }
163
164 /*
165 * Feature: DataObsMgrInnerPref
166 * Function: Register function test
167 * SubFunction: HandleRegisterObserver
168 * FunctionPoints: NA
169 * EnvConditions: NA
170 * CaseDescription: RegisterObserver max limit times
171 */
172 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0500, TestSize.Level1)
173 {
174 TAG_LOGE(AAFwkTag::DBOBSMGR, "DataObsMgrInnerPref_HandleRegisterObserver_0500::Start");
175 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
176 Uri uri("sharepreferences://data/preferences/preferences_test");
177 for (int token = 0; token < DataObsMgrInnerPref::OBS_NUM_MAX; token++) {
178 for (int i = 0; i < DataObsMgrInnerPref::OBS_NUM_MAX; i++) {
179 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
180 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
181 int res = dataObsMgrInner->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, token));
182 EXPECT_EQ(res, NO_ERROR);
183 }
184 }
185 int token = DataObsMgrInnerPref::OBS_NUM_MAX +1;
186 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
187 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
188 int res = dataObsMgrInner->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, token));
189 EXPECT_EQ(res, DATAOBS_SERVICE_OBS_LIMMIT);
190 TAG_LOGE(AAFwkTag::DBOBSMGR, "DataObsMgrInnerPref_HandleRegisterObserver_0500::End");
191 }
192
193 /*
194 * Feature: DataObsMgrInnerPref
195 * Function: Unregister function test
196 * SubFunction: HandleUnregisterObserver
197 * FunctionPoints: NA
198 * EnvConditions: NA
199 * CaseDescription:NA
200 */
201 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleUnregisterObserver_0100, TestSize.Level1)
202 {
203 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
204 Uri uri("sharepreferences://data/preferences/preferences_test");
205 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
206 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
207 dataObsMgrInner->observers_.clear();
208 int res = dataObsMgrInner->HandleUnregisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
209 EXPECT_EQ(res, NO_OBS_FOR_URI);
210 }
211
212 /*
213 * Feature: DataObsMgrInnerPref
214 * Function: Unregister function test
215 * SubFunction: HandleUnregisterObserver
216 * FunctionPoints: NA
217 * EnvConditions: NA
218 * CaseDescription:NA
219 */
220 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleUnregisterObserver_0200, TestSize.Level1)
221 {
222 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
223 Uri uri("sharepreferences://data/preferences/preferences_test");
224 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
225 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
226 ObsListType obsList;
227 obsList.push_back(ObserverNode(callback, USER_TEST, 0));
228 dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
229 int res = dataObsMgrInner->HandleUnregisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
230 EXPECT_EQ(res, NO_ERROR);
231 }
232
233 /*
234 * Feature: DataObsMgrInnerPref
235 * Function: Unregister function test
236 * SubFunction: HandleUnregisterObserver
237 * FunctionPoints: NA
238 * EnvConditions: NA
239 * CaseDescription:NA
240 */
241 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleUnregisterObserver_0300, TestSize.Level1)
242 {
243 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
244 Uri uri("sharepreferences://data/preferences/preferences_test");
245 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
246 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
247 const sptr<IDataAbilityObserver> callback2(new (std::nothrow) DataAbilityObserverProxy(observer));
248 ObsListType obsList;
249 obsList.push_back(ObserverNode(callback, USER_TEST, 0));
250 obsList.push_back(ObserverNode(callback2, USER_TEST, 0));
251 dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
252 dataObsMgrInner->observers_.emplace("exit", obsList);
253 int res = dataObsMgrInner->HandleUnregisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
254 EXPECT_EQ(res, NO_ERROR);
255 }
256
257 /*
258 * Feature: DataObsMgrInnerPref
259 * Function: Notify function test
260 * SubFunction: HandleNotifyChange
261 * FunctionPoints: When the data changes, call the OnChangePreferences function of the registered dataabilityobserver
262 * EnvConditions: NA
263 * CaseDescription:NA
264 */
265 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleNotifyChange_0100, TestSize.Level1)
266 {
267 if (dataObsMgrInnerPref_ == nullptr) {
268 return;
269 }
270 Uri uri("sharepreferences://data/preferences/preferences_test");
271 sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub(new (std::nothrow) MockDataAbilityObserverStub());
272
273 Uri notifyUri("sharepreferences://data/preferences/preferences_test?key");
274 dataObsMgrInnerPref_->HandleRegisterObserver(uri, ObserverNode(mockDataAbilityObserverStub, USER_TEST, 0));
275 dataObsMgrInnerPref_->HandleNotifyChange(notifyUri, USER_TEST);
276 EXPECT_EQ("key", mockDataAbilityObserverStub->key_);
277 }
278
279 /*
280 * Feature: DataObsMgrInnerPref
281 * Function: Notify function test
282 * SubFunction: HandleNotifyChange
283 * FunctionPoints: NA
284 * EnvConditions: NA
285 * CaseDescription:NA
286 */
287 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleNotifyChange_0200, TestSize.Level1)
288 {
289 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
290 Uri uri("sharepreferences://data/preferences/preferences_test?key");
291 dataObsMgrInner->observers_.clear();
292 int res = dataObsMgrInner->HandleNotifyChange(uri, USER_TEST);
293 EXPECT_EQ(res, NO_OBS_FOR_URI);
294 }
295
296 /*
297 * Feature: DataObsMgrInnerPref
298 * Function: Notify function test
299 * SubFunction: HandleNotifyChange
300 * FunctionPoints: NA
301 * EnvConditions: NA
302 * CaseDescription:NA
303 */
304 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleNotifyChange_0300, TestSize.Level1)
305 {
306 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
307 Uri uri("sharepreferences://data/preferences/preferences_test");
308 ObsListType obsList;
309 obsList.push_back(ObserverNode(nullptr, USER_TEST, 0));
310 dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
311 Uri notifyUri("sharepreferences://data/preferences/preferences_test?key");
312 int res = dataObsMgrInner->HandleNotifyChange(notifyUri, USER_TEST);
313 EXPECT_EQ(res, NO_ERROR);
314 }
315
316 /*
317 * Feature: DataObsMgrInnerPref
318 * Function: GetObsListFromMap/RemoveObs/HaveRegistered function test
319 * SubFunction: NA
320 * FunctionPoints: NA
321 * EnvConditions: NA
322 * CaseDescription:NA
323 */
324 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_RemoveObs_HaveRegistered_0100, TestSize.Level1)
325 {
326 if (dataObsMgrInnerPref_ == nullptr) {
327 return;
328 }
329 Uri uri("sharepreferences://data/preferences/preferences_test");
330 sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub(new (std::nothrow) MockDataAbilityObserverStub());
331 const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(mockDataAbilityObserverStub));
332 dataObsMgrInnerPref_->HandleRegisterObserver(uri, ObserverNode(callback, USER_TEST, 0));
333
334 sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub2(new (std::nothrow) MockDataAbilityObserverStub());
335 const sptr<IDataAbilityObserver> callback2(
336 new (std::nothrow) DataAbilityObserverProxy(mockDataAbilityObserverStub2));
337
338 dataObsMgrInnerPref_->HandleRegisterObserver(uri, ObserverNode(callback2, USER_TEST, 0));
339 auto obsPair = dataObsMgrInnerPref_->observers_.find(uri.ToString());
340 EXPECT_EQ((std::size_t)2, obsPair->second.size());
341 EXPECT_EQ(true, dataObsMgrInnerPref_->HaveRegistered(callback));
342 EXPECT_EQ(true, dataObsMgrInnerPref_->HaveRegistered(callback2));
343
344 dataObsMgrInnerPref_->RemoveObs(callback->AsObject());
345 EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback));
346 obsPair->second.clear();
347 obsPair = dataObsMgrInnerPref_->observers_.find(uri.ToString());
348 EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback));
349
350 dataObsMgrInnerPref_->RemoveObs(callback2->AsObject());
351 EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback2));
352 obsPair->second.clear();
353 obsPair = dataObsMgrInnerPref_->observers_.find(uri.ToString());
354 EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback2));
355 }
356
357 /*
358 * Feature: DataObsMgrInnerPref
359 * Function: AddObsDeathRecipient/RemoveObsDeathRecipient function test
360 * SubFunction: NA
361 * FunctionPoints: NA
362 * EnvConditions: NA
363 * CaseDescription:NA
364 */
365 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_AddRemove_ObsDeathRecipient_0100, TestSize.Level1)
366 {
367 if (dataObsMgrInnerPref_ == nullptr) {
368 return;
369 }
370
371 sptr<IRemoteObject> observer(new (std::nothrow) MockDataAbilityObserverStub());
372 sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
373 dataObsMgrInnerPref_->AddObsDeathRecipient(callback);
374 dataObsMgrInnerPref_->AddObsDeathRecipient(nullptr);
375
376 ObsRecipientMapType::const_iterator it;
377 it = dataObsMgrInnerPref_->obsRecipient_.find(observer);
378 EXPECT_EQ(true, it != dataObsMgrInnerPref_->obsRecipient_.end());
379
380 dataObsMgrInnerPref_->RemoveObsDeathRecipient(callback->AsObject());
381 dataObsMgrInnerPref_->RemoveObsDeathRecipient(nullptr);
382 it = dataObsMgrInnerPref_->obsRecipient_.find(observer);
383 EXPECT_EQ(false, it != dataObsMgrInnerPref_->obsRecipient_.end());
384
385 dataObsMgrInnerPref_->obsRecipient_.clear();
386 dataObsMgrInnerPref_->RemoveObsDeathRecipient(callback->AsObject());
387 }
388
389 /*
390 * Feature: DataObsMgrInnerPref
391 * Function: Unregister function test
392 * SubFunction: RemoveObs
393 * FunctionPoints: NA
394 * EnvConditions: NA
395 * CaseDescription:NA
396 */
397 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_RemoveObs_0100, TestSize.Level1)
398 {
399 std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
400 ASSERT_NE(dataObsMgrInner, nullptr);
401 std::string uri1 = "uri1";
402 std::string uri2 = "uri2";
403 sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
404 const sptr<IDataAbilityObserver> callback1(new (std::nothrow) DataAbilityObserverProxy(observer));
405 const sptr<IDataAbilityObserver> callback2(new (std::nothrow) DataAbilityObserverProxy(observer));
406 ObsListType obsList1;
407 ObsListType obsList2;
408 ObsListType obsList3;
409 obsList1.push_back(ObserverNode(callback1, USER_TEST, 0));
410 obsList2.push_back(ObserverNode(callback1, USER_TEST, 0));
411 obsList2.push_back(ObserverNode(callback2, USER_TEST, 0));
412 dataObsMgrInner->observers_.emplace(uri1, obsList1);
413 dataObsMgrInner->observers_.emplace(uri2, obsList2);
414 dataObsMgrInner->RemoveObs(callback2->AsObject());
415 }
416 } // namespace AAFwk
417 } // namespace OHOS
418