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