1 /*
2  * Copyright (c) 2021 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 "directory/directory_manager.h"
17 
18 #include <fstream>
19 #include <gtest/gtest.h>
20 
21 #include "accesstoken_kit.h"
22 #include "bootstrap.h"
23 #include "nativetoken_kit.h"
24 #include "types.h"
25 
26 using namespace testing::ext;
27 using namespace OHOS::DistributedData;
28 using namespace OHOS::DistributedKv;
29 using namespace OHOS;
30 using namespace OHOS::Security::AccessToken;
31 
32 class DirectoryManagerTest : public testing::Test {
33 public:
SetUpTestCase()34     static void SetUpTestCase()
35     {
36         HapInfoParams info = {
37             .userID = 100, .bundleName = "ohos.test.demo", .instIndex = 0, .appIDDesc = "ohos.test.demo_09AEF01D"
38         };
39         HapPolicyParams policy = {
40             .apl = APL_NORMAL,
41             .domain = "test.domain",
42             .permList = {
43                 {
44                     .permissionName = "ohos.permission.test",
45                     .bundleName = "ohos.test.demo",
46                     .grantMode = 1,
47                     .availableLevel = APL_NORMAL,
48                     .label = "label",
49                     .labelId = 1,
50                     .description = "open the door",
51                     .descriptionId = 1
52                 }
53             },
54             .permStateList = {
55                 {
56                     .permissionName = "ohos.permission.test",
57                     .isGeneral = true,
58                     .resDeviceID = { "local" },
59                     .grantStatus = { PermissionState::PERMISSION_GRANTED },
60                     .grantFlags = { 1 }
61                 }
62             }
63         };
64         AccessTokenKit::AllocHapToken(info, policy);
65     }
TearDownTestCase()66     static void TearDownTestCase()
67     {
68         auto tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
69         AccessTokenKit::DeleteToken(tokenId);
70     }
SetUp()71     void SetUp()
72     {
73         tokenParam_.processName = "DirectoryManagerTest";
74         tokenParam_.aplStr = "system_core";
75 
76         Bootstrap::GetInstance().LoadDirectory();
77     }
TearDown()78     void TearDown() {}
79 
80 protected:
81     NativeTokenInfoParams tokenParam_  {0};
82 };
83 
84 /**
85 * @tc.name: GetBundleStorePath
86 * @tc.desc: test get kv db dir
87 * @tc.type: FUNC
88 * @tc.require:
89 * @tc.author: Sven Wang
90 */
HWTEST_F(DirectoryManagerTest, GetBundleStorePath, TestSize.Level0)91 HWTEST_F(DirectoryManagerTest, GetBundleStorePath, TestSize.Level0)
92 {
93     StoreMetaData metaData;
94     metaData.user = "100";
95     metaData.bundleName = "ohos.test.demo";
96     metaData.dataDir = "/data/app/el1/100/database/ohos.test.demo/kvdb";
97     metaData.securityLevel = SecurityLevel::S2;
98     metaData.area = 1;
99     metaData.tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.test.demo", 0);
100     metaData.storeType = KvStoreType::SINGLE_VERSION;
101     HapTokenInfo tokenInfo;
102     AccessTokenKit::GetHapTokenInfo(metaData.tokenId, tokenInfo);
103     metaData.appId = tokenInfo.appID;
104     auto path = DirectoryManager::GetInstance().GetStorePath(metaData);
105     EXPECT_EQ(path, metaData.dataDir);
106 }
107 
108 /**
109 * @tc.name: GetHapStorePath
110 * @tc.desc: test get kv db dir
111 * @tc.type: FUNC
112 * @tc.require:
113 * @tc.author: Sven Wang
114 */
HWTEST_F(DirectoryManagerTest, GetHapStorePath, TestSize.Level0)115 HWTEST_F(DirectoryManagerTest, GetHapStorePath, TestSize.Level0)
116 {
117     StoreMetaData metaData;
118     metaData.user = "100";
119     metaData.bundleName = "com.sample.helloworld";
120     metaData.hapName = "example.hap";
121     metaData.dataDir = "/data/app/el2/100/database/com.sample.helloworld/example.hap/kvdb";
122     metaData.securityLevel = SecurityLevel::S2;
123     metaData.area = 2;
124     metaData.storeType = KvStoreType::SINGLE_VERSION;
125     auto path = DirectoryManager::GetInstance().GetStorePath(metaData);
126     EXPECT_EQ(path, metaData.dataDir);
127 }
128 
129 /**
130 * @tc.name: GetSaStorePath
131 * @tc.desc: test get kv db dir
132 * @tc.type: FUNC
133 * @tc.require:
134 * @tc.author: Sven Wang
135 */
HWTEST_F(DirectoryManagerTest, GetSaStorePath, TestSize.Level0)136 HWTEST_F(DirectoryManagerTest, GetSaStorePath, TestSize.Level0)
137 {
138     StoreMetaData metaData;
139     metaData.user = "0";
140     metaData.bundleName = "bundle_manager_service";
141     metaData.appId = "bundle_manager_service";
142     metaData.dataDir = "/data/service/el1/public/database/bundle_manager_service/kvdb";
143     metaData.securityLevel = SecurityLevel::S2;
144     metaData.area = 1;
145     metaData.tokenId = GetAccessTokenId(&tokenParam_);
146     metaData.storeType = KvStoreType::SINGLE_VERSION;
147     auto path = DirectoryManager::GetInstance().GetStorePath(metaData);
148     EXPECT_EQ(path, metaData.dataDir);
149 }
150 
151 /**
152 * @tc.name: GetRdbBackupPath
153 * @tc.desc: test get rdb backup dir
154 * @tc.type: FUNC
155 * @tc.require:
156 * @tc.author: Sven Wang
157 */
HWTEST_F(DirectoryManagerTest, GetRDBBackupPath, TestSize.Level0)158 HWTEST_F(DirectoryManagerTest, GetRDBBackupPath, TestSize.Level0)
159 {
160     StoreMetaData metaData;
161     metaData.user = "10";
162     metaData.bundleName = "ohos.test.demo";
163     metaData.dataDir = "/data/app/el1/10/database/ohos.test.demo";
164     metaData.securityLevel = SecurityLevel::S2;
165     metaData.area = 1;
166     metaData.storeType = 10;
167     metaData.tokenId = AccessTokenKit::GetHapTokenID(10, "ohos.test.demo", 0);
168     HapTokenInfo tokenInfo;
169     AccessTokenKit::GetHapTokenInfo(metaData.tokenId, tokenInfo);
170     metaData.appId = tokenInfo.appID;
171     metaData.storeId = "testStpre";
172     auto path = DirectoryManager::GetInstance().GetStoreBackupPath(metaData);
173     EXPECT_EQ(path, metaData.dataDir + "/rdb/backup/testStpre");
174 }
175 /**
176 * @tc.name: GetKVDBBackupPath
177 * @tc.desc: test get kv db backup dir
178 * @tc.type: FUNC
179 * @tc.require:
180 * @tc.author: baoyayong
181 */
HWTEST_F(DirectoryManagerTest, GetKVDBBackupPath, TestSize.Level0)182 HWTEST_F(DirectoryManagerTest, GetKVDBBackupPath, TestSize.Level0)
183 {
184     StoreMetaData metaData;
185     metaData.user = "10";
186     metaData.bundleName = "ohos.test.demo";
187     metaData.dataDir = "/data/app/el1/10/database/ohos.test.demo/kvdb";
188     metaData.securityLevel = SecurityLevel::S2;
189     metaData.area = 1;
190     metaData.storeType = 0;
191     metaData.tokenId = AccessTokenKit::GetHapTokenID(10, "ohos.test.demo", 0);
192     HapTokenInfo tokenInfo;
193     AccessTokenKit::GetHapTokenInfo(metaData.tokenId, tokenInfo);
194     metaData.appId = tokenInfo.appID;
195     metaData.storeId = "testStpre";
196     auto path = DirectoryManager::GetInstance().GetStoreBackupPath(metaData);
197     EXPECT_EQ(path, metaData.dataDir + "/backup/testStpre");
198 }
199 
200 /**
201 * @tc.name: GetStorageMetaPath
202 * @tc.desc: test get meta store dir
203 * @tc.type: FUNC
204 * @tc.require:
205 * @tc.author: Sven Wang
206 */
HWTEST_F(DirectoryManagerTest, GetStorageMetaPath, TestSize.Level0)207 HWTEST_F(DirectoryManagerTest, GetStorageMetaPath, TestSize.Level0)
208 {
209     auto path = DirectoryManager::GetInstance().GetMetaStorePath();
210     EXPECT_EQ(path, "/data/service/el1/public/database/distributeddata/meta");
211 }
212 
213 /**
214 * @tc.name: GetSecretKeyPath
215 * @tc.desc: test get secret key path
216 * @tc.type: FUNC
217 * @tc.require:
218 * @tc.author:
219 */
HWTEST_F(DirectoryManagerTest, GetSecretKeyPath, TestSize.Level0)220 HWTEST_F(DirectoryManagerTest, GetSecretKeyPath, TestSize.Level0)
221 {
222     StoreMetaData metaData;
223     metaData.user = "0";
224     metaData.bundleName = "bundle_manager_service";
225     metaData.appId = "bundle_manager_service";
226     metaData.dataDir = "/data/service/el1/public/database/bundle_manager_service/kvdb";
227     metaData.securityLevel = SecurityLevel::S2;
228     metaData.area = 1;
229     metaData.tokenId = GetAccessTokenId(&tokenParam_);
230     metaData.storeType = KvStoreType::SINGLE_VERSION;
231     auto version = DirectoryManager::GetInstance().GetVersions();
232     EXPECT_NE(sizeof(version), 0);
233     auto path = DirectoryManager::GetInstance().GetSecretKeyPath(metaData);
234     EXPECT_EQ(path, "/data/service/el1/public/database/bundle_manager_service/kvdb/secret");
235 }
236 
237 /**
238 * @tc.name: DeleteDirectory
239 * @tc.desc: test delete dir
240 * @tc.type: FUNC
241 * @tc.require:
242 * @tc.author:
243 */
HWTEST_F(DirectoryManagerTest, DeleteDirectory, TestSize.Level0)244 HWTEST_F(DirectoryManagerTest, DeleteDirectory, TestSize.Level0)
245 {
246     std::string path = "/data/service/el1/public/database/bundle_manager_service/kvdb/100/data";
247     bool ret = DirectoryManager::GetInstance().CreateDirectory(path);
248     EXPECT_TRUE(ret);
249     std::ofstream file(
250         "/data/service/el1/public/database/bundle_manager_service/kvdb/100/data/test.txt", std::ios::out);
251     if (file.is_open()) {
252         file << "test content" << std::endl;
253         file.close();
254     }
255     std::ofstream file1("/data/service/el1/public/database/bundle_manager_service/kvdb/100/test.txt", std::ios::out);
256     if (file1.is_open()) {
257         file1 << "test content" << std::endl;
258         file1.close();
259     }
260     std::string deleteDir = "/data/service/el1/public/database/bundle_manager_service/kvdb/100";
261     bool ret1 = DirectoryManager::GetInstance().DeleteDirectory(deleteDir.c_str());
262     EXPECT_TRUE(ret1);
263     EXPECT_EQ(access(deleteDir.c_str(), F_OK), -1);
264 }