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
16 #include "accesstoken_kit.h"
17 #include "bootstrap.h"
18 #include "device_manager_adapter.h"
19 #include "kvstore_meta_manager.h"
20 #include "metadata/meta_data_manager.h"
21 #include "metadata/store_meta_data.h"
22 #include "nativetoken_kit.h"
23 #include "session_manager/route_head_handler_impl.h"
24 #include "session_manager/upgrade_manager.h"
25 #include "token_setproc.h"
26 #include "user_delegate.h"
27 #include "gtest/gtest.h"
28
29 namespace {
30 using namespace testing::ext;
31 using namespace OHOS::DistributedKv;
32 using namespace OHOS::DistributedData;
33 using namespace OHOS;
34 using namespace OHOS::Security::AccessToken;
35 constexpr const char *PEER_DEVICE_ID = "PEER_DEVICE_ID";
36 constexpr int PEER_USER_ID1 = 101;
37 constexpr int PEER_USER_ID2 = 100;
GrantPermissionNative()38 void GrantPermissionNative()
39 {
40 const char *perms[2] = {
41 "ohos.permission.DISTRIBUTED_DATASYNC",
42 "ohos.permission.ACCESS_SERVICE_DM"
43 };
44 TokenInfoParams infoInstance = {
45 .dcapsNum = 0,
46 .permsNum = 2,
47 .aclsNum = 0,
48 .dcaps = nullptr,
49 .perms = perms,
50 .acls = nullptr,
51 .processName = "distributed_data_test",
52 .aplStr = "system_basic",
53 };
54 uint64_t tokenId = GetAccessTokenId(&infoInstance);
55 SetSelfTokenID(tokenId);
56 AccessTokenKit::ReloadNativeTokenInfo();
57 }
58 class SessionManagerTest : public testing::Test {
59 public:
SetUpTestCase()60 static void SetUpTestCase()
61 {
62 auto executors = std::make_shared<ExecutorPool>(12, 5);
63 Bootstrap::GetInstance().LoadComponents();
64 Bootstrap::GetInstance().LoadDirectory();
65 Bootstrap::GetInstance().LoadCheckers();
66 KvStoreMetaManager::GetInstance().BindExecutor(executors);
67 KvStoreMetaManager::GetInstance().InitMetaParameter();
68 KvStoreMetaManager::GetInstance().InitMetaListener();
69 DeviceManagerAdapter::GetInstance().Init(executors);
70
71 // init peer device
72 UserMetaData userMetaData;
73 userMetaData.deviceId = PEER_DEVICE_ID;
74
75 UserStatus status;
76 status.isActive = true;
77 status.id = PEER_USER_ID1;
78 userMetaData.users = { status };
79 status.id = PEER_USER_ID2;
80 userMetaData.users.emplace_back(status);
81
82 auto peerUserMetaKey = UserMetaRow::GetKeyFor(userMetaData.deviceId);
83 MetaDataManager::GetInstance().SaveMeta({ peerUserMetaKey.begin(), peerUserMetaKey.end() }, userMetaData);
84
85 CapMetaData capMetaData;
86 capMetaData.version = CapMetaData::CURRENT_VERSION;
87
88 auto peerCapMetaKey = CapMetaRow::GetKeyFor(userMetaData.deviceId);
89 MetaDataManager::GetInstance().SaveMeta({ peerCapMetaKey.begin(), peerCapMetaKey.end() }, capMetaData);
90
91 StoreMetaData metaData;
92 metaData.bundleName = "ohos.test.demo";
93 metaData.storeId = "test_store";
94 metaData.user = "100";
95 metaData.deviceId = DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid;
96 metaData.tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
97 metaData.uid = 2000000;
98 metaData.storeType = 1;
99 MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData);
100 GrantPermissionNative();
101 }
TearDownTestCase()102 static void TearDownTestCase()
103 {
104 auto peerUserMetaKey = UserMetaRow::GetKeyFor(PEER_DEVICE_ID);
105 MetaDataManager::GetInstance().DelMeta(std::string(peerUserMetaKey.begin(), peerUserMetaKey.end()));
106 auto peerCapMetaKey = CapMetaRow::GetKeyFor(PEER_DEVICE_ID);
107 MetaDataManager::GetInstance().DelMeta(std::string(peerCapMetaKey.begin(), peerCapMetaKey.end()));
108 StoreMetaData metaData;
109 metaData.bundleName = "ohos.test.demo";
110 metaData.storeId = "test_store";
111 metaData.user = "100";
112 metaData.deviceId = DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid;
113 metaData.tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
114 metaData.uid = 2000000;
115 metaData.storeType = 1;
116 MetaDataManager::GetInstance().DelMeta(metaData.GetKey());
117 }
SetUp()118 void SetUp()
119 {
120 }
TearDown()121 void TearDown()
122 {
123 }
124 };
125
126 /**
127 * @tc.name: PackAndUnPack01
128 * @tc.desc: test get db dir
129 * @tc.type: FUNC
130 * @tc.require:
131 * @tc.author: illybyy
132 */
133 HWTEST_F(SessionManagerTest, PackAndUnPack01, TestSize.Level2)
134 {
135 const DistributedDB::ExtendInfo info = {
136 .appId = "ohos.test.demo", .storeId = "test_store", .userId = "100", .dstTarget = PEER_DEVICE_ID
137 };
138 auto sendHandler = RouteHeadHandlerImpl::Create(info);
139 ASSERT_NE(sendHandler, nullptr);
140 uint32_t routeHeadSize = 0;
141 sendHandler->GetHeadDataSize(routeHeadSize);
142 ASSERT_GT(routeHeadSize, 0);
143 std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(routeHeadSize);
144 sendHandler->FillHeadData(data.get(), routeHeadSize, routeHeadSize);
145
146 std::vector<std::string> users;
147 auto recvHandler = RouteHeadHandlerImpl::Create({});
148 ASSERT_NE(recvHandler, nullptr);
149 uint32_t parseSize = 1;
150 recvHandler->ParseHeadData(data.get(), routeHeadSize, parseSize, users);
151 EXPECT_EQ(routeHeadSize, parseSize);
152 ASSERT_EQ(users.size(), 1);
153 EXPECT_EQ(users[0], "100");
154 }
155 } // namespace