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 #define LOG_TAG "RdbCallbackIcuTest"
16 #include <gtest/gtest.h>
17
18 #include <string>
19
20 #include "common.h"
21 #include "logger.h"
22 #include "rdb_errno.h"
23 #include "rdb_helper.h"
24 #include "rdb_open_callback.h"
25
26 using namespace testing::ext;
27 using namespace OHOS::Rdb;
28 using namespace OHOS::NativeRdb;
29
30 class RdbCallbackIcuTest : public testing::Test {
31 public:
32 static void SetUpTestCase(void);
33 static void TearDownTestCase(void);
34 void SetUp();
35 void TearDown();
36
37 static const std::string databaseName;
38 };
39
40 const std::string RdbCallbackIcuTest::databaseName = RDB_TEST_PATH + "open_helper.db";
41
SetUpTestCase(void)42 void RdbCallbackIcuTest::SetUpTestCase(void)
43 {
44 }
45
TearDownTestCase(void)46 void RdbCallbackIcuTest::TearDownTestCase(void)
47 {
48 RdbHelper::DeleteRdbStore(RdbCallbackIcuTest::databaseName);
49 }
50
SetUp(void)51 void RdbCallbackIcuTest::SetUp(void)
52 {
53 }
54
TearDown(void)55 void RdbCallbackIcuTest::TearDown(void)
56 {
57 RdbHelper::ClearCache();
58 }
59
60 class OpenCallbackIcu : public RdbOpenCallback {
61 public:
62 int OnCreate(RdbStore &store) override;
63 int OnUpgrade(RdbStore &store, int oldVersion, int newVersion) override;
64 int OnDowngrade(RdbStore &store, int oldVersion, int newVersion) override;
65 int OnOpen(RdbStore &store) override;
66
67 static std::string CreateTableSQL(const std::string &tableName);
68 static std::string DropTableSQL(const std::string &tableName);
69 };
70
CreateTableSQL(const std::string & tableName)71 std::string OpenCallbackIcu::CreateTableSQL(const std::string &tableName)
72 {
73 return "CREATE VIRTUAL TABLE IF NOT EXISTS " + tableName + " USING fts4(name, content, tokenize=icu zh_CN);";
74 }
75
DropTableSQL(const std::string & tableName)76 std::string OpenCallbackIcu::DropTableSQL(const std::string &tableName)
77 {
78 return "DROP TABLE IF EXISTS " + tableName + ";";
79 }
80
OnCreate(RdbStore & store)81 int OpenCallbackIcu::OnCreate(RdbStore &store)
82 {
83 return store.ExecuteSql(CreateTableSQL("test1"));
84 }
85
OnUpgrade(RdbStore & store,int oldVersion,int newVersion)86 int OpenCallbackIcu::OnUpgrade(RdbStore &store, int oldVersion, int newVersion)
87 {
88 return E_OK;
89 }
90
OnDowngrade(RdbStore & store,int oldVersion,int newVersion)91 int OpenCallbackIcu::OnDowngrade(RdbStore &store, int oldVersion, int newVersion)
92 {
93 return E_OK;
94 }
95
OnOpen(RdbStore & store)96 int OpenCallbackIcu::OnOpen(RdbStore &store)
97 {
98 return E_OK;
99 }
100
101 /**
102 * @tc.name: RdbCallbackIcu_01
103 * @tc.desc: test RdbCallbackIcu
104 * @tc.type: FUNC
105 */
106 HWTEST_F(RdbCallbackIcuTest, RdbCallbackIcu_01, TestSize.Level1)
107 {
108 RdbStoreConfig config(RdbCallbackIcuTest::databaseName);
109 config.SetTokenizer(ICU_TOKENIZER);
110 OpenCallbackIcu helper;
111
112 int errCode = E_OK;
113 std::shared_ptr<RdbStore> store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
114 ASSERT_NE(store, nullptr);
115 ASSERT_EQ(errCode, E_OK);
116
117 const char *sqlCreateTable = "CREATE VIRTUAL TABLE example USING fts4(name, content, tokenize=icu zh_CN);";
118 int ret = store->ExecuteSql(sqlCreateTable);
119 EXPECT_EQ(ret, E_OK);
120
121 const char *sqlInsert1 =
122 "INSERT INTO example(name, content) VALUES('文档1', '这是一个测试文档,用于测试中文文本的分词和索引。');";
123 ret = store->ExecuteSql(sqlInsert1);
124 EXPECT_EQ(ret, E_OK);
125
126 const char *sqlInsert2 =
127 "INSERT INTO example(name, content) VALUES('文档2', '我们将使用这个示例来演示如何在SQLite中进行全文搜索。');";
128 ret = store->ExecuteSql(sqlInsert2);
129 EXPECT_EQ(ret, E_OK);
130
131 const char *sqlInsert3 =
132 "INSERT INTO example(name, content) VALUES('文档3', 'ICU分词器能够很好地处理中文文本的分词和分析。');";
133 ret = store->ExecuteSql(sqlInsert3);
134 EXPECT_EQ(ret, E_OK);
135
136 const char *sqlQuery = "SELECT * FROM example WHERE example MATCH '测试';";
137 ret = store->ExecuteSql(sqlQuery);
138 EXPECT_EQ(ret, E_OK);
139
140 std::shared_ptr<ResultSet> resultSet = store->QuerySql(sqlQuery);
141 ASSERT_NE(resultSet, nullptr);
142
143 ret = resultSet->GoToNextRow();
144 EXPECT_EQ(ret, E_OK);
145
146 int columnIndex;
147 std::string strVal;
148
149 ret = resultSet->GetColumnIndex("name", columnIndex);
150 EXPECT_EQ(ret, E_OK);
151 ret = resultSet->GetString(columnIndex, strVal);
152 EXPECT_EQ(ret, E_OK);
153 EXPECT_EQ("文档1", strVal);
154
155 ret = resultSet->GetColumnIndex("content", columnIndex);
156 EXPECT_EQ(ret, E_OK);
157 ret = resultSet->GetString(columnIndex, strVal);
158 EXPECT_EQ(ret, E_OK);
159 EXPECT_EQ("这是一个测试文档,用于测试中文文本的分词和索引。", strVal);
160
161 ret = resultSet->GoToNextRow();
162 EXPECT_EQ(ret, E_ROW_OUT_RANGE);
163
164 ret = resultSet->Close();
165 EXPECT_EQ(ret, E_OK);
166 }