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