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