• 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  */
91 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_001, TestSize.Level1)
92 {
93     int64_t rowId;
94     ValuesBucket valuesBucket;
95     valuesBucket.PutInt("id", ValueObject(1));
96     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
97     EXPECT_EQ(E_OK, errorCode);
98     EXPECT_EQ(1, rowId);
99 
100     std::shared_ptr<ResultSet> resultSet = RdbStepResultSetGetRowTest::store->QueryByStep("SELECT * FROM test");
101     EXPECT_NE(resultSet, nullptr);
102 
103     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
104 
105     int iRet = E_ERROR;
106     RowEntity rowEntity;
107     iRet = resultSet->GetRow(rowEntity);
108     EXPECT_EQ(E_OK, iRet);
109 
110     int idValue = rowEntity.Get("id");
111     EXPECT_EQ(1, idValue);
112 
113     int idValueByIndex = rowEntity.Get(0);
114     EXPECT_EQ(1, idValueByIndex);
115 
116     std::map<std::string, ValueObject> rowEntityTmp = rowEntity.Get();
117     ValueObject valueObjectTmp = rowEntityTmp["id"];
118     int id;
119     valueObjectTmp.GetInt(id);
120     EXPECT_EQ(1, id);
121 
122     std::map<std::string, ValueObject> rowEntityTmp2 = rowEntity.Steal();
123     ValueObject valueObjectTmp2 = rowEntityTmp2["id"];
124     id = 0;
125     valueObjectTmp2.GetInt(id);
126     EXPECT_EQ(1, id);
127     rowEntityTmp = rowEntity.Get();
128     EXPECT_EQ(0, rowEntityTmp.size());
129 
130     resultSet->Close();
131 }
132 
133 /* *
134  * @tc.name: RdbStore_StepResultSet_GetRow_002
135  * @tc.desc: test StepResultSet GetRow
136  * @tc.type: FUNC
137  */
138 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_002, TestSize.Level1)
139 {
140     ValuesBucket valuesBucket;
141     valuesBucket.PutNull("data1");
142     valuesBucket.PutNull("data2");
143     valuesBucket.PutNull("data3");
144     valuesBucket.PutNull("data4");
145     valuesBucket.PutNull("data5");
146     int64_t rowId;
147     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
148     EXPECT_EQ(E_OK, errorCode);
149     EXPECT_EQ(1, rowId);
150 
151     std::shared_ptr<ResultSet> resultSet = RdbStepResultSetGetRowTest::store->QueryByStep("SELECT * FROM test");
152     EXPECT_NE(resultSet, nullptr);
153 
154     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
155 
156     int iRet = E_ERROR;
157     RowEntity rowEntity;
158     iRet = resultSet->GetRow(rowEntity);
159     EXPECT_EQ(E_OK, iRet);
160 
161     int idValue = rowEntity.Get("id");
162     EXPECT_EQ(1, idValue);
163 
164     int idValueByIndex = rowEntity.Get(0);
165     EXPECT_EQ(1, idValueByIndex);
166 
167     resultSet->Close();
168 }
169 
170 /* *
171  * @tc.name: RdbStore_StepResultSet_GetRow_003
172  * @tc.desc: test StepResultSet GetRow
173  * @tc.type: FUNC
174  */
175 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_003, TestSize.Level1)
176 {
177     ValuesBucket valuesBucket;
178     valuesBucket.PutString("data1", "olleh");
179     valuesBucket.PutInt("data2", 20);
180     valuesBucket.PutDouble("data3", 2.0);
181     valuesBucket.PutBlob("data4", { 4, 3, 2, 1 });
182     valuesBucket.PutBool("data5", true);
183     int64_t rowId;
184     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
185     EXPECT_EQ(E_OK, errorCode);
186     EXPECT_EQ(1, rowId);
187 
188     std::shared_ptr<ResultSet> resultSet = RdbStepResultSetGetRowTest::store->QueryByStep("SELECT * FROM test");
189     EXPECT_NE(resultSet, nullptr);
190 
191     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
192 
193     int iRet = E_ERROR;
194     RowEntity rowEntity;
195     iRet = resultSet->GetRow(rowEntity);
196     EXPECT_EQ(E_OK, iRet);
197 
198     int idValue = rowEntity.Get("id");
199     std::string data1Value = rowEntity.Get("data1");
200     int data2Value = rowEntity.Get("data2");
201     double data3Value = rowEntity.Get("data3");
202     std::vector<uint8_t> data4Value = rowEntity.Get("data4");
203     int data5Value = rowEntity.Get("data5");
204     EXPECT_EQ(1, idValue);
205     EXPECT_EQ("olleh", data1Value);
206     EXPECT_EQ(20, data2Value);
207     EXPECT_EQ(2.0, data3Value);
208     EXPECT_EQ(1, data4Value[3]);
209     EXPECT_EQ(1, data5Value);
210 
211     int idValueByIndex = rowEntity.Get(0);
212     std::string data1ValueByIndex = rowEntity.Get(1);
213     int data2ValueByIndex = rowEntity.Get(2);
214     double data3ValueByIndex = rowEntity.Get(3);
215     std::vector<uint8_t> data4ValueByIndex = rowEntity.Get(4);
216     int data5ValueByIndex = rowEntity.Get(5);
217     EXPECT_EQ(1, idValueByIndex);
218     EXPECT_EQ("olleh", data1ValueByIndex);
219     EXPECT_EQ(20, data2ValueByIndex);
220     EXPECT_EQ(2.0, data3ValueByIndex);
221     EXPECT_EQ(1, data4ValueByIndex[3]);
222     EXPECT_EQ(1, data5ValueByIndex);
223 
224     resultSet->Close();
225 }
226 
227 /* *
228  * @tc.name: RdbStore_StepResultSet_GetRow_004
229  * @tc.desc: test StepResultSet GetRow
230  * @tc.type: FUNC
231  */
232 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_004, TestSize.Level1)
233 {
234     ValuesBucket valuesBucket;
235     valuesBucket.PutString("data1", "");
236     valuesBucket.PutInt("data2", 10);
237     valuesBucket.PutDouble("data3", 1.0);
238     valuesBucket.PutBlob("data4", { 1, 2, 3, 4 });
239     valuesBucket.PutBool("data5", true);
240     int64_t rowId;
241     int errorCode = RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket);
242     EXPECT_EQ(E_OK, errorCode);
243     EXPECT_EQ(1, rowId);
244 
245     std::shared_ptr<ResultSet> resultSet =
246         RdbStepResultSetGetRowTest::store->QueryByStep("SELECT data1, data2 FROM test");
247     EXPECT_NE(resultSet, nullptr);
248 
249     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
250 
251     int iRet = E_ERROR;
252     RowEntity rowEntity;
253     iRet = resultSet->GetRow(rowEntity);
254     EXPECT_EQ(E_OK, iRet);
255 
256     std::string data1Value = rowEntity.Get("data1");
257     EXPECT_EQ("", data1Value);
258 
259     std::string data1ValueByIndex = rowEntity.Get(0);
260     EXPECT_EQ("", data1ValueByIndex);
261 
262     resultSet->Close();
263 }
264 
265 /* *
266  * @tc.name: RdbStore_StepResultSet_GetRow_005
267  * @tc.desc: Abnormal testCase of GetRow for rowEntity, if params of Get() is invalid
268  * @tc.type: FUNC
269  */
270 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_005, TestSize.Level2)
271 {
272     ValuesBucket valuesBucket;
273     valuesBucket.PutString("data1", "keep");
274     valuesBucket.PutInt("data2", 10);
275 
276     int64_t rowId;
277     EXPECT_EQ(E_OK, RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket));
278     EXPECT_EQ(1, rowId);
279 
280     std::shared_ptr<ResultSet> resultSet =
281         RdbStepResultSetGetRowTest::store->QueryByStep("SELECT data1, data2 FROM test");
282     EXPECT_NE(nullptr, resultSet);
283 
284     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
285 
286     RowEntity rowEntity;
287     EXPECT_EQ(E_OK, resultSet->GetRow(rowEntity));
288 
289     EXPECT_EQ(ValueObjectType::TYPE_NULL, rowEntity.Get("data3").GetType());
290     EXPECT_EQ(ValueObjectType::TYPE_NULL, rowEntity.Get(-1).GetType());
291     EXPECT_EQ(ValueObjectType::TYPE_NULL, rowEntity.Get(2).GetType());
292 
293     resultSet->Close();
294 }
295 
296 /* *
297  * @tc.name: RdbStore_StepResultSet_GetRow_006
298  * @tc.desc: Abnormal testCase of GetRow for rowEntity, if close resultSet before GetRow
299  * @tc.type: FUNC
300  */
301 HWTEST_F(RdbStepResultSetGetRowTest, RdbStore_StepResultSet_GetRow_006, TestSize.Level2)
302 {
303     ValuesBucket valuesBucket;
304     valuesBucket.PutString("data1", "keep");
305     valuesBucket.PutInt("data2", 10);
306 
307     int64_t rowId;
308     EXPECT_EQ(E_OK, RdbStepResultSetGetRowTest::store->Insert(rowId, "test", valuesBucket));
309     EXPECT_EQ(1, rowId);
310 
311     std::shared_ptr<ResultSet> resultSet =
312         RdbStepResultSetGetRowTest::store->QueryByStep("SELECT data1, data2 FROM test");
313     EXPECT_NE(nullptr, resultSet);
314 
315     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
316 
317     EXPECT_EQ(E_OK, resultSet->Close());
318 
319     RowEntity rowEntity;
320     EXPECT_EQ(E_ALREADY_CLOSED, resultSet->GetRow(rowEntity));
321 }
322