1 /*
2  * Copyright (C) 2021-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 #include <gtest/gtest.h>
16 #include <unistd.h>
17 
18 #include "accesstoken_kit.h"
19 #include "datashare_helper.h"
20 #include "datashare_log.h"
21 #include "hap_token_info.h"
22 #include "iservice_registry.h"
23 #include "rdb_errno.h"
24 #include "system_ability_definition.h"
25 #include "token_setproc.h"
26 
27 namespace OHOS {
28 namespace DataShare {
29 using namespace testing::ext;
30 using namespace OHOS::Security::AccessToken;
31 constexpr int STORAGE_MANAGER_MANAGER_ID = 5003;
32 std::string DATA_SHARE_URI = "datashare:///com.acts.errorcodetest";
33 std::string SLIENT_ACCESS_URI = "datashare:///com.acts.errorcodetest/entry/DB00/TBL00?Proxy=true";
34 std::string TBL_STU_NAME = "name";
35 std::string TBL_STU_AGE = "age";
36 std::shared_ptr<DataShare::DataShareHelper> g_slientAccessHelper;
37 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper;
38 
39 class ErrorCodeTest : public testing::Test {
40 public:
41     static void SetUpTestCase(void);
42     static void TearDownTestCase(void);
43     void SetUp();
44     void TearDown();
45 };
46 
CreateDataShareHelper(int32_t systemAbilityId,std::string uri)47 std::shared_ptr<DataShare::DataShareHelper> CreateDataShareHelper(int32_t systemAbilityId, std::string uri)
48 {
49     LOG_INFO("CreateDataShareHelper start");
50     auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
51     if (saManager == nullptr) {
52         LOG_ERROR("GetSystemAbilityManager get samgr failed.");
53         return nullptr;
54     }
55     auto remoteObj = saManager->GetSystemAbility(systemAbilityId);
56     if (remoteObj == nullptr) {
57         LOG_ERROR("GetSystemAbility service failed.");
58         return nullptr;
59     }
60     return DataShare::DataShareHelper::Creator(remoteObj, uri);
61 }
62 
SetUpTestCase(void)63 void ErrorCodeTest::SetUpTestCase(void)
64 {
65     LOG_INFO("SetUpTestCase invoked");
66     dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID, DATA_SHARE_URI);
67     ASSERT_TRUE(dataShareHelper != nullptr);
68     int sleepTime = 3;
69     sleep(sleepTime);
70 
71     HapInfoParams info = {
72         .userID = 100,
73         .bundleName = "ohos.datashareclienttest.demo",
74         .instIndex = 0,
75         .appIDDesc = "ohos.datashareclienttest.demo"
76     };
77     HapPolicyParams policy = {
78         .apl = APL_NORMAL,
79         .domain = "test.domain",
80         .permList = {
81             {
82                 .permissionName = "ohos.permission.test",
83                 .bundleName = "ohos.datashareclienttest.demo",
84                 .grantMode = 1,
85                 .availableLevel = APL_NORMAL,
86                 .label = "label",
87                 .labelId = 1,
88                 .description = "ohos.datashareclienttest.demo",
89                 .descriptionId = 1
90             }
91         },
92         .permStateList = {
93             {
94                 .permissionName = "ohos.permission.test",
95                 .isGeneral = true,
96                 .resDeviceID = { "local" },
97                 .grantStatus = { PermissionState::PERMISSION_GRANTED },
98                 .grantFlags = { 1 }
99             }
100         }
101     };
102     AccessTokenKit::AllocHapToken(info, policy);
103     auto testTokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(
104         info.userID, info.bundleName, info.instIndex);
105     SetSelfTokenID(testTokenId);
106 
107     g_slientAccessHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID, SLIENT_ACCESS_URI);
108     ASSERT_TRUE(g_slientAccessHelper != nullptr);
109     LOG_INFO("SetUpTestCase end");
110 }
111 
TearDownTestCase(void)112 void ErrorCodeTest::TearDownTestCase(void)
113 {
114     auto tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.datashareclienttest.demo", 0);
115     AccessTokenKit::DeleteToken(tokenId);
116     g_slientAccessHelper = nullptr;
117     dataShareHelper = nullptr;
118 }
119 
SetUp(void)120 void ErrorCodeTest::SetUp(void) {}
TearDown(void)121 void ErrorCodeTest::TearDown(void) {}
122 
123 HWTEST_F(ErrorCodeTest, ErrorCodeTest_Insert_Test_001, TestSize.Level0)
124 {
125     LOG_INFO("ErrorCodeTest_Insert_Test_001::Start");
126     auto helper = g_slientAccessHelper;
127     Uri uri(SLIENT_ACCESS_URI);
128     DataShare::DataShareValuesBucket valuesBucket;
129     std::string value = "lisi";
130     valuesBucket.Put(TBL_STU_NAME, value);
131     int age = 25;
132     valuesBucket.Put(TBL_STU_AGE, age);
133 
134     int retVal = helper->Insert(uri, valuesBucket);
135     EXPECT_EQ((retVal > 0), true);
136     LOG_INFO("ErrorCodeTest_Insert_Test_001::End");
137 }
138 
139 HWTEST_F(ErrorCodeTest, ErrorCodeTest_QUERY_Test_001, TestSize.Level0)
140 {
141     LOG_INFO("ErrorCodeTest_QUERY_Test_001::Start");
142     auto helper = g_slientAccessHelper;
143     Uri uri(SLIENT_ACCESS_URI);
144     DataShare::DataSharePredicates predicates;
145     predicates.EqualTo(TBL_STU_NAME, "lisi");
146     vector<string> columns;
147     DatashareBusinessError noError;
148     auto resultSet = helper->Query(uri, predicates, columns, &noError);
149     EXPECT_EQ(noError.GetCode(), 0);
150     int result = 0;
151     if (resultSet != nullptr) {
152         resultSet->GetRowCount(result);
153     }
154     EXPECT_EQ(result, 1);
155 
156     std::string ERR_SLIENT_ACCESS_URI = "datashare:///com.acts.errorcodetest/entry/DB01/TBL01?Proxy=true";
157     Uri uriErr(ERR_SLIENT_ACCESS_URI);
158     DatashareBusinessError error;
159     resultSet = helper->Query(uriErr, predicates, columns, &error);
160     EXPECT_EQ(error.GetCode(), NativeRdb::E_DB_NOT_EXIST);
161     EXPECT_EQ(resultSet, nullptr);
162     LOG_INFO("ErrorCodeTest_QUERY_Test_001::End");
163 }
164 
165 HWTEST_F(ErrorCodeTest, ErrorCodeTest_QUERY_Test_002, TestSize.Level0)
166 {
167     LOG_INFO("ErrorCodeTest_QUERY_Test_002::Start");
168     ASSERT_TRUE(dataShareHelper != nullptr);
169     Uri uri(DATA_SHARE_URI);
170 
171     DataShare::DataShareValuesBucket valuesBucket;
172     std::string value = "wangwu";
173     valuesBucket.Put(TBL_STU_NAME, value);
174     int age = 30;
175     valuesBucket.Put(TBL_STU_AGE, age);
176     int retVal = dataShareHelper->Insert(uri, valuesBucket);
177     EXPECT_EQ((retVal > 0), true);
178 
179     DataShare::DataSharePredicates predicates;
180     predicates.EqualTo(TBL_STU_NAME, "wangwu");
181     vector<string> columns;
182     DatashareBusinessError error;
183     auto resultSet = dataShareHelper->Query(uri, predicates, columns, &error);
184     EXPECT_EQ(error.GetCode(), 401);
185     EXPECT_EQ(resultSet, nullptr);
186 
187     DataShare::DataSharePredicates deletePredicates;
188     std::string selections = TBL_STU_NAME + " = 'wangwu'";
189     deletePredicates.SetWhereClause(selections);
190     retVal = dataShareHelper->Delete(uri, deletePredicates);
191     EXPECT_EQ((retVal > 0), true);
192     LOG_INFO("ErrorCodeTest_QUERY_Test_002::End");
193 }
194 } // namespace DataShare
195 } // namespace OHOS