• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <gtest/gtest.h>
17 
18 #include <string>
19 
20 #include "common.h"
21 #include "rdb_errno.h"
22 #include "rdb_helper.h"
23 #include "rdb_open_callback.h"
24 
25 using namespace testing::ext;
26 using namespace OHOS::NativeRdb;
27 
28 class RdbStepResultSetGetRowTest : public testing::Test {
29 public:
30     static void SetUpTestCase(void);
31     static void TearDownTestCase(void);
32     void SetUp();
33     void TearDown();
34 
35     static const std::string DATABASE_NAME;
36     static std::shared_ptr<RdbStore> store;
37 };
38 
39 const std::string RdbStepResultSetGetRowTest::DATABASE_NAME = RDB_TEST_PATH + "stepResultSet_getRow_test.db";
40 std::shared_ptr<RdbStore> RdbStepResultSetGetRowTest::store = nullptr;
41 
42 class RdbStepResultSetGetOpenCallback : public RdbOpenCallback {
43 public:
44     int OnCreate(RdbStore &store) override;
45     int OnUpgrade(RdbStore &store, int oldVersion, int newVersion) override;
46 };
47 
OnCreate(RdbStore & store)48 int RdbStepResultSetGetOpenCallback::OnCreate(RdbStore &store)
49 {
50     return E_OK;
51 }
52 
OnUpgrade(RdbStore & store,int oldVersion,int newVersion)53 int RdbStepResultSetGetOpenCallback::OnUpgrade(RdbStore &store, int oldVersion, int newVersion)
54 {
55     return E_OK;
56 }
57 
SetUpTestCase(void)58 void RdbStepResultSetGetRowTest::SetUpTestCase(void)
59 {
60     int errCode = E_OK;
61     RdbHelper::DeleteRdbStore(DATABASE_NAME);
62     RdbStoreConfig config(RdbStepResultSetGetRowTest::DATABASE_NAME);
63     RdbStepResultSetGetOpenCallback helper;
64     RdbStepResultSetGetRowTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
65     EXPECT_NE(RdbStepResultSetGetRowTest::store, nullptr);
66     EXPECT_EQ(errCode, E_OK);
67 }
68 
TearDownTestCase(void)69 void RdbStepResultSetGetRowTest::TearDownTestCase(void)
70 {
71     RdbHelper::ClearCache();
72     RdbHelper::DeleteRdbStore(RdbStepResultSetGetRowTest::DATABASE_NAME);
73 }
74 
SetUp(void)75 void RdbStepResultSetGetRowTest::SetUp(void)
76 {
77     store->ExecuteSql("CREATE TABLE test (id INTEGER PRIMARY KEY AUTOINCREMENT, data1 TEXT, "
78                       "data2 INTEGER, data3 FLOAT, data4 BLOB, data5 BOOLEAN);");
79 }
80 
TearDown(void)81 void RdbStepResultSetGetRowTest::TearDown(void)
82 {
83     store->ExecuteSql("DROP TABLE IF EXISTS test");
84 }
85 
86 /* *
87  * @tc.name: RdbStore_StepResultSet_GetRow_001
88  * @tc.desc: test StepResultSet GetRow
89  * @tc.type: FUNC
90  * @tc.require: AR000FKD4F
91  */
92 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_001, TestSize.Level1)
93 {
94     int64_t rowId;
95     ValuesBucket valuesBucket;
96     valuesBucket.PutInt("id", ValueObject(1));
97     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
98     EXPECT_EQ(E_OK, errorCode);
99     EXPECT_EQ(1, rowId);
100 
101     std::shared_ptr<ResultSet> resultSet = RdbStepResultSetGetRowTest::store->QueryByStep("SELECT * FROM test");
102     EXPECT_NE(resultSet, nullptr);
103 
104     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
105 
106     int iRet = E_ERROR;
107     RowEntity rowEntity;
108     iRet = resultSet->GetRow(rowEntity);
109     EXPECT_EQ(E_OK, iRet);
110 
111     int idValue = rowEntity.Get("id");
112     EXPECT_EQ(1, idValue);
113 
114     int idValueByIndex = rowEntity.Get(0);
115     EXPECT_EQ(1, idValueByIndex);
116 
117     resultSet->Close();
118 }
119 
120 /* *
121  * @tc.name: RdbStore_StepResultSet_GetRow_002
122  * @tc.desc: test StepResultSet GetRow
123  * @tc.type: FUNC
124  * @tc.require: AR000FKD4F
125  */
126 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_002, TestSize.Level1)
127 {
128     ValuesBucket valuesBucket;
129     valuesBucket.PutNull("data1");
130     valuesBucket.PutNull("data2");
131     valuesBucket.PutNull("data3");
132     valuesBucket.PutNull("data4");
133     valuesBucket.PutNull("data5");
134     int64_t rowId;
135     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
136     EXPECT_EQ(E_OK, errorCode);
137     EXPECT_EQ(1, rowId);
138 
139     std::shared_ptr<ResultSet> resultSet = RdbStepResultSetGetRowTest::store->QueryByStep("SELECT * FROM test");
140     EXPECT_NE(resultSet, nullptr);
141 
142     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
143 
144     int iRet = E_ERROR;
145     RowEntity rowEntity;
146     iRet = resultSet->GetRow(rowEntity);
147     EXPECT_EQ(E_OK, iRet);
148 
149     int idValue = rowEntity.Get("id");
150     EXPECT_EQ(1, idValue);
151 
152     int idValueByIndex = rowEntity.Get(0);
153     EXPECT_EQ(1, idValueByIndex);
154 
155     resultSet->Close();
156 }
157 
158 /* *
159  * @tc.name: RdbStore_StepResultSet_GetRow_003
160  * @tc.desc: test StepResultSet GetRow
161  * @tc.type: FUNC
162  * @tc.require: AR000FKD4F
163  */
164 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_003, TestSize.Level1)
165 {
166     ValuesBucket valuesBucket;
167     valuesBucket.PutString("data1", "olleh");
168     valuesBucket.PutInt("data2", 20);
169     valuesBucket.PutDouble("data3", 2.0);
170     valuesBucket.PutBlob("data4", { 4, 3, 2, 1 });
171     valuesBucket.PutBool("data5", true);
172     int64_t rowId;
173     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
174     EXPECT_EQ(E_OK, errorCode);
175     EXPECT_EQ(1, rowId);
176 
177     std::shared_ptr<ResultSet> resultSet = RdbStepResultSetGetRowTest::store->QueryByStep("SELECT * FROM test");
178     EXPECT_NE(resultSet, nullptr);
179 
180     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
181 
182     int iRet = E_ERROR;
183     RowEntity rowEntity;
184     iRet = resultSet->GetRow(rowEntity);
185     EXPECT_EQ(E_OK, iRet);
186 
187     int idValue = rowEntity.Get("id");
188     std::string data1Value = rowEntity.Get("data1");
189     int data2Value = rowEntity.Get("data2");
190     double data3Value = rowEntity.Get("data3");
191     std::vector<uint8_t> data4Value = rowEntity.Get("data4");
192     int data5Value = rowEntity.Get("data5");
193     EXPECT_EQ(1, idValue);
194     EXPECT_EQ("olleh", data1Value);
195     EXPECT_EQ(20, data2Value);
196     EXPECT_EQ(2.0, data3Value);
197     EXPECT_EQ(1, data4Value[3]);
198     EXPECT_EQ(1, data5Value);
199 
200     int idValueByIndex = rowEntity.Get(0);
201     std::string data1ValueByIndex = rowEntity.Get(1);
202     int data2ValueByIndex = rowEntity.Get(2);
203     double data3ValueByIndex  = rowEntity.Get(3);
204     std::vector<uint8_t> data4ValueByIndex = rowEntity.Get(4);
205     int data5ValueByIndex = rowEntity.Get(5);
206     EXPECT_EQ(1, idValueByIndex);
207     EXPECT_EQ("olleh", data1ValueByIndex);
208     EXPECT_EQ(20, data2ValueByIndex);
209     EXPECT_EQ(2.0, data3ValueByIndex);
210     EXPECT_EQ(1, data4ValueByIndex[3]);
211     EXPECT_EQ(1, data5ValueByIndex);
212 
213     resultSet->Close();
214 }
215 
216 /* *
217  * @tc.name: RdbStore_StepResultSet_GetRow_004
218  * @tc.desc: test StepResultSet GetRow
219  * @tc.type: FUNC
220  * @tc.require: AR000FKD4F
221  */
222 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_004, TestSize.Level1)
223 {
224     ValuesBucket valuesBucket;
225     valuesBucket.PutString("data1", "");
226     valuesBucket.PutInt("data2", 10);
227     valuesBucket.PutDouble("data3", 1.0);
228     valuesBucket.PutBlob("data4", { 1, 2, 3, 4 });
229     valuesBucket.PutBool("data5", true);
230     int64_t rowId;
231     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
232     EXPECT_EQ(E_OK, errorCode);
233     EXPECT_EQ(1, rowId);
234 
235     std::shared_ptr<ResultSet> resultSet =
236         RdbStepResultSetGetRowTest::store->QueryByStep("SELECT data1, data2 FROM test");
237     EXPECT_NE(resultSet, nullptr);
238 
239     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
240 
241     int iRet = E_ERROR;
242     RowEntity rowEntity;
243     iRet = resultSet->GetRow(rowEntity);
244     EXPECT_EQ(E_OK, iRet);
245 
246     std::string data1Value = rowEntity.Get("data1");
247     EXPECT_EQ("", data1Value);
248 
249     std::string data1ValueByIndex = rowEntity.Get(0);
250     EXPECT_EQ("", data1ValueByIndex);
251 
252     resultSet->Close();
253 }
254 
255 /* *
256  * @tc.name: RdbStore_StepResultSet_GetRow_005
257  * @tc.desc: Abnormal testCase of GetRow for rowEntity, if params of Get() is invalid
258  * @tc.type: FUNC
259  */
260 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_005, TestSize.Level2)
261 {
262     ValuesBucket valuesBucket;
263     valuesBucket.PutString("data1", "keep");
264     valuesBucket.PutInt("data2", 10);
265 
266     int64_t rowId;
267     EXPECT_EQ(E_OK, RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket));
268     EXPECT_EQ(1, rowId);
269 
270     std::shared_ptr<ResultSet> resultSet =
271         RdbStepResultSetGetRowTest::store->QueryByStep("SELECT data1, data2 FROM test");
272     EXPECT_NE(nullptr, resultSet);
273 
274     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
275 
276     RowEntity rowEntity;
277     EXPECT_EQ(E_OK, resultSet->GetRow(rowEntity));
278 
279     EXPECT_EQ(ValueObjectType::TYPE_NULL, rowEntity.Get("data3").GetType());
280     EXPECT_EQ(ValueObjectType::TYPE_NULL, rowEntity.Get(-1).GetType());
281     EXPECT_EQ(ValueObjectType::TYPE_NULL, rowEntity.Get(2).GetType());
282 
283     resultSet->Close();
284 }
285 
286 /* *
287  * @tc.name: RdbStore_StepResultSet_GetRow_006
288  * @tc.desc: Abnormal testCase of GetRow for rowEntity, if close resultSet before GetRow
289  * @tc.type: FUNC
290  */
291 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_006, TestSize.Level2)
292 {
293     ValuesBucket valuesBucket;
294     valuesBucket.PutString("data1", "keep");
295     valuesBucket.PutInt("data2", 10);
296 
297     int64_t rowId;
298     EXPECT_EQ(E_OK, RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket));
299     EXPECT_EQ(1, rowId);
300 
301     std::shared_ptr<ResultSet> resultSet =
302         RdbStepResultSetGetRowTest::store->QueryByStep("SELECT data1, data2 FROM test");
303     EXPECT_NE(nullptr, resultSet);
304 
305     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
306 
307     EXPECT_EQ(E_OK, resultSet->Close());
308 
309     RowEntity rowEntity;
310     EXPECT_EQ(E_STEP_RESULT_CLOSED, resultSet->GetRow(rowEntity));
311 }
312