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