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
16 #define LOG_TAG "GdbGrdApiTest"
17 #include <dlfcn.h>
18 #include <gtest/gtest.h>
19
20 #include <cstdint>
21 #include <string>
22 #include <variant>
23
24 #include "gdb_errors.h"
25 #include "db_store_manager.h"
26 #include "gdb_helper.h"
27 #include "grd_adapter.h"
28 #include "grd_adapter_manager.h"
29 #include "grd_error.h"
30 #include "logger.h"
31
32 using namespace testing::ext;
33 using namespace OHOS::DistributedDataAip;
34 class GdbGrdApiTest : public testing::Test {
35 public:
36 static void SetUpTestCase();
37 static void TearDownTestCase();
38 void SetUp();
39 void TearDown();
40 };
41
SetUpTestCase()42 void GdbGrdApiTest::SetUpTestCase()
43 {
44 LOG_INFO("SetUpTestCase");
45 }
46
TearDownTestCase()47 void GdbGrdApiTest::TearDownTestCase()
48 {
49 LOG_INFO("TearDownTestCase");
50 }
51
SetUp()52 void GdbGrdApiTest::SetUp()
53 {
54 LOG_INFO("SetUp");
55 if (!IsSupportArkDataDb()) {
56 GTEST_SKIP() << "Current testcase is not compatible from current gdb";
57 }
58 }
59
TearDown()60 void GdbGrdApiTest::TearDown()
61 {
62 LOG_INFO("TearDown");
63 }
64
65 HWTEST_F(GdbGrdApiTest, GdbStore_GrdApi_TransType01, TestSize.Level1)
66 {
67 auto type = GrdAdapter::TransColType(GRD_DB_DATATYPE_INTEGER);
68 EXPECT_EQ(type, ColumnType::TYPE_INTEGER);
69 type = GrdAdapter::TransColType(GRD_DB_DATATYPE_FLOAT);
70 EXPECT_EQ(type, ColumnType::TYPE_FLOAT);
71 type = GrdAdapter::TransColType(GRD_DB_DATATYPE_TEXT);
72 EXPECT_EQ(type, ColumnType::TYPE_TEXT);
73 type = GrdAdapter::TransColType(GRD_DB_DATATYPE_BLOB);
74 EXPECT_EQ(type, ColumnType::TYPE_BLOB);
75 type = GrdAdapter::TransColType(GRD_DB_DATATYPE_FLOATVECTOR);
76 EXPECT_EQ(type, ColumnType::TYPE_FLOATVECTOR);
77 type = GrdAdapter::TransColType(GRD_DB_DATATYPE_JSONSTR);
78 EXPECT_EQ(type, ColumnType::TYPE_JSONSTR);
79 type = GrdAdapter::TransColType(GRD_DB_DATATYPE_NULL);
80 EXPECT_EQ(type, ColumnType::TYPE_NULL);
81 type = GrdAdapter::TransColType(-1);
82 EXPECT_EQ(type, ColumnType::TYPE_NULL);
83 type = GrdAdapter::TransColType(7);
84 EXPECT_EQ(type, ColumnType::TYPE_NULL);
85 }
86
87 HWTEST_F(GdbGrdApiTest, GdbStore_GrdApi_NotUsed01, TestSize.Level1)
88 {
89 std::string createGql = "CREATE GRAPH test {(person:Person {name STRING} )};";
90 std::string dbPath = "/data/test.db";
91 std::string backupPath = "/data/testBackup.db";
92 GDBHelper::DeleteDBStore({"test", "/data"});
93 if (g_library != nullptr) {
94 dlclose(g_library);
95 }
96 GRD_DB *db = nullptr;
97 auto ret = GrdAdapter::Open(dbPath.c_str(), "", GRD_DB_OPEN_CREATE, &db);
98 EXPECT_EQ(ret, E_OK);
99
100 if (g_library != nullptr) {
101 dlclose(g_library);
102 }
103 std::vector<uint8_t> entryKey = { 't', 'e', 's', 't' };
104 ret = GrdAdapter::Backup(db, backupPath.c_str(), entryKey);
105 EXPECT_EQ(ret, E_NOT_SUPPORT);
106
107 if (g_library != nullptr) {
108 dlclose(g_library);
109 }
110 ret = GrdAdapter::Close(db, 0);
111 EXPECT_EQ(ret, E_OK);
112
113 if (g_library != nullptr) {
114 dlclose(g_library);
115 }
116 ret = GrdAdapter::Restore(dbPath.c_str(), backupPath.c_str(), entryKey);
117 EXPECT_EQ(ret, E_NOT_SUPPORT);
118
119 if (g_library != nullptr) {
120 dlclose(g_library);
121 }
122 ret = GrdAdapter::Repair(dbPath.c_str(), "");
123 EXPECT_EQ(ret, E_NOT_SUPPORT);
124
125 if (g_library != nullptr) {
126 dlclose(g_library);
127 }
128 ret = GrdAdapter::Rekey(dbPath.c_str(), "", std::vector<uint8_t>());
129 EXPECT_EQ(ret, E_GRD_INVALID_ARGS);
130 GDBHelper::DeleteDBStore({"test", "/data"});
131 }
132
133 HWTEST_F(GdbGrdApiTest, GdbStore_GrdApi_NotUsed02, TestSize.Level1)
134 {
135 std::string createGql = "CREATE GRAPH test {(person:Person {name STRING} )};";
136 std::string dbPath = "/data/test.db";
137 std::string backupPath = "/data/testBackup.db";
138 GDBHelper::DeleteDBStore({"test", "/data"});
139 GRD_DB *db = nullptr;
140 if (g_library != nullptr) {
141 dlclose(g_library);
142 }
143 auto ret = GrdAdapter::Open(dbPath.c_str(), "", GRD_DB_OPEN_CREATE, &db);
144 EXPECT_EQ(ret, E_OK);
145
146 if (g_library != nullptr) {
147 dlclose(g_library);
148 }
149 GRD_Stmt *stmt = nullptr;
150 ret = GrdAdapter::Prepare(db, createGql.c_str(), createGql.size(), &stmt, nullptr);
151 EXPECT_EQ(ret, E_OK);
152
153 if (g_library != nullptr) {
154 dlclose(g_library);
155 }
156 ret = GrdAdapter::Reset(stmt);
157 EXPECT_EQ(ret, E_OK);
158
159 if (g_library != nullptr) {
160 dlclose(g_library);
161 }
162 auto result = GrdAdapter::ColumnBytes(stmt, 0);
163 EXPECT_EQ(result, 0);
164
165 if (g_library != nullptr) {
166 dlclose(g_library);
167 }
168 auto result2 = GrdAdapter::ColumnInt64(stmt, 0);
169 EXPECT_EQ(result2, 0);
170
171 result2 = GrdAdapter::ColumnInt(stmt, 0);
172 EXPECT_EQ(result2, 0);
173
174 auto result3 = GrdAdapter::ColumnDouble(stmt, 0);
175 EXPECT_EQ(result3, 0.0);
176
177 if (g_library != nullptr) {
178 dlclose(g_library);
179 }
180 auto value = GrdAdapter::ColumnValue(stmt, 0);
181 EXPECT_EQ(value.type, GRD_DB_DATATYPE_NULL);
182 ret = StoreManager::GetInstance().Delete(dbPath);
183 EXPECT_EQ(ret, 1);
184 ret = StoreManager::GetInstance().Delete(backupPath);
185 EXPECT_EQ(ret, 1);
186 GDBHelper::DeleteDBStore({"test", "/data"});
187 }