1 /*
2 * Copyright (c) 2022 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 "device_matrix.h"
16
17 #include "block_data.h"
18 #include "device_manager_adapter.h"
19 #include "eventcenter/event_center.h"
20 #include "feature/feature_system.h"
21 #include "gtest/gtest.h"
22 #include "ipc_skeleton.h"
23 #include "matrix_event.h"
24 #include "metadata/meta_data_manager.h"
25 #include "metadata/store_meta_data_local.h"
26 #include "mock/db_store_mock.h"
27 #include "types.h"
28 using namespace testing::ext;
29 using namespace OHOS::DistributedData;
30 using namespace OHOS::DistributedKv;
31 using namespace OHOS;
32 using DMAdapter = DeviceManagerAdapter;
33 using namespace DistributedDB;
34 class DeviceMatrixTest : public testing::Test {
35 public:
36 static void SetUpTestCase(void);
37 static void TearDownTestCase(void);
38 void SetUp();
39 void TearDown();
40 protected:
41 struct Result {
42 uint16_t mask_ = MatrixMetaData::DEFAULT_MASK;
43 std::string deviceId_;
ResultDeviceMatrixTest::Result44 Result() {};
45 };
46 static constexpr const char *TEST_DEVICE = "14a0a92a428005db27c40bad46bf145fede38ec37effe0347cd990fcb031f320";
47 static constexpr const char *TEST_BUNDLE = "matrix_test";
48 static constexpr const char *TEST_STORE = "matrix_store";
49 static constexpr const char *TEST_USER = "0";
50 void InitRemoteMatrixMeta();
51 void InitMetaData();
52
53 static BlockData<Result> isFinished_;
54 static std::shared_ptr<DBStoreMock> dbStoreMock_;
55 static uint32_t selfToken_;
56 StoreMetaData metaData_;
57 StoreMetaDataLocal localMeta_;
58 };
59 BlockData<DeviceMatrixTest::Result> DeviceMatrixTest::isFinished_(1, Result());
60 std::shared_ptr<DBStoreMock> DeviceMatrixTest::dbStoreMock_ = std::make_shared<DBStoreMock>();
61 uint32_t DeviceMatrixTest::selfToken_ = 0;
SetUpTestCase(void)62 void DeviceMatrixTest::SetUpTestCase(void)
63 {
64 MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr);
65 MetaDataManager::GetInstance().SetSyncer([](const auto &, auto) {
66 DeviceMatrix::GetInstance().OnChanged(DeviceMatrix::META_STORE_MASK);
67 });
68 selfToken_ = IPCSkeleton::GetCallingTokenID();
69 FeatureSystem::GetInstance().GetCreator("kv_store")();
70 DeviceMatrix::GetInstance().Initialize(selfToken_, "service_meta");
71 EventCenter::GetInstance().Subscribe(DeviceMatrix::MATRIX_ONLINE, [](const Event &event) {
72 auto &evt = static_cast<const MatrixEvent &>(event);
73 auto mask = evt.GetMask();
74 auto deviceId = evt.GetDeviceId();
75 if ((mask & DeviceMatrix::META_STORE_MASK) != 0) {
76 auto onComplete = [deviceId](const std::map<std::string, DBStatus> &) {
77 DeviceMatrix::GetInstance().OnExchanged(deviceId, DeviceMatrix::META_STORE_MASK);
78 };
79 dbStoreMock_->Sync({ deviceId }, SYNC_MODE_PUSH_PULL, onComplete, false);
80 }
81 #ifdef TEST_ON_DEVICE
82 auto finEvent = std::make_unique<MatrixEvent>(DeviceMatrix::MATRIX_META_FINISHED, deviceId, mask);
83 EventCenter::GetInstance().PostEvent(std::move(finEvent));
84 #endif
85 });
86
87 EventCenter::GetInstance().Subscribe(DeviceMatrix::MATRIX_META_FINISHED, [](const Event &event) {
88 auto &evt = static_cast<const MatrixEvent &>(event);
89 Result result;
90 result.deviceId_ = evt.GetDeviceId();
91 result.mask_ = evt.GetMask();
92 isFinished_.SetValue(result);
93 });
94
95 mkdir("/data/service/el1/public/database/matrix_test", (S_IRWXU | S_IRWXG | S_IRWXO));
96 mkdir("/data/service/el1/public/database/matrix_test/kvdb", (S_IRWXU | S_IRWXG | S_IRWXO));
97 }
98
TearDownTestCase(void)99 void DeviceMatrixTest::TearDownTestCase(void)
100 {
101 EventCenter::GetInstance().Unsubscribe(DeviceMatrix::MATRIX_ONLINE);
102 EventCenter::GetInstance().Unsubscribe(DeviceMatrix::MATRIX_META_FINISHED);
103 EventCenter::GetInstance().Unsubscribe(DeviceMatrix::MATRIX_BROADCAST);
104 }
105
SetUp()106 void DeviceMatrixTest::SetUp()
107 {
108 isFinished_.Clear(Result());
109 DeviceMatrix::GetInstance().Clear();
110 InitMetaData();
111 InitRemoteMatrixMeta();
112 }
113
TearDown()114 void DeviceMatrixTest::TearDown()
115 {
116 (void)remove("/data/service/el1/public/database/matrix_test/kvdb");
117 (void)remove("/data/service/el1/public/database/matrix_test");
118 }
119
InitRemoteMatrixMeta()120 void DeviceMatrixTest::InitRemoteMatrixMeta()
121 {
122 MatrixMetaData metaData;
123 metaData.version = 1;
124 metaData.mask = 0xF;
125 metaData.deviceId = TEST_DEVICE;
126 metaData.maskInfo = { "distributed_device_profile_service", "bundle_manager_service",
127 "dtbhardware_manager_service" };
128 MetaDataManager::GetInstance().DelMeta(metaData.GetKey());
129 MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData);
130 }
131
InitMetaData()132 void DeviceMatrixTest::InitMetaData()
133 {
134 metaData_.deviceId = DMAdapter::GetInstance().GetLocalDevice().uuid;
135 metaData_.appId = TEST_BUNDLE;
136 metaData_.bundleName = TEST_BUNDLE;
137 metaData_.user = TEST_USER;
138 metaData_.area = EL1;
139 metaData_.tokenId = IPCSkeleton::GetCallingTokenID();
140 metaData_.instanceId = 0;
141 metaData_.isAutoSync = true;
142 metaData_.storeType = true;
143 metaData_.storeId = TEST_STORE;
144 PolicyValue value;
145 value.type = PolicyType::IMMEDIATE_SYNC_ON_ONLINE;
146 localMeta_.policies = { std::move(value) };
147 }
148
149 /**
150 * @tc.name: FirstOnline
151 * @tc.desc: the first online time;
152 * @tc.type: FUNC
153 * @tc.require:
154 * @tc.author: blue sky
155 */
156 HWTEST_F(DeviceMatrixTest, FirstOnline, TestSize.Level0)
157 {
158 DeviceMatrix::GetInstance().Online(TEST_DEVICE);
159 auto result = isFinished_.GetValue();
160 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
161 ASSERT_EQ(result.mask_, 0xF);
162 }
163
164 /**
165 * @tc.name: OnlineAgainNoData
166 * @tc.desc: the second online with no data change;
167 * @tc.type: FUNC
168 * @tc.require:
169 * @tc.author: blue sky
170 */
171 HWTEST_F(DeviceMatrixTest, OnlineAgainNoData, TestSize.Level0)
172 {
173 DeviceMatrix::GetInstance().Online(TEST_DEVICE);
174 auto result = isFinished_.GetValue();
175 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
176 ASSERT_EQ(result.mask_, 0xF);
177 isFinished_.Clear(Result());
178 DeviceMatrix::GetInstance().Offline(TEST_DEVICE);
179 DeviceMatrix::GetInstance().Online(TEST_DEVICE);
180 result = isFinished_.GetValue();
181 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
182 ASSERT_EQ(result.mask_, 0xE);
183 }
184
185 /**
186 * @tc.name: OnlineAgainWithData
187 * @tc.desc: the second online with sync data change;
188 * @tc.type: FUNC
189 * @tc.require:
190 * @tc.author: blue sky
191 */
192 HWTEST_F(DeviceMatrixTest, OnlineAgainWithData, TestSize.Level0)
193 {
194 DeviceMatrix::GetInstance().Online(TEST_DEVICE);
195 auto result = isFinished_.GetValue();
196 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
197 ASSERT_EQ(result.mask_, 0xF);
198 isFinished_.Clear(Result());
199 DeviceMatrix::GetInstance().Offline(TEST_DEVICE);
200 MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_);
201 DeviceMatrix::GetInstance().Online(TEST_DEVICE);
202 result = isFinished_.GetValue();
203 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
204 ASSERT_EQ(result.mask_, 0xF);
205 }
206
207 /**
208 * @tc.name: OnlineAgainWithLocal
209 * @tc.desc: the second online with local data change;
210 * @tc.type: FUNC
211 * @tc.require:
212 * @tc.author: blue sky
213 */
214 HWTEST_F(DeviceMatrixTest, OnlineAgainWithLocal, TestSize.Level0)
215 {
216 DeviceMatrix::GetInstance().Online(TEST_DEVICE);
217 auto result = isFinished_.GetValue();
218 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
219 ASSERT_EQ(result.mask_, 0xF);
220 isFinished_.Clear(Result());
221 DeviceMatrix::GetInstance().Offline(TEST_DEVICE);
222 MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta_, true);
223 DeviceMatrix::GetInstance().Online(TEST_DEVICE);
224 result = isFinished_.GetValue();
225 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
226 ASSERT_EQ(result.mask_, 0xE);
227 }
228
229 /**
230 * @tc.name: GetMetaStoreCode
231 * @tc.desc: get the meta data store mask code;
232 * @tc.type: FUNC
233 * @tc.require:
234 * @tc.author: blue sky
235 */
236 HWTEST_F(DeviceMatrixTest, GetMetaStoreCode, TestSize.Level0)
237 {
238 StoreMetaData meta;
239 meta.bundleName = "distributeddata";
240 meta.tokenId = selfToken_;
241 meta.storeId = "service_meta";
242 auto code = DeviceMatrix::GetInstance().GetCode(meta);
243 ASSERT_EQ(code, DeviceMatrix::META_STORE_MASK);
244 }
245
246 /**
247 * @tc.name: GetDPCode
248 * @tc.desc: get the device profile store mask code;
249 * @tc.type: FUNC
250 * @tc.require:
251 * @tc.author: blue sky
252 */
253 HWTEST_F(DeviceMatrixTest, GetDPCode, TestSize.Level0)
254 {
255 StoreMetaData meta = metaData_;
256 meta.appId = "distributed_device_profile_service";
257 meta.bundleName = "distributed_device_profile_service";
258 auto code = DeviceMatrix::GetInstance().GetCode(meta);
259 ASSERT_EQ(code, 0x2);
260 }
261
262 /**
263 * @tc.name: GetOtherStoreCode
264 * @tc.desc: get the other store mask code;
265 * @tc.type: FUNC
266 * @tc.require:
267 * @tc.author: blue sky
268 */
269 HWTEST_F(DeviceMatrixTest, GetOtherStoreCode, TestSize.Level0)
270 {
271 StoreMetaData meta = metaData_;
272 auto code = DeviceMatrix::GetInstance().GetCode(meta);
273 ASSERT_EQ(code, 0);
274 }
275
276 /**
277 * @tc.name: BroadcastMeta
278 * @tc.desc: broadcast the meta store change;
279 * @tc.type: FUNC
280 * @tc.require:
281 * @tc.author: blue sky
282 */
283 HWTEST_F(DeviceMatrixTest, BroadcastMeta, TestSize.Level0)
284 {
285 auto mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, DeviceMatrix::META_STORE_MASK);
286 ASSERT_EQ(mask, DeviceMatrix::META_STORE_MASK);
287 }
288
289 /**
290 * @tc.name: BroadcastDP
291 * @tc.desc: broadcast the device profile store change;
292 * @tc.type: FUNC
293 * @tc.require:
294 * @tc.author: blue sky
295 */
296 HWTEST_F(DeviceMatrixTest, BroadcastDP, TestSize.Level0)
297 {
298 StoreMetaData meta = metaData_;
299 meta.appId = "distributed_device_profile_service";
300 meta.bundleName = "distributed_device_profile_service";
301 auto code = DeviceMatrix::GetInstance().GetCode(meta);
302 auto mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, code);
303 ASSERT_EQ(mask, 0x2);
304 }
305
306 /**
307 * @tc.name: BroadcastOthers
308 * @tc.desc: broadcast the device profile store change;
309 * @tc.type: FUNC
310 * @tc.require:
311 * @tc.author: blue sky
312 */
313 HWTEST_F(DeviceMatrixTest, BroadcastOthers, TestSize.Level0)
314 {
315 StoreMetaData meta = metaData_;
316 auto code = DeviceMatrix::GetInstance().GetCode(meta);
317 auto mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, code);
318 ASSERT_EQ(mask, 0);
319 }
320
321 /**
322 * @tc.name: BroadcastAll
323 * @tc.desc: broadcast the all store change;
324 * @tc.type: FUNC
325 * @tc.require:
326 * @tc.author: blue sky
327 */
328 HWTEST_F(DeviceMatrixTest, BroadcastAll, TestSize.Level0)
329 {
330 auto mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, DeviceMatrix::META_STORE_MASK);
331 ASSERT_EQ(mask, DeviceMatrix::META_STORE_MASK);
332 StoreMetaData meta = metaData_;
333 meta.appId = "distributed_device_profile_service";
334 meta.bundleName = "distributed_device_profile_service";
335 auto code = DeviceMatrix::GetInstance().GetCode(meta);
336 mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, code);
337 ASSERT_EQ(mask, 0x3);
338 DeviceMatrix::GetInstance().OnExchanged(TEST_DEVICE, DeviceMatrix::META_STORE_MASK);
339 DeviceMatrix::GetInstance().OnExchanged(TEST_DEVICE, 0x2);
340
341 meta = metaData_;
342 code = DeviceMatrix::GetInstance().GetCode(meta);
343 mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, code);
344 ASSERT_EQ(mask, 0);
345
346 mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, 0xFFFF);
347 ASSERT_EQ(mask, 0xF);
348 }
349
350 /**
351 * @tc.name: UpdateMatrixMeta
352 * @tc.desc: update the remote matrix meta the all store change;
353 * @tc.type: FUNC
354 * @tc.require:
355 * @tc.author: blue sky
356 */
357 HWTEST_F(DeviceMatrixTest, UpdateMatrixMeta, TestSize.Level0)
358 {
359 MatrixMetaData metaData;
360 metaData.version = 3;
361 metaData.mask = 0x1F;
362 metaData.deviceId = TEST_DEVICE;
363 metaData.maskInfo = { TEST_BUNDLE, "distributed_device_profile_service" };
364 MetaDataManager::GetInstance().Subscribe(MatrixMetaData::GetPrefix({ TEST_DEVICE }),
__anond103d9540502(const std::string &, const std::string &value, int32_t flag) 365 [](const std::string &, const std::string &value, int32_t flag) {
366 if (flag != MetaDataManager::INSERT && flag != MetaDataManager::UPDATE) {
367 return true;
368 }
369 MatrixMetaData meta;
370 MatrixMetaData::Unmarshall(value, meta);
371 Result result;
372 result.deviceId_ = meta.deviceId;
373 isFinished_.SetValue(result);
374 return true;
375 });
376 MetaDataManager::GetInstance().DelMeta(metaData.GetKey());
377 MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData);
378
379 auto result = isFinished_.GetValue();
380 ASSERT_EQ(result.deviceId_, std::string(TEST_DEVICE));
381
382 auto mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, 0x2);
383 ASSERT_EQ(mask, 0);
384 mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, DeviceMatrix::META_STORE_MASK);
385 ASSERT_EQ(mask, DeviceMatrix::META_STORE_MASK);
386 mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, 0x4);
387 ASSERT_EQ(mask, 0x3);
388 DeviceMatrix::GetInstance().OnExchanged(TEST_DEVICE, DeviceMatrix::META_STORE_MASK);
389 DeviceMatrix::GetInstance().OnExchanged(TEST_DEVICE, 0x2);
390 mask = DeviceMatrix::GetInstance().OnBroadcast(TEST_DEVICE, 0xFFFF);
391 ASSERT_EQ(mask, 0x3);
392 MetaDataManager::GetInstance().Unsubscribe(MatrixMetaData::GetPrefix({ TEST_DEVICE }));
393 }