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 "rdb_errno.h"
25 #include "relational_store.h"
26 #include "relational_store_error_code.h"
27 #include "relational_store_impl.h"
28 #include "token_setproc.h"
29
30 using namespace testing::ext;
31 using namespace OHOS::NativeRdb;
32 using namespace OHOS::Security::AccessToken;
33 using namespace OHOS::RdbNdk;
34
35 class RdbNativeStoreConfigV2Test : public testing::Test {
36 public:
37 static void SetUpTestCase(void);
38 static void TearDownTestCase(void);
39 void SetUp();
40 void TearDown();
InitRdbConfig()41 static OH_Rdb_ConfigV2 *InitRdbConfig()
42 {
43 OH_Rdb_ConfigV2 *config = OH_Rdb_CreateConfig();
44 EXPECT_NE(config, nullptr);
45 OH_Rdb_SetDatabaseDir(config, RDB_TEST_PATH);
46 OH_Rdb_SetStoreName(config, "rdb_store_test.db");
47 OH_Rdb_SetBundleName(config, "com.ohos.example.distributedndk");
48 OH_Rdb_SetEncrypted(config, false);
49 OH_Rdb_SetSecurityLevel(config, OH_Rdb_SecurityLevel::S1);
50 OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL1);
51
52 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetDbType(config, RDB_SQLITE));
53 return config;
54 }
55 };
56
SetUpTestCase(void)57 void RdbNativeStoreConfigV2Test::SetUpTestCase(void)
58 {
59 }
60
TearDownTestCase(void)61 void RdbNativeStoreConfigV2Test::TearDownTestCase(void)
62 {
63 }
64
SetUp(void)65 void RdbNativeStoreConfigV2Test::SetUp(void)
66 {
67 }
68
TearDown(void)69 void RdbNativeStoreConfigV2Test::TearDown(void)
70 {
71 }
72
73 /**
74 * @tc.name: RDB_Native_store_test_001
75 * @tc.desc: Normal testCase of store for Update、Query.
76 * @tc.type: FUNC
77 */
78 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_001, TestSize.Level1)
79 {
80 mkdir(RDB_TEST_PATH, 0770);
81 int errCode = 0;
82 auto config = InitRdbConfig();
83 auto storeConfigV2TestRdbStore = OH_Rdb_CreateOrOpen(config, &errCode);
84 EXPECT_NE(storeConfigV2TestRdbStore, NULL);
85 char createTableSql[] = "CREATE TABLE store_test (id INTEGER PRIMARY KEY AUTOINCREMENT, data1 TEXT, data2 INTEGER, "
86 "data3 FLOAT, data4 BLOB, data5 TEXT);";
87 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, createTableSql));
88 char dropTableSql[] = "DROP TABLE IF EXISTS store_test";
89 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_Execute(storeConfigV2TestRdbStore, dropTableSql));
90
91 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_CloseStore(storeConfigV2TestRdbStore));
92 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DeleteStoreV2(config));
93 OH_Rdb_DestroyConfig(config);
94 }
95
96
VdbTest002(const OH_Rdb_ConfigV2 * config)97 void VdbTest002(const OH_Rdb_ConfigV2 *config)
98 {
99 int errCode = OH_Rdb_ErrCode::RDB_OK;
100 auto store = OH_Rdb_CreateOrOpen(config, &errCode);
101 EXPECT_NE(store, nullptr);
102
103 char createTableSql[] = "CREATE TABLE t1(id INT PRIMARY KEY, repr floatvector(4));";
104 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, createTableSql));
105
106 int64_t trxId = 0;
107 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_BeginTransWithTrxId(store, &trxId));
108 char insertSql[] = "INSERT INTO t1 VALUES(2, '[1, 2, 3, 4]');";
109 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, trxId, insertSql));
110 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_CommitByTrxId(store, trxId));
111
112 char querySql[] = "SELECT * FROM t1;";
113 OH_Cursor *cursor = OH_Rdb_ExecuteQuery(store, querySql);
114 EXPECT_NE(cursor, nullptr);
115 int rowCount = 0;
116 cursor->getRowCount(cursor, &rowCount);
117 EXPECT_EQ(1, rowCount);
118 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, cursor->goToNextRow(cursor));
119 int64_t intVal = 0;
120 cursor->getInt64(cursor, 0, &intVal);
121 EXPECT_EQ(2, intVal); // Expect to get 2 as the result
122 cursor->destroy(cursor);
123
124 char dropSql[] = "DROP TABLE IF EXISTS t1;";
125 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_ExecuteByTrxId(store, 0, dropSql));
126
127 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DeleteStoreV2(config));
128 }
129
130 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_002, TestSize.Level1)
131 {
132 auto config = InitRdbConfig();
133 int errCode = OH_Rdb_SetDbType(config, RDB_CAYLEY);
134 EXPECT_TRUE(((!OHOS::NativeRdb::IsUsingArkData()) && errCode == OH_Rdb_ErrCode::RDB_E_NOT_SUPPORTED) ||
135 (OHOS::NativeRdb::IsUsingArkData() && errCode == OH_Rdb_ErrCode::RDB_OK));
136 if (OHOS::NativeRdb::IsUsingArkData()) {
137 VdbTest002(config);
138 }
139 OH_Rdb_DestroyConfig(config);
140 }
141
142 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_003, TestSize.Level1)
143 {
144 int numType = 0;
145 const int *supportTypeList = OH_Rdb_GetSupportedDbType(&numType);
146 EXPECT_NE(supportTypeList, nullptr);
147 EXPECT_TRUE(((!OHOS::NativeRdb::IsUsingArkData()) && numType == 1) || // 1 means only contain RDB_SQLITE
148 ((OHOS::NativeRdb::IsUsingArkData()) && numType == 2)); // 2 means both contain RDB_SQLITE and RDB_CAYLEY
149 EXPECT_EQ(RDB_SQLITE, supportTypeList[0]);
150 if (OHOS::NativeRdb::IsUsingArkData()) {
151 EXPECT_EQ(RDB_CAYLEY, supportTypeList[1]); // 1st element must be RDB_CAYLEY
152 }
153 }
154
155 HWTEST_F(RdbNativeStoreConfigV2Test, RDB_Native_store_test_004, TestSize.Level1)
156 {
157 auto config = InitRdbConfig();
158 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDatabaseDir(config, nullptr));
159 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetStoreName(config, nullptr));
160 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetBundleName(config, nullptr));
161 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetModuleName(config, nullptr));
162
163 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetDatabaseDir(config, ""));
164 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetStoreName(config, ""));
165 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetBundleName(config, ""));
166 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetModuleName(config, ""));
167
168 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetEncrypted(config, false));
169 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetEncrypted(config, true));
170
171 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S1));
172 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S2));
173 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S3));
174 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetSecurityLevel(config, S4));
175 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetSecurityLevel(config, 0)); // 0 is invalid secure level
176 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetSecurityLevel(config, -1)); // -1 is invalid secure level
177 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetSecurityLevel(config, 5)); // 5 is invalid secure level
178
179 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL1));
180 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL2));
181 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL3));
182 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL4));
183 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL5));
184
185 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetArea(config, -1)); // -1 is invalid area level
186 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetArea(config, 0)); // 0 is invalid area level
187 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetArea(config, 8)); // 8 is invalid area level
188
189 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_SetDbType(config, RDB_SQLITE));
190 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDbType(config, 0)); // 0 is invalid db type level
191 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDbType(config, 6)); // 6 is invalid db type level
192 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_SetDbType(config, -1)); // -1 is invalid db type level
193
194 const int *supportList = OH_Rdb_GetSupportedDbType(nullptr);
195 EXPECT_EQ(nullptr, supportList);
196
197 EXPECT_EQ(OH_Rdb_ErrCode::RDB_E_INVALID_ARGS, OH_Rdb_DestroyConfig(nullptr));
198 EXPECT_EQ(OH_Rdb_ErrCode::RDB_OK, OH_Rdb_DestroyConfig(config));
199 }
200