• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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