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