#include "mock/os_mock.h"
#include "mock/pkgmgr_info_mock.h"
+#include "mock/pkgmgr_parser_mock.h"
#include "mock/aul_mock.h"
#include "mock/test_fixture.h"
#include "pkg_finder.hh"
using common_fota::Upgrader;
class Mocks : public ::testing::NiceMock<PkgMgrInfoMock>,
- public ::testing::NiceMock<OsMock> {};
+ public ::testing::NiceMock<OsMock>,
+ public ::testing::NiceMock<PkgMgrParserMock> {};
+
+class PkgInfo {
+public:
+ PkgInfo(const char* id, const char* type, const char* version,
+ bool is_update, bool is_preload, bool is_readonly) :
+ id_(id), type_(type), version_(version), is_update_(is_update),
+ is_preload_(is_preload), is_readonly_(is_readonly) {}
+
+ const char* id_;
+ const char* type_;
+ const char* version_;
+ bool is_update_;
+ bool is_preload_;
+ bool is_readonly_;
+};
class PkgFinderTest : public TestFixture {
public:
virtual void TearDown() {
}
- void SetOldPkgInfo(const char* ro_pkg_id, const char* ro_pkg_type,
- const char* ro_pkg_version, const char* rw_pkg_id,
- const char* rw_pkg_type, const char* rw_pkg_version) {
+ void SetOldPkgInfo(const std::vector<PkgInfo>& pkgs) {
static int k;
pkgmgrinfo_pkginfo_filter_h dummy_filter = (pkgmgrinfo_pkginfo_filter_h)&k;
EXPECT_CALL(GetMock<PkgMgrInfoMock>(), pkgmgrinfo_pkginfo_filter_create(_))
.WillRepeatedly(DoAll(SetArgPointee<0>(dummy_filter), Return(0)));
- EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
- pkgmgrinfo_pkginfo_filter_add_bool(_, _, _))
- .WillRepeatedly(Return(0));
+ int pkgs_size = pkgs.size();
EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
pkgmgrinfo_pkginfo_filter_foreach_pkginfo(_, _, _))
.WillOnce(
- Invoke([](pkgmgrinfo_pkginfo_filter_h handle,
+ Invoke([pkgs_size](pkgmgrinfo_pkginfo_filter_h handle,
pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) -> int {
- pkg_cb(nullptr, user_data);
+ for (int i = 0; i < pkgs_size; ++i)
+ pkg_cb(nullptr, user_data);
return 0;
})
- )
- .WillOnce(Invoke([](pkgmgrinfo_pkginfo_filter_h handle,
- pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data) -> int {
- pkg_cb(nullptr, user_data);
- return 0;
- }));
- EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
- pkgmgrinfo_pkginfo_get_pkgid(_, _))
- .WillOnce(DoAll(SetArgPointee<1>(
- const_cast<char*>(ro_pkg_id)), Return(0)))
- .WillOnce(DoAll(SetArgPointee<1>(
- const_cast<char*>(rw_pkg_id)), Return(0)));
- EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
- pkgmgrinfo_pkginfo_get_type(_, _))
- .WillOnce(DoAll(SetArgPointee<1>(
- const_cast<char*>(ro_pkg_type)), Return(0)))
- .WillOnce(DoAll(SetArgPointee<1>(
- const_cast<char*>(rw_pkg_type)), Return(0)));
- EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
- pkgmgrinfo_pkginfo_get_version(_, _))
- .WillOnce(DoAll(SetArgPointee<1>(
- const_cast<char*>(ro_pkg_version)), Return(0)))
- .WillOnce(DoAll(SetArgPointee<1>(
- const_cast<char*>(rw_pkg_version)), Return(0)));
+ );
+ auto& get_pkgid_mock = EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
+ pkgmgrinfo_pkginfo_get_pkgid(_, _));
+ for (const auto& pkg : pkgs)
+ get_pkgid_mock.WillOnce(DoAll(SetArgPointee<1>(
+ const_cast<char*>(pkg.id_)), Return(0)));
+ auto& get_type_mock = EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
+ pkgmgrinfo_pkginfo_get_type(_, _));
+ for (const auto& pkg : pkgs)
+ get_type_mock.WillOnce(DoAll(SetArgPointee<1>(
+ const_cast<char*>(pkg.type_)), Return(0)));
+ auto& get_version_mock = EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
+ pkgmgrinfo_pkginfo_get_version(_, _));
+ for (const auto& pkg : pkgs)
+ get_version_mock.WillOnce(DoAll(SetArgPointee<1>(
+ const_cast<char*>(pkg.version_)), Return(0)));
+ auto& get_is_update_mock = EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
+ pkgmgrinfo_pkginfo_is_update(_, _));
+ for (const auto& pkg : pkgs)
+ get_is_update_mock.WillOnce(DoAll(SetArgPointee<1>(
+ pkg.is_update_), Return(0)));
+ auto& get_is_preload_mock = EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
+ pkgmgrinfo_pkginfo_is_preload(_, _));
+ for (const auto& pkg : pkgs)
+ get_is_preload_mock.WillOnce(DoAll(SetArgPointee<1>(
+ pkg.is_preload_), Return(0)));
+ auto& get_is_readonly_mock = EXPECT_CALL(GetMock<PkgMgrInfoMock>(),
+ pkgmgrinfo_pkginfo_is_readonly(_, _));
+ for (const auto& pkg : pkgs)
+ get_is_readonly_mock.WillOnce(DoAll(SetArgPointee<1>(
+ pkg.is_readonly_), Return(0)));
EXPECT_CALL(GetMock<PkgMgrInfoMock>(), pkgmgrinfo_pkginfo_filter_destroy(_))
.WillRepeatedly(Return(0));
};
TEST_F(PkgFinderTest, PkgFinder) {
- SetOldPkgInfo("org.tizen.alarm", "tpk", "1.0.0", // RO
- "org.test.test1", "wgt", "1.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.alarm", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.test.test1", "wgt", "1.0.0", false, true, false),
+ });
finder_.Find();
EXPECT_EQ(finder_.GetOldPkgs().size(), 2);
TEST_F(PkgFinderTest, PkgUpgraderFactory) {
PkgUpgraderFactory factory;
- SetOldPkgInfo("org.tizen.alarm", "tpk", "1.0.0", // RO
- "org.test.test1", "wgt", "1.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.alarm", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.test.test1", "wgt", "1.0.0", false, true, false),
+ });
auto list = factory.MakeList(&finder_);
EXPECT_EQ(list.size(), 2);
TEST_F(PkgFinderTest, PriorityList) {
PkgUpgraderFactory factory;
- SetOldPkgInfo("org.tizen.alarm", "tpk", "1.0.0", // RO
- "org.test.test1", "wgt", "1.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.alarm", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.test.test1", "wgt", "1.0.0", false, true, false),
+ });
finder_.SetPriorityListPath(
"./tests/unit_tests/pkg_upgrade/data/priority_list");
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.alarm", "tpk", "1.0.0", // RO
- "org.tizen.new_rw", "tpk", "1.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.alarm", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.tizen.new_rw", "tpk", "1.0.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.alarm", "tpk", "2.0.0", // RO
- "org.tizen.new_rw", "tpk", "1.2.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.alarm", "tpk", "2.0.0", false, true, true),
+ PkgInfo("org.tizen.new_rw", "tpk", "1.2.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.alarm", "tpk", "2.5.0", // RO
- "org.tizen.new_rw", "tpk", "2.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.alarm", "tpk", "2.5.0", false, true, true),
+ PkgInfo("org.tizen.new_rw", "tpk", "2.0.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.test.del", "tpk", "1.0.0", // RO
- "org.tizen.new_rw", "tpk", "1.2.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.test.del", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.tizen.new_rw", "tpk", "1.2.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.alarm", "tpk", "2.0.0", // RO
- "org.test.don'tDel", "tpk", "1.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.alarm", "tpk", "2.0.0", false, true, true),
+ PkgInfo("org.test.don'tDel", "tpk", "1.0.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.test", "tpk", "1.0.0", // RO
- "org.tizen.alarm", "tpk", "1.5.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.test", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "1.5.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.test", "tpk", "1.0.0", // RO
- "org.tizen.alarm", "tpk", "2.5.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.test", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "2.5.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.test", "tpk", "1.0.0", // RO
- "org.tizen.alarm", "tpk", "2.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.test", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "2.0.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.new_rw", "tpk", "1.0.0", // RO
- "org.tizen.alarm", "tpk", "2.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.new_rw", "tpk", "1.0.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "2.0.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.new_rw", "tpk", "2.0.0", // RO
- "org.tizen.alarm", "tpk", "2.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.new_rw", "tpk", "2.0.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "2.0.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
Upgrader upgrader;
upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
std::vector<std::string> cmds;
- SetOldPkgInfo("org.tizen.new_rw", "tpk", "1.2.0", // RO
- "org.tizen.alarm", "tpk", "2.0.0"); // RW
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.new_rw", "tpk", "1.2.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "2.0.0", false, true, false),
+ });
// New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
EXPECT_CALL(GetMock<OsMock>(),
EXPECT_TRUE(upgrader.Process(&finder_));
}
+TEST_F(PkgUpgraderTest, Upgrader_RW2ADDED_RO_LOW_VERSION) {
+ Upgrader upgrader;
+ upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
+ std::vector<std::string> cmds;
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.new_rw", "tpk", "1.2.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "3.0.0", false, false, false)
+ });
+ // New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
+
+ EXPECT_CALL(GetMock<OsMock>(),
+ execvp(_, _))
+ .WillRepeatedly(
+ Invoke([&](const char* file, char* const argv[]) -> int {
+ std::string cmd = GetCmd(argv);
+ cmds.push_back(std::move(cmd));
+ return 0;
+ }));
+ EXPECT_CALL(GetMock<PkgMgrParserMock>(),
+ pkgmgr_parser_update_rw_to_ro_updated_pkg_in_db(_))
+ .WillOnce(Return(0));
+
+ ASSERT_TRUE(upgrader.Process(&finder_));
+
+ EXPECT_EQ(cmds.size(), 5);
+ EXPECT_EQ(cmds[0], "/usr/bin/tpk-backend --preload -d org.tizen.new_rw "
+ "--force-remove --keep-rwdata");
+ EXPECT_EQ(cmds[1], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/share/packages/org.tizen.new_rw.xml -d /");
+ EXPECT_EQ(cmds[2], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/usr/globalapps/org.tizen.new_rw/* -d /");
+ EXPECT_EQ(cmds[3], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/etc/skel/apps_rw/org.tizen.new_rw/* -d /");
+ EXPECT_EQ(cmds[4], "/usr/bin/tpk-backend -y org.tizen.new_rw --preload-rw "
+ "--skip-check-reference");
+}
+
+TEST_F(PkgUpgraderTest, Upgrader_RW2ADDED_RO_HIGH_VERSION) {
+ Upgrader upgrader;
+ upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
+ std::vector<std::string> cmds;
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.new_rw", "tpk", "1.2.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "1.0.0", false, false, false)
+ });
+ // New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
+
+ EXPECT_CALL(GetMock<OsMock>(),
+ execvp(_, _))
+ .WillRepeatedly(
+ Invoke([&](const char* file, char* const argv[]) -> int {
+ std::string cmd = GetCmd(argv);
+ cmds.push_back(std::move(cmd));
+ return 0;
+ }));
+
+ ASSERT_TRUE(upgrader.Process(&finder_));
+
+ for (const auto& cmd : cmds)
+ std::cout << cmd << std::endl;
+
+ EXPECT_EQ(cmds.size(), 7);
+ EXPECT_EQ(cmds[0], "/usr/bin/tpk-backend -d org.tizen.alarm --keep-rwdata");
+ EXPECT_EQ(cmds[1], "/usr/bin/tpk-backend --preload -y org.tizen.alarm "
+ "--partial-rw --skip-check-reference");
+ EXPECT_EQ(cmds[2], "/usr/bin/tpk-backend --preload -d org.tizen.new_rw "
+ "--force-remove --keep-rwdata");
+ EXPECT_EQ(cmds[3], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/share/packages/org.tizen.new_rw.xml -d /");
+ EXPECT_EQ(cmds[4], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/usr/globalapps/org.tizen.new_rw/* -d /");
+ EXPECT_EQ(cmds[5], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/etc/skel/apps_rw/org.tizen.new_rw/* -d /");
+ EXPECT_EQ(cmds[6], "/usr/bin/tpk-backend -y org.tizen.new_rw --preload-rw "
+ "--skip-check-reference");
+}
+
+TEST_F(PkgUpgraderTest, Upgrader_RW2ADDED_RO_SAME_VERSION) {
+ Upgrader upgrader;
+ upgrader.SetDbPath("./tests/unit_tests/pkg_upgrade/data/db");
+ std::vector<std::string> cmds;
+ SetOldPkgInfo(std::vector<PkgInfo>{
+ PkgInfo("org.tizen.new_rw", "tpk", "1.2.0", false, true, true),
+ PkgInfo("org.tizen.alarm", "tpk", "2.0.0", false, false, false)
+ });
+ // New pkg : org.tizen.alarm 2.0.0 (ro), org.tizen.new_rw 1.2.0 (rw)
+
+ EXPECT_CALL(GetMock<OsMock>(),
+ execvp(_, _))
+ .WillRepeatedly(
+ Invoke([&](const char* file, char* const argv[]) -> int {
+ std::string cmd = GetCmd(argv);
+ cmds.push_back(std::move(cmd));
+ return 0;
+ }));
+
+ ASSERT_TRUE(upgrader.Process(&finder_));
+
+ for (const auto& cmd : cmds)
+ std::cout << cmd << std::endl;
+
+ EXPECT_EQ(cmds.size(), 7);
+ EXPECT_EQ(cmds[0], "/usr/bin/tpk-backend -d org.tizen.alarm --keep-rwdata");
+ EXPECT_EQ(cmds[1], "/usr/bin/tpk-backend --preload -y org.tizen.alarm "
+ "--partial-rw --skip-check-reference");
+ EXPECT_EQ(cmds[2], "/usr/bin/tpk-backend --preload -d org.tizen.new_rw "
+ "--force-remove --keep-rwdata");
+ EXPECT_EQ(cmds[3], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/share/packages/org.tizen.new_rw.xml -d /");
+ EXPECT_EQ(cmds[4], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/usr/globalapps/org.tizen.new_rw/* -d /");
+ EXPECT_EQ(cmds[5], "/usr/bin/unzip -oXqq /usr/system/RestoreDir/opt.zip "
+ "opt/etc/skel/apps_rw/org.tizen.new_rw/* -d /");
+ EXPECT_EQ(cmds[6], "/usr/bin/tpk-backend -y org.tizen.new_rw --preload-rw "
+ "--skip-check-reference");
+}
+
class PkgUpgraderTestForInvalidDbPath : public TestFixture {
public:
PkgUpgraderTestForInvalidDbPath() : TestFixture(std::make_unique<Mocks>()) {}