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