1 /*
2 * Copyright (c) 2021 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 #include <gtest/gtest.h>
17
18 #include <string>
19
20 #include "common.h"
21 #include "rdb_errno.h"
22 #include "rdb_helper.h"
23 #include "rdb_open_callback.h"
24
25 using namespace testing::ext;
26 using namespace OHOS::NativeRdb;
27
28 class RdbUpgradeTest : public testing::Test {
29 public:
30 static void SetUpTestCase(void);
31 static void TearDownTestCase(void);
32 void SetUp();
33 void TearDown();
34 void InsertValues(std::shared_ptr<RdbStore> &store);
35
36 static const std::string DATABASE_NAME;
37 static std::shared_ptr<RdbStore> store;
38 };
39
40 const std::string RdbUpgradeTest::DATABASE_NAME = RDB_TEST_PATH + "upgrade_test.db";
41 std::shared_ptr<RdbStore> RdbUpgradeTest::store = nullptr;
42
43 class UpgradeTestOpenCallback : public RdbOpenCallback {
44 public:
45 int OnCreate(RdbStore &store) override;
46 int OnUpgrade(RdbStore &store, int oldVersion, int newVersion) override;
47 static const std::string CREATE_TABLE_TEST;
48 };
49
50 std::string const UpgradeTestOpenCallback::CREATE_TABLE_TEST =
51 std::string("CREATE TABLE IF NOT EXISTS test ") + std::string("(id INTEGER PRIMARY KEY AUTOINCREMENT, "
52 "name TEXT NOT NULL, age INTEGER, salary "
53 "REAL, blobType BLOB)");
54
OnCreate(RdbStore & store)55 int UpgradeTestOpenCallback::OnCreate(RdbStore &store)
56 {
57 return store.ExecuteSql(CREATE_TABLE_TEST);
58 }
59
OnUpgrade(RdbStore & store,int oldVersion,int newVersion)60 int UpgradeTestOpenCallback::OnUpgrade(RdbStore &store, int oldVersion, int newVersion)
61 {
62 return E_OK;
63 }
64
65 class UpgradeOpenCallback : public RdbOpenCallback {
66 public:
67 int OnCreate(RdbStore &store) override;
68 int OnUpgrade(RdbStore &store, int oldVersion, int newVersion) override;
69 static const std::string UPGRADE_TABLE_TEST;
70 };
71
72 std::string const UpgradeOpenCallback::UPGRADE_TABLE_TEST = std::string("ALTER TABLE test ADD COLUMN address TEXT;");
73
OnCreate(RdbStore & store)74 int UpgradeOpenCallback::OnCreate(RdbStore &store)
75 {
76 return E_OK;
77 }
78
OnUpgrade(RdbStore & store,int oldVersion,int newVersion)79 int UpgradeOpenCallback::OnUpgrade(RdbStore &store, int oldVersion, int newVersion)
80 {
81 return store.ExecuteSql(UPGRADE_TABLE_TEST);
82 }
83
SetUpTestCase(void)84 void RdbUpgradeTest::SetUpTestCase(void)
85 {
86 int errCode = E_OK;
87 RdbHelper::DeleteRdbStore(RdbUpgradeTest::DATABASE_NAME);
88 RdbStoreConfig config(RdbUpgradeTest::DATABASE_NAME);
89 UpgradeTestOpenCallback helper;
90 RdbUpgradeTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
91 EXPECT_NE(RdbUpgradeTest::store, nullptr);
92 }
93
TearDownTestCase(void)94 void RdbUpgradeTest::TearDownTestCase(void)
95 {
96 store = nullptr;
97 RdbHelper::DeleteRdbStore(RdbUpgradeTest::DATABASE_NAME);
98 }
99
SetUp(void)100 void RdbUpgradeTest::SetUp(void)
101 {
102 store->ExecuteSql("DELETE FROM test");
103 }
104
TearDown(void)105 void RdbUpgradeTest::TearDown(void)
106 {
107 }
108
109 /**
110 * @tc.name: RdbStore_Upgrade_001
111 * @tc.desc: test RdbStore upgrade
112 * @tc.type: FUNC
113 */
114 HWTEST_F(RdbUpgradeTest, RdbStore_Upgrade_001, TestSize.Level1)
115 {
116 RdbUpgradeTest::InsertValues(RdbUpgradeTest::store);
117
118 std::shared_ptr<ResultSet> resultSet = RdbUpgradeTest::store->QuerySql("SELECT * FROM test");
119 EXPECT_NE(resultSet, nullptr);
120 int ret = resultSet->GoToNextRow();
121 EXPECT_EQ(ret, E_OK);
122 ret = resultSet->GoToNextRow();
123 EXPECT_EQ(ret, E_OK);
124 ret = resultSet->GoToNextRow();
125 EXPECT_EQ(ret, E_OK);
126 ret = resultSet->GoToNextRow();
127 EXPECT_EQ(ret, E_ROW_OUT_RANGE);
128 ret = resultSet->Close();
129 EXPECT_EQ(ret, E_OK);
130 RdbHelper::ClearCache();
131
132 int errCode = E_OK;
133 RdbStoreConfig config(RdbUpgradeTest::DATABASE_NAME);
134 UpgradeOpenCallback callBack;
135 std::shared_ptr<RdbStore> upgradeStore = RdbHelper::GetRdbStore(config, 2, callBack, errCode);
136 EXPECT_NE(upgradeStore, nullptr);
137 std::shared_ptr<ResultSet> upgradeResultSet = upgradeStore->QuerySql("SELECT * FROM test");
138 EXPECT_NE(upgradeResultSet, nullptr);
139 int columnCount;
140 ret = upgradeResultSet->GetColumnCount(columnCount);
141 EXPECT_EQ(ret, E_OK);
142 EXPECT_EQ(columnCount, 6);
143 ret = upgradeResultSet->GoToNextRow();
144 int columnIndex;
145 ret = upgradeResultSet->GetColumnIndex("id", columnIndex);
146 EXPECT_EQ(ret, E_OK);
147 ret = upgradeResultSet->GetColumnIndex("name", columnIndex);
148 EXPECT_EQ(ret, E_OK);
149 ret = upgradeResultSet->GetColumnIndex("age", columnIndex);
150 EXPECT_EQ(ret, E_OK);
151 ret = upgradeResultSet->GetColumnIndex("salary", columnIndex);
152 EXPECT_EQ(ret, E_OK);
153 ret = upgradeResultSet->GetColumnIndex("blobType", columnIndex);
154 EXPECT_EQ(ret, E_OK);
155 ret = upgradeResultSet->GetColumnIndex("address", columnIndex);
156 EXPECT_EQ(ret, E_OK);
157 ret = upgradeResultSet->GoToNextRow();
158 EXPECT_EQ(ret, E_OK);
159 ret = upgradeResultSet->GoToNextRow();
160 EXPECT_EQ(ret, E_OK);
161 ret = upgradeResultSet->GoToNextRow();
162 EXPECT_EQ(ret, E_ROW_OUT_RANGE);
163 ret = upgradeResultSet->Close();
164 EXPECT_EQ(ret, E_OK);
165 }
166
InsertValues(std::shared_ptr<RdbStore> & store)167 void RdbUpgradeTest::InsertValues(std::shared_ptr<RdbStore> &store)
168 {
169 int64_t id;
170 ValuesBucket values;
171
172 values.PutInt("id", 1);
173 values.PutString("name", std::string("zhangsan"));
174 values.PutInt("age", 18);
175 values.PutDouble("salary", 100.5);
176 values.PutBlob("blobType", std::vector<uint8_t>{ 1, 2, 3 });
177 int ret = store->Insert(id, "test", values);
178 EXPECT_EQ(ret, E_OK);
179 EXPECT_EQ(1, id);
180
181 values.Clear();
182 values.PutInt("id", 2);
183 values.PutString("name", std::string("lisi"));
184 values.PutInt("age", 19);
185 values.PutDouble("salary", 200.5);
186 values.PutBlob("blobType", std::vector<uint8_t>{ 4, 5, 6 });
187 ret = store->Insert(id, "test", values);
188 EXPECT_EQ(ret, E_OK);
189 EXPECT_EQ(2, id);
190
191 values.Clear();
192 values.PutInt("id", 3);
193 values.PutString("name", std::string("wangyjing"));
194 values.PutInt("age", 20);
195 values.PutDouble("salary", 300.5);
196 values.PutBlob("blobType", std::vector<uint8_t>{ 7, 8, 9 });
197 ret = store->Insert(id, "test", values);
198 EXPECT_EQ(ret, E_OK);
199 EXPECT_EQ(3, id);
200 }
201