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