1 /*
2 * Copyright (c) 2024 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 <sys/stat.h>
17 #include <sys/types.h>
18
19 #include <string>
20
21 #include "accesstoken_kit.h"
22 #include "common.h"
23 #include "grd_api_manager.h"
24 #include "oh_data_utils.h"
25 #include "rdb_errno.h"
26 #include "rdb_helper.h"
27 #include "rdb_ndk_utils.h"
28 #include "relational_store.h"
29 #include "relational_store_error_code.h"
30 #include "relational_store_impl.h"
31 #include "relational_store_inner_types.h"
32 #include "token_setproc.h"
33
34 using namespace testing::ext;
35 using namespace OHOS::NativeRdb;
36 using namespace OHOS::Security::AccessToken;
37 using namespace OHOS::RdbNdk;
38
39 class RdbNativeStoreConfigV2Test : public testing::Test {
40 public:
41 static void SetUpTestCase(void);
42 static void TearDownTestCase(void);
43 void SetUp();
44 void TearDown();
InitRdbConfig()45 static OH_Rdb_ConfigV2 *InitRdbConfig()
46 {
47 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
48 EXPECT_NE(config, nullptr);
49 OH_Rdb_SetDatabaseDir(config, RDB_TEST_PATH);
50 OH_Rdb_SetStoreName(config, "rdb_store_test.db");
51 OH_Rdb_SetBundleName(config, "com.ohos.example.distributedndk");
52 OH_Rdb_SetEncrypted(config, false);
53 OH_Rdb_SetSecurityLevel(config, OH_Rdb_SecurityLevel::S1);
54 OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL1);
55
56 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetDbType(config, RDB_SQLITE));
57 return config;
58 }
59 };
60
SetUpTestCase(void)61 void RdbNativeStoreConfigV2Test::SetUpTestCase(void)
62 {
63 }
64
TearDownTestCase(void)65 void RdbNativeStoreConfigV2Test::TearDownTestCase(void)
66 {
67 }
68
SetUp(void)69 void RdbNativeStoreConfigV2Test::SetUp(void)
70 {
71 }
72
TearDown(void)73 void RdbNativeStoreConfigV2Test::TearDown(void)
74 {
75 }
76
77 /**
78 * @tc.name: RDB_Native_store_test_001
79 * @tc.desc: Normal testCase of store for Update、Query.
80 * @tc.type: FUNC
81 */
82 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_001, TestSize.Level1)
83 {
84 mkdir(RDB_TEST_PATH, 0770);
85 int errCode = 0;
86 auto config = InitRdbConfig();
87 auto storeConfigV2TestRdbStore = OH_Rdb_CreateOrOpen(config, &errCode);
88 EXPECT_NE(storeConfigV2TestRdbStore, NULL);
89 char createTableSql[] = "CREATE TABLE store_test (id INTEGER PRIMARY KEY AUTOINCREMENT, data1 TEXT, data2 INTEGER, "
90 "data3 FLOAT, data4 BLOB, data5 TEXT);";
91 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, createTableSql));
92 char dropTableSql[] = "DROP TABLE IF EXISTS store_test";
93 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, dropTableSql));
94
95 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_CloseStore(storeConfigV2TestRdbStore));
96 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DeleteStoreV2(config));
97 OH_Rdb_DestroyConfig(config);
98 }
99
VdbTest002(const OH_Rdb_ConfigV2 * config)100 void VdbTest002(const OH_Rdb_ConfigV2 *config)
101 {
102 int errCode = OH_Rdb_ErrCode::RDB_OK;
103 auto store = OH_Rdb_CreateOrOpen(config, &errCode);
104 EXPECT_NE(store, nullptr);
105
106 char createTableSql[] = "CREATE TABLE t1(id INT PRIMARY KEY, repr floatvector(4));";
107 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, createTableSql));
108
109 int64_t trxId = 0;
110 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_BeginTransWithTrxId(store, &trxId));
111 char insertSql[] = "INSERT INTO t1 VALUES(2, '[1, 2, 3, 4]');";
112 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, trxId, insertSql));
113 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_CommitByTrxId(store, trxId));
114
115 char querySql[] = "SELECT * FROM t1;";
116 OH_Cursor *cursor = OH_Rdb_ExecuteQuery(store, querySql);
117 EXPECT_NE(cursor, nullptr);
118 int rowCount = 0;
119 cursor->getRowCount(cursor, &rowCount);
120 EXPECT_EQ(1, rowCount);
121 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, cursor->goToNextRow(cursor));
122 int64_t intVal = 0;
123 cursor->getInt64(cursor, 0, &intVal);
124 EXPECT_EQ(2, intVal); // Expect to get 2 as the result
125 cursor->destroy(cursor);
126
127 char dropSql[] = "DROP TABLE IF EXISTS t1;";
128 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, dropSql));
129
130 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DeleteStoreV2(config));
131 }
132
133 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_002, TestSize.Level1)
134 {
135 auto config = InitRdbConfig();
136 int errCode = OH_Rdb_SetDbType(config, RDB_CAYLEY);
137 EXPECT_TRUE(((!OHOS::NativeRdb::IsUsingArkData()) && errCode == OH_Rdb_ErrCode::RDB_E_NOT_SUPPORTED) ||
138 (OHOS::NativeRdb::IsUsingArkData() && errCode == OH_Rdb_ErrCode::RDB_OK));
139 if (OHOS::NativeRdb::IsUsingArkData()) {
140 VdbTest002(config);
141 }
142 OH_Rdb_DestroyConfig(config);
143 }
144
145 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_003, TestSize.Level1)
146 {
147 int numType = 0;
148 const int *supportTypeList = OH_Rdb_GetSupportedDbType(&numType);
149 EXPECT_NE(supportTypeList, nullptr);
150 EXPECT_TRUE(((!OHOS::NativeRdb::IsUsingArkData()) && numType == 1) || // 1 means only contain RDB_SQLITE
151 ((OHOS::NativeRdb::IsUsingArkData()) && numType == 2)); // 2 means both contain RDB_SQLITE and RDB_CAYLEY
152 EXPECT_EQ(RDB_SQLITE, supportTypeList[0]);
153 if (OHOS::NativeRdb::IsUsingArkData()) {
154 EXPECT_EQ(RDB_CAYLEY, supportTypeList[1]); // 1st element must be RDB_CAYLEY
155 }
156 }
157
158 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_004, TestSize.Level1)
159 {
160 auto config = InitRdbConfig();
161 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDatabaseDir(config, nullptr));
162 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetStoreName(config, nullptr));
163 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetBundleName(config, nullptr));
164 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetModuleName(config, nullptr));
165
166 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetDatabaseDir(config, ""));
167 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetStoreName(config, ""));
168 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetBundleName(config, ""));
169 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetModuleName(config, ""));
170
171 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetEncrypted(config, false));
172 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetEncrypted(config, true));
173
174 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S1));
175 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S2));
176 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S3));
177 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S4));
178 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetSecurityLevel(config, 0)); // 0 is invalid secure level
179 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetSecurityLevel(config, -1)); // -1 is invalid secure level
180 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetSecurityLevel(config, 5)); // 5 is invalid secure level
181
182 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL1));
183 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL2));
184 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL3));
185 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL4));
186 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL5));
187
188 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetArea(config, -1)); // -1 is invalid area level
189 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetArea(config, 0)); // 0 is invalid area level
190 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetArea(config, 8)); // 8 is invalid area level
191
192 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetDbType(config, RDB_SQLITE));
193 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDbType(config, 0)); // 0 is invalid db type level
194 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDbType(config, 6)); // 6 is invalid db type level
195 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDbType(config, -1)); // -1 is invalid db type level
196 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSemanticIndex(config, true));
197 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSemanticIndex(config, false));
198
199 const int *supportList = OH_Rdb_GetSupportedDbType(nullptr);
200 EXPECT_EQ(nullptr, supportList);
201
202 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_DestroyConfig(nullptr));
203 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DestroyConfig(config));
204 }
205
VdbTest003(const OH_Rdb_ConfigV2 * config)206 void VdbTest003(const OH_Rdb_ConfigV2 *config)
207 {
208 int errCode = OH_Rdb_ErrCode::RDB_OK;
209 auto store = OH_Rdb_CreateOrOpen(config, &errCode);
210 EXPECT_NE(store, nullptr);
211
212 char createTableSql[] = "CREATE TABLE t1(id INT PRIMARY KEY, repr floatvector(4));";
213 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, createTableSql));
214
215 char createIndexSql[] = "CREATE INDEX diskann_idx ON t1 USING GSDISKANN(repr L2);";
216 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, createIndexSql));
217
218 int64_t trxId = 0;
219 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_BeginTransWithTrxId(store, &trxId));
220 char insertSql[] = "INSERT INTO t1 VALUES(1, '[1, 2, 3, 4]');";
221 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, trxId, insertSql));
222 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_CommitByTrxId(store, trxId));
223
224 char insertSql2[] = "INSERT INTO t1 VALUES(2, '[2, 2, 3, 4]');";
225 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, insertSql2));
226
227 char deleteSql[] = "DELETE FROM t1 WHERE id = 1;";
228 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, deleteSql));
229
230 char dropSql[] = "DROP TABLE IF EXISTS t1;";
231 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, dropSql));
232
233 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DeleteStoreV2(config));
234 }
235
236 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_005, TestSize.Level1)
237 {
238 auto config = InitRdbConfig();
239 int errCode = OH_Rdb_SetDbType(config, RDB_CAYLEY);
240 EXPECT_TRUE(((!OHOS::NativeRdb::IsUsingArkData()) && errCode == OH_Rdb_ErrCode::RDB_E_NOT_SUPPORTED) ||
241 (OHOS::NativeRdb::IsUsingArkData() && errCode == OH_Rdb_ErrCode::RDB_OK));
242 if (OHOS::NativeRdb::IsUsingArkData()) {
243 VdbTest003(config);
244 }
245 OH_Rdb_DestroyConfig(config);
246 }
247
GetRandVector(uint32_t maxElementNum,uint16_t dim)248 string GetRandVector(uint32_t maxElementNum, uint16_t dim)
249 {
250 auto now = std::chrono::high_resolution_clock::now();
251 auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()).count();
252 unsigned int randomNumberSeed = static_cast<unsigned int>(ns);
253 std::string res = "[";
254 for (uint16_t i = 0; i < dim; i++) {
255 uint32_t intPart = maxElementNum == 0 ? 0 : (rand_r(&randomNumberSeed) % maxElementNum);
256 intPart += 1;
257 // 10 is used to limit the number after the decimal point to a maximum of 10.
258 uint32_t tenths = (rand_r(&randomNumberSeed) % 10);
259 res += std::to_string(intPart);
260 res += ".000";
261 res += std::to_string(tenths);
262 res += ", ";
263 }
264 res.pop_back();
265 res.pop_back();
266 res += "]";
267 return res;
268 }
269
VdbTest004(const OH_Rdb_ConfigV2 * config)270 void VdbTest004(const OH_Rdb_ConfigV2 *config)
271 {
272 int errCode = OH_Rdb_ErrCode::RDB_OK;
273 auto store = OH_Rdb_CreateOrOpen(config, &errCode);
274 EXPECT_NE(store, nullptr);
275
276 char createTableSql[] = "CREATE TABLE t1(id INT PRIMARY KEY, repr floatvector(4));";
277 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, createTableSql));
278
279 char createIndexSql[] = "CREATE INDEX diskann_idx ON t1 USING GSDISKANN(repr L2);";
280 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, createIndexSql));
281
282 uint32_t maxIntPart = 100;
283 uint32_t numSamples = 100;
284 uint32_t dim = 4;
285
286 for (uint16_t i = 0; i < numSamples; i++) {
287 std::string sqlInsert =
288 "INSERT INTO t1 VALUES(" + std::to_string(i) + ", '" + GetRandVector(maxIntPart, dim) + "');";
289 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, sqlInsert.data()));
290 }
291 for (uint16_t i = 0; i < numSamples; i++) {
292 std::string sqlDelete = "DELETE FROM t1 WHERE id = " + std::to_string(i) + ";";
293 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, sqlDelete.data()));
294 }
295
296 char dropSql[] = "DROP TABLE IF EXISTS t1;";
297 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, dropSql));
298
299 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DeleteStoreV2(config));
300 }
301
302 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_006, TestSize.Level1)
303 {
304 auto config = InitRdbConfig();
305 int errCode = OH_Rdb_SetDbType(config, RDB_CAYLEY);
306 EXPECT_TRUE(((!OHOS::NativeRdb::IsUsingArkData()) && errCode == OH_Rdb_ErrCode::RDB_E_NOT_SUPPORTED) ||
307 (OHOS::NativeRdb::IsUsingArkData() && errCode == OH_Rdb_ErrCode::RDB_OK));
308 if (OHOS::NativeRdb::IsUsingArkData()) {
309 VdbTest004(config);
310 }
311 OH_Rdb_DestroyConfig(config);
312 }
313
314 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_007, TestSize.Level1)
315 {
316 auto config = InitRdbConfig();
317 int errCode = OH_Rdb_SetPersistent(config, true);
318 EXPECT_EQ(errCode, OH_Rdb_ErrCode::RDB_OK);
319 errCode = OH_Rdb_SetPersistent(config, false);
320 EXPECT_EQ(errCode, OH_Rdb_ErrCode::RDB_OK);
321 OH_Rdb_DestroyConfig(config);
322 }
323
324 /**
325 * @tc.name: RDB_Native_store_test_008
326 * @tc.desc: invalid args test.
327 * @tc.type: FUNC
328 */
329 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_008, TestSize.Level1)
330 {
331 int errCode = 0;
332 auto config = InitRdbConfig();
333 EXPECT_EQ(OH_Rdb_DeleteStoreV2(nullptr), OH_Rdb_ErrCode::RDB_E_INVALID_ARGS);
334 EXPECT_EQ(OH_Rdb_CreateOrOpen(nullptr, &errCode), nullptr);
335 EXPECT_EQ(OH_Rdb_CreateOrOpen(config, nullptr), nullptr);
336
337 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetPersistent(nullptr, true));
338 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetTokenizer(nullptr, Rdb_Tokenizer::RDB_NONE_TOKENIZER));
339
340 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetArea(nullptr, false));
341 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetEncrypted(nullptr, false));
342 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDbType(nullptr, RDB_SQLITE));
343 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetSecurityLevel(nullptr, S1));
344 OH_Rdb_DestroyConfig(config);
345 }
346
347 /**
348 * @tc.name: RDB_ICU_TEST001
349 * @tc.desc: test apis of icu
350 * @tc.type: FUNC
351 */
352 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_ICU_TEST001, TestSize.Level1)
353 {
354 mkdir(RDB_TEST_PATH, 0770);
355 auto config = InitRdbConfig();
356
357 // invalid param test
358 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS,
359 OH_Rdb_SetTokenizer(config, static_cast<Rdb_Tokenizer>(Rdb_Tokenizer::RDB_NONE_TOKENIZER - 1)));
360 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS,
361 OH_Rdb_SetTokenizer(config, static_cast<Rdb_Tokenizer>(Rdb_Tokenizer::RDB_CUSTOM_TOKENIZER + 1)));
362
363 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetTokenizer(config, Rdb_Tokenizer::RDB_NONE_TOKENIZER));
364 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetTokenizer(config, Rdb_Tokenizer::RDB_CUSTOM_TOKENIZER));
365 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetTokenizer(config, Rdb_Tokenizer::RDB_ICU_TOKENIZER));
366
367 int numType = 0;
368 const int *supportTypeList = OH_Rdb_GetSupportedDbType(&numType);
369 EXPECT_NE(supportTypeList, nullptr);
370 if (numType == 2) {
371 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetDbType(config, RDB_CAYLEY));
372 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_NOT_SUPPORTED,
373 OH_Rdb_SetTokenizer(config, Rdb_Tokenizer::RDB_ICU_TOKENIZER));
374 }
375
376 OH_Rdb_DestroyConfig(config);
377 }
378
379 /**
380 * @tc.name: RDB_ICU_TEST002
381 * @tc.desc: test apis of icu
382 * @tc.type: FUNC
383 */
384 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_ICU_TEST002, TestSize.Level1)
385 {
386 mkdir(RDB_TEST_PATH, 0770);
387 int errCode = 0;
388 auto config = InitRdbConfig();
389
390 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetTokenizer(config, Rdb_Tokenizer::RDB_ICU_TOKENIZER));
391 auto storeConfigV2TestRdbStore = OH_Rdb_CreateOrOpen(config, &errCode);
392 EXPECT_NE(storeConfigV2TestRdbStore, NULL);
393
394 char createTableSql[] = "CREATE VIRTUAL TABLE example USING fts4(name, content, tokenize=icu zh_CN);";
395 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, createTableSql));
396
397 char insertSql1[] =
398 "INSERT INTO example(name, content) VALUES('文档1', '这是一个测试文档,用于测试中文文本的分词和索引。');";
399 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, insertSql1));
400
401 char insertSql2[] =
402 "INSERT INTO example(name, content) VALUES('文档2', '我们将使用这个示例来演示如何在SQLite中进行全文搜索。');";
403 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, insertSql2));
404
405 char insertSql3[] =
406 "INSERT INTO example(name, content) VALUES('文档3', 'ICU分词器能够很好地处理中文文本的分词和分析。');";
407 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, insertSql3));
408
409 char querySql[] = "SELECT * FROM example WHERE example MATCH '测试';";
410 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, querySql));
411
412 OH_Cursor *cursor = OH_Rdb_ExecuteQuery(storeConfigV2TestRdbStore, querySql);
413 EXPECT_NE(cursor, nullptr);
414 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, cursor->goToNextRow(cursor));
415
416 int columnIndex = -1;
417 errCode = cursor->getColumnIndex(cursor, "name", &columnIndex);
418 EXPECT_EQ(columnIndex, 0);
419 char name[10];
420 errCode = cursor->getColumnName(cursor, columnIndex, name, 10);
421 EXPECT_EQ(strcmp(name, "name"), 0);
422
423 size_t size = 0;
424 cursor->getSize(cursor, columnIndex, &size);
425 char data1Value[size + 1];
426 cursor->getText(cursor, columnIndex, data1Value, size + 1);
427 EXPECT_EQ(strcmp(data1Value, "文档1"), 0);
428
429 errCode = cursor->getColumnIndex(cursor, "content", &columnIndex);
430 char name2[10];
431 errCode = cursor->getColumnName(cursor, columnIndex, name2, 10);
432 EXPECT_EQ(strcmp(name2, "content"), 0);
433
434 cursor->getSize(cursor, columnIndex, &size);
435 char data2Value[size + 1];
436 cursor->getText(cursor, columnIndex, data2Value, size + 1);
437 EXPECT_EQ(strcmp(data2Value, "这是一个测试文档,用于测试中文文本的分词和索引。"), 0);
438
439 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_CloseStore(storeConfigV2TestRdbStore));
440 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DeleteStoreV2(config));
441 OH_Rdb_DestroyConfig(config);
442 }
443
444 /**
445 * @tc.name: RDB_Native_store_test_009
446 * @tc.desc: test apis of config interface OH_Rdb_SetCustomDir.
447 * @tc.type: FUNC
448 */
449 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_009, TestSize.Level1)
450 {
451 const char *customDir = "test";
452 auto ret = OH_Rdb_SetCustomDir(nullptr, customDir);
453 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
454
455 ret = OH_Rdb_SetCustomDir(nullptr, "12345678901234567890123456789012345678901234567890"
456 "12345678901234567890123456789012345678901234567890123456789012345678901234567890");
457 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
458
459 OH_Rdb_ConfigV2 *confg = OH_Rdb_CreateConfig();
460 EXPECT_NE(confg, nullptr);
461 ret = OH_Rdb_SetCustomDir(confg, nullptr);
462 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
463
464 ret = OH_Rdb_SetCustomDir(confg, customDir);
465 EXPECT_EQ(ret, RDB_OK);
466
467 ret = OH_Rdb_DestroyConfig(confg);
468 EXPECT_EQ(ret, RDB_OK);
469 }
470
471 /**
472 * @tc.name: RDB_Native_store_test_010
473 * @tc.desc: test apis of config interface OH_Rdb_SetReadOnly.
474 * @tc.type: FUNC
475 */
476 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_010, TestSize.Level1)
477 {
478 OH_Rdb_ConfigV2 *confg = OH_Rdb_CreateConfig();
479 EXPECT_NE(confg, nullptr);
480
481 auto ret = OH_Rdb_SetReadOnly(nullptr, true);
482 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
483
484 ret = OH_Rdb_SetReadOnly(confg, true);
485 EXPECT_EQ(ret, RDB_OK);
486
487 ret = OH_Rdb_SetReadOnly(confg, false);
488 EXPECT_EQ(ret, RDB_OK);
489
490 ret = OH_Rdb_DestroyConfig(confg);
491 EXPECT_EQ(ret, RDB_OK);
492 }
493
494 /**
495 * @tc.name: RDB_Native_store_test_011
496 * @tc.desc: test apis of config interface OH_Rdb_SetPlugins.
497 * @tc.type: FUNC
498 */
499 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_011, TestSize.Level1)
500 {
501 OH_Rdb_ConfigV2 *confg = OH_Rdb_CreateConfig();
502 EXPECT_NE(confg, nullptr);
503
504 const char *plugins[] = { "1" };
505 auto ret = OH_Rdb_SetPlugins(nullptr, plugins, 1);
506 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
507
508 ret = OH_Rdb_SetPlugins(confg, nullptr, 1);
509 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
510
511 ret = OH_Rdb_SetPlugins(confg, plugins, 0);
512 EXPECT_EQ(ret, RDB_OK);
513
514 ret = OH_Rdb_SetPlugins(confg, plugins, 1);
515 EXPECT_EQ(ret, RDB_OK);
516
517 const char *pluginsNew[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "0", "x" };
518 ret = OH_Rdb_SetPlugins(confg, pluginsNew, sizeof(pluginsNew) / sizeof(pluginsNew[0]) - 1);
519 EXPECT_EQ(ret, RDB_OK);
520
521 ret = OH_Rdb_SetPlugins(confg, pluginsNew, sizeof(pluginsNew) / sizeof(pluginsNew[0]));
522 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
523
524 ret = OH_Rdb_DestroyConfig(confg);
525 EXPECT_EQ(ret, RDB_OK);
526 }
527
528 /**
529 * @tc.name: RDB_Native_store_test_012
530 * @tc.desc: test apis of config interface OH_Rdb_SetCryptoParam.
531 * @tc.type: FUNC
532 */
533 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_012, TestSize.Level1)
534 {
535 OH_Rdb_ConfigV2 *confg = OH_Rdb_CreateConfig();
536 EXPECT_NE(confg, nullptr);
537
538 OH_Rdb_CryptoParam *crypto = OH_Rdb_CreateCryptoParam();
539 EXPECT_NE(crypto, NULL);
540
541 auto ret = OH_Rdb_SetCryptoParam(nullptr, crypto);
542 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
543
544 ret = OH_Rdb_SetCryptoParam(confg, nullptr);
545 EXPECT_EQ(ret, RDB_E_INVALID_ARGS);
546
547 ret = OH_Rdb_SetCryptoParam(confg, crypto);
548 EXPECT_EQ(ret, RDB_OK);
549
550 ret = OH_Rdb_DestroyCryptoParam(crypto);
551 EXPECT_EQ(ret, RDB_OK);
552
553 ret = OH_Rdb_DestroyConfig(confg);
554 EXPECT_EQ(ret, RDB_OK);
555 }
556
557 /**
558 * @tc.name: RDB_Native_store_test_013
559 * @tc.desc: abnormal test of RdbNdkUtils::GetRdbStoreConfig, when config is null.
560 * @tc.type: FUNC
561 */
562 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_013, TestSize.Level1)
563 {
564 auto [errCode, rdbConfig] = RdbNdkUtils::GetRdbStoreConfig(nullptr);
565 EXPECT_EQ(errCode, OHOS::NativeRdb::E_INVALID_ARGS);
566 }
567
568 /**
569 * @tc.name: RDB_Native_store_test_014
570 * @tc.desc: abnormal test of RdbNdkUtils::GetRdbStoreConfig, when securityLevel overlimit.
571 * @tc.type: FUNC
572 */
573 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_014, TestSize.Level1)
574 {
575 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
576 EXPECT_NE(config, nullptr);
577 std::shared_ptr<const char> autoRelease = std::shared_ptr<const char>("RDB_Native_store_test_014",
__anond6d5b9040102(const char *) 578 [config](const char *) {
579 OH_Rdb_DestroyConfig(config);
580 });
581 EXPECT_EQ(OH_Rdb_SetDatabaseDir(config, RDB_TEST_PATH), RDB_OK);
582 EXPECT_EQ(OH_Rdb_SetStoreName(config, "rdb_store_test.db"), RDB_OK);
583 EXPECT_EQ(OH_Rdb_SetBundleName(config, "com.ohos.example.distributedndk"), RDB_OK);
584 EXPECT_EQ(OH_Rdb_SetPersistent(config, true), RDB_OK);
585 config->securityLevel = -1;
586 auto [errCode1, _] = RdbNdkUtils::GetRdbStoreConfig(config);
587 EXPECT_EQ(errCode1, OHOS::NativeRdb::E_INVALID_ARGS);
588
589 config->securityLevel = 10;
590 auto [errCode2, __] = RdbNdkUtils::GetRdbStoreConfig(config);
591 EXPECT_EQ(errCode2, OHOS::NativeRdb::E_INVALID_ARGS);
592 }
593
594 /**
595 * @tc.name: RDB_Native_store_test_015
596 * @tc.desc: abnormal test of RdbNdkUtils::GetRdbStoreConfig, when securityLevel overlimit.
597 * @tc.type: FUNC
598 */
599 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_015, TestSize.Level1)
600 {
601 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
602 EXPECT_NE(config, nullptr);
603 std::shared_ptr<const char> autoRelease = std::shared_ptr<const char>("RDB_Native_store_test_015",
__anond6d5b9040202(const char *) 604 [config](const char *) {
605 OH_Rdb_DestroyConfig(config);
606 });
607 EXPECT_EQ(OH_Rdb_SetDatabaseDir(config, RDB_TEST_PATH), RDB_OK);
608 EXPECT_EQ(OH_Rdb_SetStoreName(config, "rdb_store_test.db"), RDB_OK);
609 EXPECT_EQ(OH_Rdb_SetBundleName(config, "com.ohos.example.distributedndk"), RDB_OK);
610 EXPECT_EQ(OH_Rdb_SetPersistent(config, false), RDB_OK);
611 EXPECT_EQ(OH_Rdb_SetSecurityLevel(config, S1), RDB_OK);
612 config->area = -1;
613 auto [errCode1, _] = RdbNdkUtils::GetRdbStoreConfig(config);
614 EXPECT_EQ(errCode1, OHOS::NativeRdb::E_INVALID_ARGS);
615
616 config->area = 10;
617 auto [errCode2, __] = RdbNdkUtils::GetRdbStoreConfig(config);
618 EXPECT_EQ(errCode2, OHOS::NativeRdb::E_INVALID_ARGS);
619 }
620
621 /**
622 * @tc.name: RDB_Native_store_test_016
623 * @tc.desc: abnormal test of RdbNdkUtils::GetRdbStoreConfig, when dbType overlimit.
624 * @tc.type: FUNC
625 */
626 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_016, TestSize.Level1)
627 {
628 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
629 EXPECT_NE(config, nullptr);
630 std::shared_ptr<const char> autoRelease = std::shared_ptr<const char>("RDB_Native_store_test_016",
__anond6d5b9040302(const char *) 631 [config](const char *) {
632 OH_Rdb_DestroyConfig(config);
633 });
634 EXPECT_EQ(OH_Rdb_SetDatabaseDir(config, RDB_TEST_PATH), RDB_OK);
635 EXPECT_EQ(OH_Rdb_SetStoreName(config, "rdb_store_test.db"), RDB_OK);
636 EXPECT_EQ(OH_Rdb_SetBundleName(config, "com.ohos.example.distributedndk"), RDB_OK);
637 EXPECT_EQ(OH_Rdb_SetPersistent(config, true), RDB_OK);
638 EXPECT_EQ(OH_Rdb_SetSecurityLevel(config, S1), RDB_OK);
639 EXPECT_EQ(OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL1), RDB_OK);
640 config->dbType = -1;
641 auto [errCode1, _] = RdbNdkUtils::GetRdbStoreConfig(config);
642 EXPECT_EQ(errCode1, OHOS::NativeRdb::E_INVALID_ARGS);
643
644 config->dbType = 10;
645 auto [errCode2, __] = RdbNdkUtils::GetRdbStoreConfig(config);
646 EXPECT_EQ(errCode2, OHOS::NativeRdb::E_INVALID_ARGS);
647 }
648
649 /**
650 * @tc.name: RDB_Native_store_test_017
651 * @tc.desc: abnormal test of RdbNdkUtils::GetRdbStoreConfig, when token overlimit.
652 * @tc.type: FUNC
653 */
654 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_017, TestSize.Level1)
655 {
656 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
657 EXPECT_NE(config, nullptr);
658 std::shared_ptr<const char> autoRelease = std::shared_ptr<const char>("RDB_Native_store_test_017",
__anond6d5b9040402(const char *) 659 [config](const char *) {
660 OH_Rdb_DestroyConfig(config);
661 });
662 EXPECT_EQ(OH_Rdb_SetDatabaseDir(config, RDB_TEST_PATH), RDB_OK);
663 EXPECT_EQ(OH_Rdb_SetStoreName(config, "rdb_store_test.db"), RDB_OK);
664 EXPECT_EQ(OH_Rdb_SetBundleName(config, "com.ohos.example.distributedndk"), RDB_OK);
665 EXPECT_EQ(OH_Rdb_SetPersistent(config, true), RDB_OK);
666 EXPECT_EQ(OH_Rdb_SetSecurityLevel(config, S1), RDB_OK);
667 EXPECT_EQ(OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL1), RDB_OK);
668 config->token = -1;
669 auto [errCode1, _] = RdbNdkUtils::GetRdbStoreConfig(config);
670 EXPECT_EQ(errCode1, OHOS::NativeRdb::E_INVALID_ARGS);
671
672 config->token = 10;
673 auto [errCode2, __] = RdbNdkUtils::GetRdbStoreConfig(config);
674 EXPECT_EQ(errCode2, OHOS::NativeRdb::E_INVALID_ARGS);
675 }
676
677 /**
678 * @tc.name: RDB_Native_store_test_018
679 * @tc.desc: abnormal test of RdbNdkUtils::GetRdbStoreConfig, when magicNum error.
680 * @tc.type: FUNC
681 */
682 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_018, TestSize.Level1)
683 {
684 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
685 EXPECT_NE(config, nullptr);
686 std::shared_ptr<const char> autoRelease = std::shared_ptr<const char>("RDB_Native_store_test_018",
__anond6d5b9040502(const char *) 687 [config](const char *) {
688 OH_Rdb_DestroyConfig(config);
689 });
690 EXPECT_EQ(OH_Rdb_SetDatabaseDir(config, RDB_TEST_PATH), RDB_OK);
691 EXPECT_EQ(OH_Rdb_SetStoreName(config, "rdb_store_test.db"), RDB_OK);
692 EXPECT_EQ(OH_Rdb_SetBundleName(config, "com.ohos.example.distributedndk"), RDB_OK);
693 EXPECT_EQ(OH_Rdb_SetPersistent(config, true), RDB_OK);
694 EXPECT_EQ(OH_Rdb_SetSecurityLevel(config, S1), RDB_OK);
695 EXPECT_EQ(OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL1), RDB_OK);
696 config->magicNum = 0;
697 auto [errCode1, _] = RdbNdkUtils::GetRdbStoreConfig(config);
698 EXPECT_EQ(errCode1, OHOS::NativeRdb::E_INVALID_ARGS);
699 }
700
701 /**
702 * @tc.name: RDB_Native_store_test_019
703 * @tc.desc: abnormal test of RdbNdkUtils::GetRdbStoreConfig, when magicNum error.
704 * @tc.type: FUNC
705 */
706 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_019, TestSize.Level1)
707 {
708 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
709 EXPECT_NE(config, nullptr);
710 std::shared_ptr<const char> autoRelease = std::shared_ptr<const char>("RDB_Native_store_test_019",
__anond6d5b9040602(const char *) 711 [config](const char *) {
712 OH_Rdb_DestroyConfig(config);
713 });
714 EXPECT_EQ(OH_Rdb_SetSemanticIndex(config, true), RDB_OK);
715 EXPECT_NE(OH_Rdb_SetSemanticIndex(nullptr, true), RDB_OK);
716 }
717