1 /*
2  * Copyright (c) 2023 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 <memory>
17 #include <vector>
18 
19 #include "gtest/gtest.h"
20 #include "bootstrap.h"
21 #include "accesstoken_kit.h"
22 #include "nativetoken_kit.h"
23 #include "token_setproc.h"
24 #include "types.h"
25 #include "device_manager_adapter.h"
26 #include "kvstore_data_service.h"
27 #include "kvstore_client_death_observer.h"
28 #include "metadata/meta_data_manager.h"
29 #include "metadata/store_meta_data.h"
30 #include "metadata/store_meta_data_local.h"
31 #include "metadata/appid_meta_data.h"
32 #include "metadata/secret_key_meta_data.h"
33 #include "feature/feature_system.h"
34 #include "hap_token_info.h"
35 
36 using namespace testing::ext;
37 using namespace OHOS;
38 using namespace OHOS::DistributedKv;
39 using namespace OHOS::Security::AccessToken;
40 using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter;
41 using MetaDataManager = OHOS::DistributedData::MetaDataManager;
42 using KvStoreDataService = OHOS::DistributedKv::KvStoreDataService;
43 namespace OHOS::Test {
44 class KvStoreDataServiceClearTest : public testing::Test {
45 public:
46     static void SetUpTestCase(void);
47     static void TearDownTestCase(void);
48     void SetUp();
49     void TearDown();
50 protected:
51     static constexpr const char *TEST_USER = "100";
52     static constexpr const char *TEST_BUNDLE = "ohos.test.demo";
53     static constexpr const char *TEST_STORE = "test_store";
54     static constexpr int32_t TEST_UID = 2000000;
55     static constexpr int32_t TEST_USERID = 100;
56     static constexpr const char *BUNDLE_NAME = "ohos.test.demo";
57     static constexpr int32_t USER_ID = 100;
58     static constexpr int32_t APP_INDEX = 0;
59     DistributedData::StoreMetaData metaData_;
60     DistributedData::StoreMetaDataLocal localMeta_;
61     void InitMetaData();
62 };
63 
SetUpTestCase(void)64 void KvStoreDataServiceClearTest::SetUpTestCase(void)
65 {
66 }
67 
TearDownTestCase(void)68 void KvStoreDataServiceClearTest::TearDownTestCase(void)
69 {
70 }
71 
SetUp(void)72 void KvStoreDataServiceClearTest::SetUp(void)
73 {
74     DistributedData::Bootstrap::GetInstance().LoadDirectory();
75     DistributedData::Bootstrap::GetInstance().LoadCheckers();
76 }
77 
TearDown(void)78 void KvStoreDataServiceClearTest::TearDown(void)
79 {
80 }
81 
InitMetaData()82 void KvStoreDataServiceClearTest::InitMetaData()
83 {
84     metaData_.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
85     metaData_.user = TEST_USER;
86     metaData_.bundleName = TEST_BUNDLE;
87     metaData_.storeId = TEST_STORE;
88     metaData_.appId = TEST_BUNDLE;
89     metaData_.tokenId = AccessTokenKit::GetHapTokenID(TEST_USERID, TEST_BUNDLE, 0);
90     metaData_.uid = TEST_UID;
91     metaData_.storeType = 1;
92     metaData_.area = EL1;
93     metaData_.instanceId = 0;
94     metaData_.isAutoSync = true;
95     metaData_.version = 1;
96     metaData_.appType = "default";
97     metaData_.dataDir = "/data/service/el1/public/database/kvstore_data_service_clear_test";
98 
99     DistributedData::PolicyValue value;
100     value.type = OHOS::DistributedKv::PolicyType::IMMEDIATE_SYNC_ON_ONLINE;
101     localMeta_.policies = { std::move(value) };
102 }
103 
104 /**
105  * @tc.name: ClearAppStorage001
106  * @tc.desc: The parameters are valid but have no metaData
107  * @tc.type: FUNC
108  * @tc.require:
109  * @tc.author: suoqilong
110  */
111 HWTEST_F(KvStoreDataServiceClearTest, ClearAppStorage001, TestSize.Level1)
112 {
113     auto kvDataService = OHOS::DistributedKv::KvStoreDataService();
114     auto tokenIdOk = AccessTokenKit::GetNativeTokenId("foundation");
115     SetSelfTokenID(tokenIdOk);
116     auto ret = kvDataService.ClearAppStorage(BUNDLE_NAME, USER_ID, APP_INDEX, tokenIdOk);
117     EXPECT_EQ(ret, Status::ERROR);
118 }
119 
120 /**
121  * @tc.name: ClearAppStorage002
122  * @tc.desc: Test that the cleanup is implemented
123  * @tc.type: FUNC
124  * @tc.require:
125  * @tc.author: suoqilong
126  */
127 HWTEST_F(KvStoreDataServiceClearTest, ClearAppStorage002, TestSize.Level1)
128 {
129     auto executors = std::make_shared<ExecutorPool>(2, 1);
130     // Create an object of the ExecutorPool class and pass 2 and 1 as arguments to the constructor of the class
131     KvStoreMetaManager::GetInstance().BindExecutor(executors);
132     KvStoreMetaManager::GetInstance().InitMetaParameter();
133     DmAdapter::GetInstance().Init(executors);
134     KvStoreMetaManager::GetInstance().InitMetaListener();
135 
136     InitMetaData();
137 
138     EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_));
139     EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, true));
140     EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), metaData_, true));
141     EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetStrategyKey(), metaData_));
142     EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.appId, metaData_, true));
143     EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta_, true));
144 
145     EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKey(), metaData_));
146     EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetSecretKey(), metaData_, true));
147     EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetStrategyKey(), metaData_));
148     EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.appId, metaData_, true));
149     EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKeyLocal(), localMeta_, true));
150 
151     auto tokenIdOk = AccessTokenKit::GetNativeTokenId("foundation");
152     SetSelfTokenID(tokenIdOk);
153     auto kvDataService = OHOS::DistributedKv::KvStoreDataService();
154     auto ret = kvDataService.ClearAppStorage(BUNDLE_NAME, USER_ID, APP_INDEX, tokenIdOk);
155     EXPECT_EQ(ret, Status::SUCCESS);
156 
157     EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKey(), metaData_));
158     EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetSecretKey(), metaData_, true));
159     EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetStrategyKey(), metaData_));
160     EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.appId, metaData_, true));
161     EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKeyLocal(), localMeta_, true));
162 
163     MetaDataManager::GetInstance().DelMeta(metaData_.GetKey());
164     EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKey(), metaData_));
165 }
166 } // namespace OHOS::Test