~aleteoryx/muditaos

322ee84dffea8266f6c06c50d874721d10d6305f — Jakub Pyszczak 5 years ago cb5b5a3
[EGD-5108] Fix UT module service

Convert module service tests to run natively on linux.
M module-services/service-desktop/ServiceDesktop.cpp => module-services/service-desktop/ServiceDesktop.cpp +2 -1
@@ 109,7 109,8 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
                      updateOsMsg->updateStats.updateFile.c_str(),
                      updateOsMsg->updateStats.uuid);

            if (updateOS->setUpdateFile(updateOsMsg->updateStats.updateFile) == updateos::UpdateError::NoError)
            if (updateOS->setUpdateFile(purefs::dir::getUpdatesOSPath(), updateOsMsg->updateStats.updateFile) ==
                updateos::UpdateError::NoError)
                updateOS->runUpdate();
        }
        return std::make_shared<sys::ResponseMessage>();

M module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp => module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp +3 -0
@@ 29,6 29,9 @@ auto DeviceInfoEndpoint::handle(Context &context) -> void
}
auto DeviceInfoEndpoint::getDeviceInfo(Context &context) -> bool
{
    if (ownerServicePtr == nullptr) {
        return false;
    }
    json11::Json updateHistory   = static_cast<ServiceDesktop *>(ownerServicePtr)->updateOS->getUpdateHistory();
    struct statvfs vfstat;
    if (statvfs(purefs::dir::getRootDiskPath().c_str(), &vfstat) < 0) {

M module-services/service-desktop/endpoints/update/UpdateMuditaOS.cpp => module-services/service-desktop/endpoints/update/UpdateMuditaOS.cpp +27 -24
@@ 54,10 54,11 @@ UpdateMuditaOS::UpdateMuditaOS(ServiceDesktop *ownerService) : owner(ownerServic
    bootConfig.load();
}

updateos::UpdateError UpdateMuditaOS::setUpdateFile(fs::path updateFileToUse)
updateos::UpdateError UpdateMuditaOS::setUpdateFile(const std::filesystem::path &updatesOSPath,
                                                    fs::path updateFileToUse)
{
    updateFile = purefs::dir::getUpdatesOSPath() / updateFileToUse;
    if (std::filesystem::exists(updateFile.c_str())) {
    updateFile = updatesOSPath / updateFileToUse;
    if (std::filesystem::exists(updateFile)) {
        versionInformation = UpdateMuditaOS::getVersionInfoFromFile(updateFile);
        if (mtar_open(&updateTar, updateFile.c_str(), "r") == MTAR_ESUCCESS) {
            totalBytes = utils::filesystem::filelength(updateTar.stream);


@@ 86,7 87,8 @@ updateos::UpdateError UpdateMuditaOS::runUpdate()
    updateRunStatus.fromVersion = bootConfig.to_json();
    storeRunStatusInDB();

    updateos::UpdateError err = prepareTempDirForUpdate();
    updateos::UpdateError err =
        prepareTempDirForUpdate(purefs::dir::getTemporaryPath(), purefs::dir::getUpdatesOSPath());
    if (err != updateos::UpdateError::NoError) {
        return informError(err, "runUpdate can't prepare temp directory for update");
    }


@@ 490,49 492,47 @@ const fs::path UpdateMuditaOS::getUpdateTmpChild(const fs::path &childPath)
        return updateTempDirectory / childPath;
}

updateos::UpdateError UpdateMuditaOS::prepareTempDirForUpdate()
updateos::UpdateError UpdateMuditaOS::prepareTempDirForUpdate(const std::filesystem::path &temporaryPath,
                                                              const std::filesystem::path &updatesOSPath)
{
    status = updateos::UpdateState::CreatingDirectories;

    updateTempDirectory = purefs::dir::getTemporaryPath() / utils::filesystem::generateRandomId(updateos::prefix_len);
    updateTempDirectory = temporaryPath / utils::filesystem::generateRandomId(updateos::prefix_len);

    informDebug("Temp dir for update %s", updateTempDirectory.c_str());

    const auto updatesOSPath = purefs::dir::getUpdatesOSPath();
    if (!std::filesystem::is_directory(updatesOSPath.c_str())) {
        if (!std::filesystem::create_directory(updatesOSPath.c_str())) {
    if (!std::filesystem::is_directory(updatesOSPath)) {
        if (!std::filesystem::create_directory(updatesOSPath)) {
            return informError(
                updateos::UpdateError::CantCreateUpdatesDir, "%s can't create it", updatesOSPath.c_str());
        }
    }

    if (!std::filesystem::is_directory(purefs::dir::getUpdatesOSPath().c_str())) {
        if (!std::filesystem::create_directory(purefs::dir::getUpdatesOSPath().c_str())) {
            return informError(updateos::UpdateError::CantCreateUpdatesDir,
                               "%s can't create it %s",
                               purefs::dir::getUpdatesOSPath().c_str());
    if (!std::filesystem::is_directory(updatesOSPath)) {
        if (!std::filesystem::create_directory(updatesOSPath)) {
            return informError(
                updateos::UpdateError::CantCreateUpdatesDir, "%s can't create it %s", updatesOSPath.c_str());
        }
        else {
            informDebug("prepareTempDirForUpdate %s created", purefs::dir::getUpdatesOSPath().c_str());
            informDebug("prepareTempDirForUpdate %s created", updatesOSPath.c_str());
        }
    }
    else {
        informDebug("prepareTempDirForUpdate %s exists", purefs::dir::getUpdatesOSPath().c_str());
        informDebug("prepareTempDirForUpdate %s exists", updatesOSPath.c_str());
    }

    if (!std::filesystem::is_directory(purefs::dir::getTemporaryPath().c_str())) {
        informDebug("prepareTempDirForUpdate %s is not a directory", purefs::dir::getTemporaryPath().c_str());
        if (!std::filesystem::create_directory(purefs::dir::getTemporaryPath().c_str())) {
            return informError(updateos::UpdateError::CantCreateTempDir,
                               "%s can't create it %s",
                               purefs::dir::getTemporaryPath().c_str());
    if (!std::filesystem::is_directory(temporaryPath)) {
        informDebug("prepareTempDirForUpdate %s is not a directory", temporaryPath.c_str());
        if (!std::filesystem::create_directory(temporaryPath.c_str())) {
            return informError(
                updateos::UpdateError::CantCreateTempDir, "%s can't create it %s", temporaryPath.c_str());
        }
        else {
            informDebug("prepareTempDirForUpdate %s created", purefs::dir::getTemporaryPath().c_str());
            informDebug("prepareTempDirForUpdate %s created", temporaryPath.c_str());
        }
    }
    else {
        informDebug("prepareTempDirForUpdate %s exists", purefs::dir::getTemporaryPath().c_str());
        informDebug("prepareTempDirForUpdate %s exists", temporaryPath.c_str());
    }

    if (std::filesystem::is_directory(updateTempDirectory.c_str())) {


@@ 746,6 746,9 @@ void UpdateMuditaOS::informUpdate(const updateos::UpdateState statusCode, const 
    auto msgToSend         = std::make_shared<sdesktop::UpdateOsMessage>(updateos::UpdateMessageType::UpdateInform);
    messageText            = std::string(readBuf.get());
    msgToSend->updateStats = (updateos::UpdateStats)(*this);
    if (owner == nullptr) {
        return;
    }
    sys::Bus::SendUnicast(msgToSend, app::name_desktop, owner);

    parserFSM::Context responseContext;

M module-services/service-desktop/endpoints/update/UpdateMuditaOS.hpp => module-services/service-desktop/endpoints/update/UpdateMuditaOS.hpp +3 -2
@@ 141,14 141,15 @@ class UpdateMuditaOS : public updateos::UpdateStats
    UpdateMuditaOS(ServiceDesktop *ownerService);

    updateos::UpdateError runUpdate();
    updateos::UpdateError prepareTempDirForUpdate();
    updateos::UpdateError prepareTempDirForUpdate(const std::filesystem::path &temporaryPath,
                                                  const std::filesystem::path &updatesOSPath);
    updateos::UpdateError unpackUpdate();
    updateos::UpdateError verifyChecksums();
    updateos::UpdateError verifyVersion();
    updateos::UpdateError updateBootloader();
    updateos::UpdateError prepareRoot();
    updateos::UpdateError updateBootJSON();
    updateos::UpdateError setUpdateFile(fs::path updateFileToUse);
    updateos::UpdateError setUpdateFile(const std::filesystem::path &updatesOSPath, fs::path updateFileToUse);
    updateos::UpdateError cleanupAfterUpdate();
    updateos::UpdateError updateUserData();


M module-services/service-desktop/tests/unittest.cpp => module-services/service-desktop/tests/unittest.cpp +7 -16
@@ 30,10 30,11 @@ TEST_CASE("System Update Tests")
{
    UpdateMuditaOS updateOS(nullptr);

    updateos::UpdateError err = updateOS.prepareTempDirForUpdate();
    updateos::UpdateError err = updateOS.prepareTempDirForUpdate(std::filesystem::path{"user"} / "tmp",
                                                                 std::filesystem::path{"sys"} / "updates");
    REQUIRE(err == updateos::UpdateError::NoError);

    updateOS.setUpdateFile("muditaos-unittest.tar");
    updateOS.setUpdateFile(std::filesystem::path{"sys"} / "updates", "muditaos-unittest.tar");

    err = updateOS.unpackUpdate();
    REQUIRE(err == updateos::UpdateError::NoError);


@@ 42,16 43,6 @@ TEST_CASE("System Update Tests")
    REQUIRE(err == updateos::UpdateError::NoError);
}

TEST_CASE("Factory Reset Test")
{

    std::string sysdir = purefs::dir::getRootDiskPath();
    sysdir += "/factory-test/sys";
    std::string factorydir = sysdir + "/factory";
    REQUIRE(FactoryReset::DeleteDirContent(sysdir) == true);
    REQUIRE(FactoryReset::CopyDirContent(factorydir, sysdir) == true);
}

using namespace parserFSM;

TEST_CASE("Parser Test")


@@ 238,7 229,7 @@ TEST_CASE("Context class test")
{
    SECTION("Correct message")
    {
        auto testMessage = R"({"endpoint":6, "method":1, "uuid":12345, "body":{"test":"test"}})";
        auto testMessage = R"({"endpoint":7, "method":1, "uuid":12345, "body":{"test":"test"}})";
        std::string err;
        auto msgJson = json11::Json::parse(testMessage, err);
        REQUIRE(err.empty());


@@ 249,11 240,11 @@ TEST_CASE("Context class test")
        REQUIRE(context.getUuid() == 12345);
        REQUIRE(context.getEndpoint() == EndpointType::contacts);
        REQUIRE(context.createSimpleResponse() ==
                R"(#000000061{"body": null, "endpoint": 6, "status": 200, "uuid": "12345"})");
                R"(#000000061{"body": null, "endpoint": 7, "status": 200, "uuid": "12345"})");

        context.setResponseBody(context.getBody());
        REQUIRE(context.createSimpleResponse() ==
                R"(#000000073{"body": {"test": "test"}, "endpoint": 6, "status": 200, "uuid": "12345"})");
                R"(#000000073{"body": {"test": "test"}, "endpoint": 7, "status": 200, "uuid": "12345"})");
    }
    SECTION("Invalid message")
    {


@@ 274,7 265,7 @@ TEST_CASE("Endpoint Factory test")
{
    SECTION("Proper endpoint")
    {
        auto testMessage = R"({"endpoint":6, "method":1, "uuid":12345, "body":{"test":"test"}})";
        auto testMessage = R"({"endpoint":7, "method":1, "uuid":12345, "body":{"test":"test"}})";
        std::string err;
        auto msgJson = json11::Json::parse(testMessage, err);
        REQUIRE(err.empty());