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 "datashare_values_bucket.h"
22 #include "hap_token_info.h"
23 #include "iservice_registry.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.datasharetest";
33 std::string SLIENT_ACCESS_URI = "datashare:///com.acts.datasharetest?Proxy=true";
34 std::string USER_URI = "datashare:///com.acts.datasharetest/entry/DB00/user?Proxy=true";
35 std::string BOOK_URI = "datashare:///com.acts.datasharetest/entry/DB00/book?Proxy=true";
36 std::string TBL_STU_NAME = "name";
37 std::string TBL_STU_AGE = "age";
38 std::shared_ptr<DataShare::DataShareHelper> g_slientAccessHelper;
39
40 class JoinTest : public testing::Test {
41 public:
42 static void SetUpTestCase(void);
43 static void TearDownTestCase(void);
44 void SetUp();
45 void TearDown();
46 static void InsertUserDates();
47 static void InsertBookDates();
48 int ResultSize(std::shared_ptr<DataShareResultSet> &resultSet);
49 };
50
CreateDataShareHelper(int32_t systemAbilityId,std::string uri)51 std::shared_ptr<DataShare::DataShareHelper> CreateDataShareHelper(int32_t systemAbilityId, std::string uri)
52 {
53 LOG_INFO("CreateDataShareHelper start");
54 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
55 if (saManager == nullptr) {
56 LOG_ERROR("GetSystemAbilityManager get samgr failed.");
57 return nullptr;
58 }
59 auto remoteObj = saManager->GetSystemAbility(systemAbilityId);
60 if (remoteObj == nullptr) {
61 LOG_ERROR("GetSystemAbility service failed.");
62 return nullptr;
63 }
64 return DataShare::DataShareHelper::Creator(remoteObj, uri);
65 }
66
SetUpTestCase(void)67 void JoinTest::SetUpTestCase(void)
68 {
69 LOG_INFO("SetUpTestCase invoked");
70 auto dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID, DATA_SHARE_URI);
71 ASSERT_TRUE(dataShareHelper != nullptr);
72 int sleepTime = 3;
73 sleep(sleepTime);
74
75 HapInfoParams info = {
76 .userID = 100,
77 .bundleName = "ohos.datashareclienttest.demo",
78 .instIndex = 0,
79 .appIDDesc = "ohos.datashareclienttest.demo" };
80 HapPolicyParams policy = { .apl = APL_NORMAL,
81 .domain = "test.domain",
82 .permList = { { .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 .permStateList = {
92 {
93 .permissionName = "ohos.permission.test",
94 .isGeneral = true,
95 .resDeviceID = { "local" },
96 .grantStatus = { PermissionState::PERMISSION_GRANTED },
97 .grantFlags = { 1 }
98 }
99 }
100 };
101 AccessTokenKit::AllocHapToken(info, policy);
102 auto testTokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(
103 info.userID, info.bundleName, info.instIndex);
104 SetSelfTokenID(testTokenId);
105
106 g_slientAccessHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID, SLIENT_ACCESS_URI);
107 ASSERT_TRUE(g_slientAccessHelper != nullptr);
108 JoinTest::InsertUserDates();
109 JoinTest::InsertBookDates();
110 LOG_INFO("SetUpTestCase end");
111 }
112
TearDownTestCase(void)113 void JoinTest::TearDownTestCase(void)
114 {
115 auto tokenId = AccessTokenKit::GetHapTokenID(100, "ohos.datashareclienttest.demo", 0);
116 AccessTokenKit::DeleteToken(tokenId);
117 g_slientAccessHelper = nullptr;
118 }
119
SetUp(void)120 void JoinTest::SetUp(void) {}
TearDown(void)121 void JoinTest::TearDown(void) {}
122
InsertUserDates()123 void JoinTest::InsertUserDates()
124 {
125 LOG_INFO("JoinTest::InsertUserDates start");
126 DataShare::DataShareValuesBucket values;
127
128 values.Put("userId", 1);
129 values.Put("firstName", "Zhang");
130 values.Put("lastName", "San");
131 values.Put("age", 29);
132 values.Put("balance", 100.51);
133 Uri userUri (USER_URI);
134 g_slientAccessHelper->Insert(userUri, values);
135
136 values.Clear();
137 values.Put("userId", 2);
138 values.Put("firstName", "Li");
139 values.Put("lastName", "Si");
140 values.Put("age", 30);
141 values.Put("balance", 200.51);
142 g_slientAccessHelper->Insert(userUri, values);
143
144 values.Clear();
145 values.Put("userId", 3);
146 values.Put("firstName", std::string("Wang"));
147 values.Put("lastName", std::string("Wu"));
148 values.Put("age", 30);
149 values.Put("balance", 300.51);
150 g_slientAccessHelper->Insert(userUri, values);
151
152 values.Clear();
153 values.Put("userId", 4);
154 values.Put("firstName", "Sun");
155 values.Put("lastName", "Liu");
156 values.Put("age", 31);
157 values.Put("balance", 400.51);
158 g_slientAccessHelper->Insert(userUri, values);
159
160 values.Clear();
161 values.Put("userId", 5);
162 values.Put("firstName", "Ma");
163 values.Put("lastName", "Qi");
164 values.Put("age", 32);
165 values.Put("balance", 500.51);
166 g_slientAccessHelper->Insert(userUri, values);
167 LOG_INFO("JoinTest::InsertUserDates ends");
168 }
169
InsertBookDates()170 void JoinTest::InsertBookDates()
171 {
172 LOG_INFO("JoinTest::InsertBookDates start");
173 DataShare::DataShareValuesBucket values;
174
175 values.Put("id", 1);
176 values.Put("name", "SanGuo");
177 values.Put("userId", 1);
178 Uri bookUri (BOOK_URI);
179 g_slientAccessHelper->Insert(bookUri, values);
180
181 values.Clear();
182 values.Put("id", 2);
183 values.Put("name", "XiYouJi");
184 values.Put("userId", 2);
185 g_slientAccessHelper->Insert(bookUri, values);
186
187 values.Clear();
188 values.Put("id", 3);
189 values.Put("name", "ShuiHuZhuan");
190 values.Put("userId", 3);
191 g_slientAccessHelper->Insert(bookUri, values);
192 LOG_INFO("JoinTest::InsertBookDates end");
193 }
194
ResultSize(std::shared_ptr<DataShareResultSet> & resultSet)195 int JoinTest::ResultSize(std::shared_ptr<DataShareResultSet> &resultSet)
196 {
197 if (resultSet->GoToFirstRow() != E_OK) {
198 return 0;
199 }
200 int count = 1;
201 while (resultSet->GoToNextRow() == E_OK) {
202 count++;
203 }
204 return count;
205 }
206
207 HWTEST_F(JoinTest, Join_CrossJoin_001, TestSize.Level0)
208 {
209 auto helper = g_slientAccessHelper;
210 DataShare::DataSharePredicates predicates;
211 std::vector<std::string> clauses;
212 clauses.push_back("user.userId = book.userId");
213 predicates.CrossJoin("book")->On(clauses);
214
215 std::vector<std::string> columns;
216 Uri userUri (USER_URI);
217 auto resultSet = g_slientAccessHelper->Query(userUri, predicates, columns);
218 int rowCount;
219 resultSet->GetRowCount(rowCount);
220 EXPECT_EQ(3, rowCount);
221
222 EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
223 int userId;
224 EXPECT_EQ(E_OK, resultSet->GetInt(0, userId));
225 EXPECT_EQ(1, userId);
226
227 std::string firstName;
228 EXPECT_EQ(E_OK, resultSet->GetString(1, firstName));
229 EXPECT_EQ("Zhang", firstName);
230
231 std::string lastName;
232 EXPECT_EQ(E_OK, resultSet->GetString(2, lastName));
233 EXPECT_EQ("San", lastName);
234
235 int age;
236 EXPECT_EQ(E_OK, resultSet->GetInt(3, age));
237 EXPECT_EQ(29, age);
238
239 double balance;
240 EXPECT_EQ(E_OK, resultSet->GetDouble(4, balance));
241 EXPECT_EQ(100.51, balance);
242
243 int id;
244 EXPECT_EQ(E_OK, resultSet->GetInt(5, id));
245 EXPECT_EQ(1, id);
246
247 std::string name;
248 EXPECT_EQ(E_OK, resultSet->GetString(6, name));
249 EXPECT_EQ("SanGuo", name);
250
251 int userId_1;
252 EXPECT_EQ(E_OK, resultSet->GetInt(7, userId_1));
253 EXPECT_EQ(1, userId_1);
254 }
255
256 HWTEST_F(JoinTest, Join_InnerJoin_001, TestSize.Level0)
257 {
258 auto helper = g_slientAccessHelper;
259 DataShare::DataSharePredicates predicates;
260 std::vector<std::string> clauses;
261 clauses.push_back("user.userId = book.userId");
262 predicates.InnerJoin("book")->On(clauses)->EqualTo("book.name", "SanGuo");
263
264 std::vector<std::string> columns;
265 Uri userUri (USER_URI);
266 auto resultSet = g_slientAccessHelper->Query(userUri, predicates, columns);
267
268 int rowCount;
269 resultSet->GetRowCount(rowCount);
270 EXPECT_EQ(1, rowCount);
271 EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
272
273 int userId;
274 EXPECT_EQ(E_OK, resultSet->GetInt(0, userId));
275 EXPECT_EQ(1, userId);
276
277 std::string firstName;
278 EXPECT_EQ(E_OK, resultSet->GetString(1, firstName));
279 EXPECT_EQ("Zhang", firstName);
280
281 std::string lastName;
282 EXPECT_EQ(E_OK, resultSet->GetString(2, lastName));
283 EXPECT_EQ("San", lastName);
284
285 int age;
286 EXPECT_EQ(E_OK, resultSet->GetInt(3, age));
287 EXPECT_EQ(29, age);
288
289 double balance;
290 EXPECT_EQ(E_OK, resultSet->GetDouble(4, balance));
291 EXPECT_EQ(100.51, balance);
292
293 int id;
294 EXPECT_EQ(E_OK, resultSet->GetInt(5, id));
295 EXPECT_EQ(1, id);
296
297 std::string name;
298 EXPECT_EQ(E_OK, resultSet->GetString(6, name));
299 EXPECT_EQ("SanGuo", name);
300
301 int userId_1;
302 EXPECT_EQ(E_OK, resultSet->GetInt(7, userId_1));
303 EXPECT_EQ(1, userId_1);
304 }
305
306 HWTEST_F(JoinTest, Join_LeftOuterJoin_001, TestSize.Level0)
307 {
308 auto helper = g_slientAccessHelper;
309 DataShare::DataSharePredicates predicates;
310 std::vector<std::string> fields;
311 fields.push_back("userId");
312 predicates.LeftOuterJoin("book")->Using(fields)->EqualTo("name", "SanGuo");
313
314 std::vector<std::string> columns;
315 Uri userUri (USER_URI);
316 auto resultSet = g_slientAccessHelper->Query(userUri, predicates, columns);
317
318 int rowCount;
319 resultSet->GetRowCount(rowCount);
320 EXPECT_EQ(1, rowCount);
321 EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
322
323 int userId;
324 EXPECT_EQ(E_OK, resultSet->GetInt(0, userId));
325 EXPECT_EQ(1, userId);
326
327 std::string firstName;
328 EXPECT_EQ(E_OK, resultSet->GetString(1, firstName));
329 EXPECT_EQ("Zhang", firstName);
330
331 std::string lastName;
332 EXPECT_EQ(E_OK, resultSet->GetString(2, lastName));
333 EXPECT_EQ("San", lastName);
334
335 int age;
336 EXPECT_EQ(E_OK, resultSet->GetInt(3, age));
337 EXPECT_EQ(29, age);
338
339 double balance;
340 EXPECT_EQ(E_OK, resultSet->GetDouble(4, balance));
341 EXPECT_EQ(100.51, balance);
342
343 int id;
344 EXPECT_EQ(E_OK, resultSet->GetInt(5, id));
345 EXPECT_EQ(1, id);
346
347 std::string name;
348 EXPECT_EQ(E_OK, resultSet->GetString(6, name));
349 EXPECT_EQ("SanGuo", name);
350 }
351
352 HWTEST_F(JoinTest, Join_LeftOuterJoin_002, TestSize.Level0)
353 {
354 auto helper = g_slientAccessHelper;
355 DataShare::DataSharePredicates predicates;
356 std::vector<std::string> clauses;
357 clauses.push_back("user.userId = book.userId");
358 predicates.LeftOuterJoin("book")->On(clauses);
359
360 std::vector<std::string> columns;
361 Uri userUri (USER_URI);
362 auto resultSet = g_slientAccessHelper->Query(userUri, predicates, columns);
363 int rowCount;
364 resultSet->GetRowCount(rowCount);
365 EXPECT_EQ(5, rowCount);
366 }
367 } // namespace DataShare
368 } // namespace OHOS