Add DB backup unit test for pkg_upgrade 23/261923/5
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 29 Jul 2021 02:29:55 +0000 (11:29 +0900)
committerilho kim <ilho159.kim@samsung.com>
Fri, 20 Aug 2021 06:49:21 +0000 (06:49 +0000)
Change-Id: I3f0e55c4736b1ee4f24c8409ed14660985ec86c5
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
27 files changed:
src/pkg_upgrade/include/pkg_finder.hh
tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db [new file with mode: 0644]
tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db [new file with mode: 0644]
tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser_db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db.bck.flag [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser_db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db-journal [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db.bck [new file with mode: 0644]
tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser_db.bck [new file with mode: 0644]
tests/unit_tests/pkg_upgrade/src/test_pkg_upgrader.cc

index 5259c3b..7da7f15 100644 (file)
@@ -32,7 +32,7 @@ class PkgFinder {
  public:
   PkgFinder();
   ~PkgFinder();
-  int Find();
+  virtual int Find();
   const std::list<PkgContext>& GetOldPkgs() { return old_pkgs_; }
   const std::list<PkgContext>& GetNewPkgs() { return new_pkgs_; }
   void SetManifestDir(std::string dir);
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db
new file mode 100644 (file)
index 0000000..86d5ef2
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db differ
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db-journal b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db-journal
new file mode 100644 (file)
index 0000000..a79929d
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db-journal differ
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck
new file mode 100644 (file)
index 0000000..86d5ef2
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck differ
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck-journal b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck-journal
new file mode 100644 (file)
index 0000000..a79929d
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_cert.db.bck-journal differ
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db
new file mode 100644 (file)
index 0000000..95bb964
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db differ
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db-journal b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db-journal
new file mode 100644 (file)
index 0000000..b20e4d3
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db-journal differ
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db.bck b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db.bck
new file mode 100644 (file)
index 0000000..0b7de15
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser.db.bck differ
diff --git a/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser_db.bck b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser_db.bck
new file mode 100644 (file)
index 0000000..1661251
Binary files /dev/null and b/tests/unit_tests/data/db_bck_malformed/.pkgmgr_parser_db.bck differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db
new file mode 100644 (file)
index 0000000..86d5ef2
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db-journal b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db-journal
new file mode 100644 (file)
index 0000000..a79929d
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db-journal differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck
new file mode 100644 (file)
index 0000000..86d5ef2
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck-journal b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck-journal
new file mode 100644 (file)
index 0000000..a79929d
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_cert.db.bck-journal differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db
new file mode 100644 (file)
index 0000000..95bb964
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db-journal b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db-journal
new file mode 100644 (file)
index 0000000..b20e4d3
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db-journal differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db.bck b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db.bck
new file mode 100644 (file)
index 0000000..a944294
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db.bck differ
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db.bck.flag b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser.db.bck.flag
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser_db.bck b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser_db.bck
new file mode 100644 (file)
index 0000000..1661251
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_flag/.pkgmgr_parser_db.bck differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db
new file mode 100644 (file)
index 0000000..86d5ef2
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db-journal b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db-journal
new file mode 100644 (file)
index 0000000..a79929d
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db-journal differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck
new file mode 100644 (file)
index 0000000..86d5ef2
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck-journal b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck-journal
new file mode 100644 (file)
index 0000000..a79929d
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_cert.db.bck-journal differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db
new file mode 100644 (file)
index 0000000..95bb964
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db-journal b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db-journal
new file mode 100644 (file)
index 0000000..b20e4d3
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db-journal differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db.bck b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db.bck
new file mode 100644 (file)
index 0000000..a944294
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser.db.bck differ
diff --git a/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser_db.bck b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser_db.bck
new file mode 100644 (file)
index 0000000..1661251
Binary files /dev/null and b/tests/unit_tests/data/db_bck_with_not_flag/.pkgmgr_parser_db.bck differ
index 286128b..0dfb622 100644 (file)
@@ -18,6 +18,8 @@
 #include <gtest/gtest.h>
 #include <stdio.h>
 
+#include <sqlite3.h>
+
 #include <memory>
 #include <string>
 #include <vector>
@@ -551,3 +553,103 @@ TEST_F(PkgUpgraderTestForInvalidDbPath, Upgrader_invalid_db) {
   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);
+}