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