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 "uri.h"
20 #define private public
21 #include "data_ability_observer_proxy.h"
22 #include "dataobs_mgr_errors.h"
23 #include "dataobs_mgr_inner_pref.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 
31 namespace OHOS {
32 namespace AAFwk {
33 using Uri = OHOS::Uri;
34 using ObsListType = std::list<sptr<IDataAbilityObserver>>;
35 using ObsRecipientMapType = OHOS::AAFwk::DataObsMgrInnerPref::ObsRecipientMapType;
36 class DataObsMgrInnerPrefTest : 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<DataObsMgrInnerPref> dataObsMgrInnerPref_ = nullptr;
43 };
SetUpTestCase(void)44 void DataObsMgrInnerPrefTest::SetUpTestCase(void) {}
TearDownTestCase(void)45 void DataObsMgrInnerPrefTest::TearDownTestCase(void) {}
SetUp()46 void DataObsMgrInnerPrefTest::SetUp()
47 {
48     dataObsMgrInnerPref_ = std::make_shared<DataObsMgrInnerPref>();
49 }
TearDown()50 void DataObsMgrInnerPrefTest::TearDown() {}
51 
52 /*
53  * Feature: DataObsMgrInnerPref
54  * Function: Register and unregister function test
55  * SubFunction: HandleRegisterObserver/HandleRegisterObserver
56  * FunctionPoints: NA
57  * EnvConditions: NA
58  * CaseDescription:NA
59  */
60 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0100, TestSize.Level1)
61 {
62     if (dataObsMgrInnerPref_ == nullptr) {
63         return;
64     }
65 
66     Uri uri("sharepreferences://data/preferences/preferences_test");
67     sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
68 
69     const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
70     dataObsMgrInnerPref_->HandleRegisterObserver(uri, callback);
71 
72     EXPECT_EQ(dataObsMgrInnerPref_->HaveRegistered(callback), true);
73     dataObsMgrInnerPref_->HandleUnregisterObserver(uri, callback);
74     EXPECT_EQ(dataObsMgrInnerPref_->HaveRegistered(callback), false);
75 }
76 
77 /*
78  * Feature: DataObsMgrInnerPref
79  * Function: Register function test
80  * SubFunction: HandleRegisterObserver
81  * FunctionPoints: NA
82  * EnvConditions: NA
83  * CaseDescription:NA
84  */
85 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0200, TestSize.Level1)
86 {
87     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
88     Uri uri("sharepreferences://data/preferences/preferences_test");
89     sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
90     const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
91     ObsListType obsList;
92     obsList.push_back(callback);
93     dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
94     int res = dataObsMgrInner->HandleRegisterObserver(uri, callback);
95     EXPECT_EQ(res, OBS_EXIST);
96 }
97 
98 /*
99  * Feature: DataObsMgrInnerPref
100  * Function: Register function test
101  * SubFunction: HandleRegisterObserver
102  * FunctionPoints: NA
103  * EnvConditions: NA
104  * CaseDescription:NA
105  */
106 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleRegisterObserver_0300, TestSize.Level1)
107 {
108     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
109     Uri uri("sharepreferences://data/preferences/preferences_test");
110     sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
111     const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
112     const sptr<IDataAbilityObserver> callback1(new (std::nothrow) DataAbilityObserverProxy(observer));
113     ObsListType obsList;
114     obsList.push_back(callback1);
115     dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
116     int res = dataObsMgrInner->HandleRegisterObserver(uri, callback);
117     EXPECT_EQ(res, OBS_EXIST);
118 }
119 
120 /*
121  * Feature: DataObsMgrInnerPref
122  * Function: Unregister function test
123  * SubFunction: HandleUnregisterObserver
124  * FunctionPoints: NA
125  * EnvConditions: NA
126  * CaseDescription:NA
127  */
128 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleUnregisterObserver_0100, TestSize.Level1)
129 {
130     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
131     Uri uri("sharepreferences://data/preferences/preferences_test");
132     sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
133     const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
134     dataObsMgrInner->observers_.clear();
135     int res = dataObsMgrInner->HandleUnregisterObserver(uri, callback);
136     EXPECT_EQ(res, NO_OBS_FOR_URI);
137 }
138 
139 /*
140  * Feature: DataObsMgrInnerPref
141  * Function: Unregister function test
142  * SubFunction: HandleUnregisterObserver
143  * FunctionPoints: NA
144  * EnvConditions: NA
145  * CaseDescription:NA
146  */
147 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleUnregisterObserver_0200, TestSize.Level1)
148 {
149     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
150     Uri uri("sharepreferences://data/preferences/preferences_test");
151     sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
152     const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
153     ObsListType obsList;
154     obsList.push_back(callback);
155     dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
156     int res = dataObsMgrInner->HandleUnregisterObserver(uri, callback);
157     EXPECT_EQ(res, NO_ERROR);
158 }
159 
160 /*
161  * Feature: DataObsMgrInnerPref
162  * Function: Unregister function test
163  * SubFunction: HandleUnregisterObserver
164  * FunctionPoints: NA
165  * EnvConditions: NA
166  * CaseDescription:NA
167  */
168 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleUnregisterObserver_0300, TestSize.Level1)
169 {
170     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
171     Uri uri("sharepreferences://data/preferences/preferences_test");
172     sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
173     const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
174     const sptr<IDataAbilityObserver> callback2(new (std::nothrow) DataAbilityObserverProxy(observer));
175     ObsListType obsList;
176     obsList.push_back(callback);
177     obsList.push_back(callback2);
178     dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
179     dataObsMgrInner->observers_.emplace("exit", obsList);
180     int res = dataObsMgrInner->HandleUnregisterObserver(uri, callback);
181     EXPECT_EQ(res, NO_ERROR);
182 }
183 
184 /*
185  * Feature: DataObsMgrInnerPref
186  * Function: Notify function test
187  * SubFunction: HandleNotifyChange
188  * FunctionPoints: When the data changes, call the OnChangePreferences function of the registered dataabilityobserver
189  * EnvConditions: NA
190  * CaseDescription:NA
191  */
192 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleNotifyChange_0100, TestSize.Level1)
193 {
194     if (dataObsMgrInnerPref_ == nullptr) {
195         return;
196     }
197     Uri uri("sharepreferences://data/preferences/preferences_test");
198     sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub(new (std::nothrow) MockDataAbilityObserverStub());
199 
200     Uri notifyUri("sharepreferences://data/preferences/preferences_test?key");
201     dataObsMgrInnerPref_->HandleRegisterObserver(uri, mockDataAbilityObserverStub);
202     dataObsMgrInnerPref_->HandleNotifyChange(notifyUri);
203     EXPECT_EQ("key", mockDataAbilityObserverStub->key_);
204 }
205 
206 /*
207  * Feature: DataObsMgrInnerPref
208  * Function: Notify function test
209  * SubFunction: HandleNotifyChange
210  * FunctionPoints: NA
211  * EnvConditions: NA
212  * CaseDescription:NA
213  */
214 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleNotifyChange_0200, TestSize.Level1)
215 {
216     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
217     Uri uri("sharepreferences://data/preferences/preferences_test?key");
218     dataObsMgrInner->observers_.clear();
219     int res = dataObsMgrInner->HandleNotifyChange(uri);
220     EXPECT_EQ(res, NO_OBS_FOR_URI);
221 }
222 
223 /*
224  * Feature: DataObsMgrInnerPref
225  * Function: Notify function test
226  * SubFunction: HandleNotifyChange
227  * FunctionPoints: NA
228  * EnvConditions: NA
229  * CaseDescription:NA
230  */
231 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_HandleNotifyChange_0300, TestSize.Level1)
232 {
233     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
234     Uri uri("sharepreferences://data/preferences/preferences_test");
235     ObsListType obsList;
236     obsList.push_back(nullptr);
237     dataObsMgrInner->observers_.emplace(uri.ToString(), obsList);
238     Uri notifyUri("sharepreferences://data/preferences/preferences_test?key");
239     int res = dataObsMgrInner->HandleNotifyChange(notifyUri);
240     EXPECT_EQ(res, NO_ERROR);
241 }
242 
243 /*
244  * Feature: DataObsMgrInnerPref
245  * Function: GetObsListFromMap/RemoveObs/HaveRegistered function test
246  * SubFunction: NA
247  * FunctionPoints: NA
248  * EnvConditions: NA
249  * CaseDescription:NA
250  */
251 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_RemoveObs_HaveRegistered_0100, TestSize.Level1)
252 {
253     if (dataObsMgrInnerPref_ == nullptr) {
254         return;
255     }
256     Uri uri("sharepreferences://data/preferences/preferences_test");
257     sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub(new (std::nothrow) MockDataAbilityObserverStub());
258     const sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(mockDataAbilityObserverStub));
259     dataObsMgrInnerPref_->HandleRegisterObserver(uri, callback);
260 
261     sptr<MockDataAbilityObserverStub> mockDataAbilityObserverStub2(new (std::nothrow) MockDataAbilityObserverStub());
262     const sptr<IDataAbilityObserver> callback2(
263         new (std::nothrow) DataAbilityObserverProxy(mockDataAbilityObserverStub2));
264 
265     dataObsMgrInnerPref_->HandleRegisterObserver(uri, callback2);
266     auto obsPair = dataObsMgrInnerPref_->observers_.find(uri.ToString());
267     EXPECT_EQ((std::size_t)2, obsPair->second.size());
268     EXPECT_EQ(true, dataObsMgrInnerPref_->HaveRegistered(callback));
269     EXPECT_EQ(true, dataObsMgrInnerPref_->HaveRegistered(callback2));
270 
271     dataObsMgrInnerPref_->RemoveObs(callback->AsObject());
272     EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback));
273     obsPair->second.clear();
274     obsPair = dataObsMgrInnerPref_->observers_.find(uri.ToString());
275     EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback));
276 
277     dataObsMgrInnerPref_->RemoveObs(callback2->AsObject());
278     EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback2));
279     obsPair->second.clear();
280     obsPair = dataObsMgrInnerPref_->observers_.find(uri.ToString());
281     EXPECT_EQ(false, dataObsMgrInnerPref_->HaveRegistered(callback2));
282 }
283 
284 /*
285  * Feature: DataObsMgrInnerPref
286  * Function: AddObsDeathRecipient/RemoveObsDeathRecipient function test
287  * SubFunction: NA
288  * FunctionPoints: NA
289  * EnvConditions: NA
290  * CaseDescription:NA
291  */
292 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_AddRemove_ObsDeathRecipient_0100, TestSize.Level1)
293 {
294     if (dataObsMgrInnerPref_ == nullptr) {
295         return;
296     }
297 
298     sptr<IRemoteObject> observer(new (std::nothrow) MockDataAbilityObserverStub());
299     sptr<IDataAbilityObserver> callback(new (std::nothrow) DataAbilityObserverProxy(observer));
300     dataObsMgrInnerPref_->AddObsDeathRecipient(callback);
301     dataObsMgrInnerPref_->AddObsDeathRecipient(nullptr);
302 
303     ObsRecipientMapType::const_iterator it;
304     it = dataObsMgrInnerPref_->obsRecipient_.find(observer);
305     EXPECT_EQ(true, it != dataObsMgrInnerPref_->obsRecipient_.end());
306 
307     dataObsMgrInnerPref_->RemoveObsDeathRecipient(callback->AsObject());
308     dataObsMgrInnerPref_->RemoveObsDeathRecipient(nullptr);
309     it = dataObsMgrInnerPref_->obsRecipient_.find(observer);
310     EXPECT_EQ(false, it != dataObsMgrInnerPref_->obsRecipient_.end());
311 
312     dataObsMgrInnerPref_->obsRecipient_.clear();
313     dataObsMgrInnerPref_->RemoveObsDeathRecipient(callback->AsObject());
314 }
315 
316 /*
317  * Feature: DataObsMgrInnerPref
318  * Function: Unregister function test
319  * SubFunction: RemoveObs
320  * FunctionPoints: NA
321  * EnvConditions: NA
322  * CaseDescription:NA
323  */
324 HWTEST_F(DataObsMgrInnerPrefTest, DataObsMgrInnerPref_RemoveObs_0100, TestSize.Level1)
325 {
326     std::shared_ptr<DataObsMgrInnerPref> dataObsMgrInner = std::make_shared<DataObsMgrInnerPref>();
327     ASSERT_NE(dataObsMgrInner, nullptr);
328     std::string uri1 = "uri1";
329     std::string uri2 = "uri2";
330     sptr<MockDataAbilityObserverStub> observer(new (std::nothrow) MockDataAbilityObserverStub());
331     const sptr<IDataAbilityObserver> callback1(new (std::nothrow) DataAbilityObserverProxy(observer));
332     const sptr<IDataAbilityObserver> callback2(new (std::nothrow) DataAbilityObserverProxy(observer));
333     ObsListType obsList1;
334     ObsListType obsList2;
335     ObsListType obsList3;
336     obsList1.push_back(callback1);
337     obsList2.push_back(callback1);
338     obsList2.push_back(callback2);
339     dataObsMgrInner->observers_.emplace(uri1, obsList1);
340     dataObsMgrInner->observers_.emplace(uri2, obsList2);
341     dataObsMgrInner->RemoveObs(callback2->AsObject());
342 }
343 }  // namespace AAFwk
344 }  // namespace OHOS
345