#include <gtest/gtest.h>
#include <stdio.h>
+#include <sqlite3.h>
+
#include <memory>
#include <string>
#include <vector>
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/invalid_path");
EXPECT_FALSE(upgrader.Process(&finder_));
}
+
+class PkgUpgraderTestForDBBackup : public TestFixture {
+ public:
+ class PkgFinderMock : public PkgFinder {
+ public:
+ MOCK_METHOD0(Find, int());
+ };
+
+ PkgUpgraderTestForDBBackup() : TestFixture(std::make_unique<Mocks>()) {}
+ virtual ~PkgUpgraderTestForDBBackup() {}
+
+ virtual void SetUp() {
+ EXPECT_CALL(finder_, Find()).WillOnce(testing::Return(-1));
+ }
+
+ virtual void TearDown() {
+ }
+
+ std::string GetUserVersion(std::string path) {
+ char query[] = "PRAGMA user_version";
+ sqlite3* db;
+ sqlite3_stmt* stmt;
+
+ if (sqlite3_open_v2(path.c_str(), &db,
+ SQLITE_OPEN_READONLY, nullptr) != SQLITE_OK)
+ return {};
+ std::unique_ptr<sqlite3, decltype(sqlite3_close_v2)*> db_ptr(
+ db, sqlite3_close_v2);
+
+ if (sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL) != SQLITE_OK)
+ return {};
+ std::unique_ptr<sqlite3_stmt, decltype(sqlite3_finalize)*> stmt_ptr(
+ stmt, sqlite3_finalize);
+
+ if (sqlite3_step(stmt) != SQLITE_ROW)
+ return {};
+
+ const char* val = reinterpret_cast<const char*>(
+ sqlite3_column_text(stmt, 0));
+ if (!val)
+ return {};
+
+ return val;
+ }
+
+ PkgFinderMock finder_;
+};
+
+TEST_F(PkgUpgraderTestForDBBackup, WithNotBackupFlag) {
+ std::string db_path = "./tests/unit_tests/data/db_bck_with_not_flag";
+ std::string parser_db_path = db_path + "/.pkgmgr_parser.db";
+ std::string parser_db_bck_path = db_path + "/.pkgmgr_parser.db.bck";
+
+ std::string origin_user_version = GetUserVersion(parser_db_path);
+ std::string backup_user_version = GetUserVersion(parser_db_bck_path);
+ EXPECT_FALSE(origin_user_version.empty());
+ EXPECT_FALSE(backup_user_version.empty());
+ EXPECT_NE(origin_user_version, backup_user_version);
+
+ Upgrader upgrader;
+ upgrader.SetDbPath(db_path);
+ EXPECT_TRUE(upgrader.Process(&finder_));
+
+ std::string new_user_version = GetUserVersion(parser_db_path);
+ EXPECT_EQ(backup_user_version, new_user_version);
+}
+
+TEST_F(PkgUpgraderTestForDBBackup, WithBackupFlag) {
+ std::string db_path = "./tests/unit_tests/data/db_bck_with_flag";
+ std::string parser_db_path = db_path + "/.pkgmgr_parser.db";
+ std::string parser_db_bck_path = db_path + "/.pkgmgr_parser.db.bck";
+
+ std::string origin_user_version = GetUserVersion(parser_db_path);
+ std::string backup_user_version = GetUserVersion(parser_db_bck_path);
+ EXPECT_FALSE(origin_user_version.empty());
+ EXPECT_FALSE(backup_user_version.empty());
+ EXPECT_NE(origin_user_version, backup_user_version);
+
+ Upgrader upgrader;
+ upgrader.SetDbPath(db_path);
+ EXPECT_TRUE(upgrader.Process(&finder_));
+
+ std::string new_user_version = GetUserVersion(parser_db_path);
+ EXPECT_EQ(origin_user_version, new_user_version);
+}
+
+TEST_F(PkgUpgraderTestForDBBackup, WithMalformedBackupDB) {
+ std::string db_path = "./tests/unit_tests/data/db_bck_malformed";
+ std::string parser_db_path = db_path + "/.pkgmgr_parser.db";
+
+ std::string origin_user_version = GetUserVersion(parser_db_path);
+ EXPECT_FALSE(origin_user_version.empty());
+
+ Upgrader upgrader;
+ upgrader.SetDbPath(db_path);
+ EXPECT_TRUE(upgrader.Process(&finder_));
+
+ std::string new_user_version = GetUserVersion(parser_db_path);
+ EXPECT_EQ(origin_user_version, new_user_version);
+}