2022-03-01 15:06:59 +01:00
|
|
|
#include <catch2/catch_test_macros.hpp>
|
|
|
|
#include <filesystem>
|
|
|
|
#include <fstream>
|
|
|
|
#include <iostream>
|
|
|
|
|
2022-02-28 14:13:31 +01:00
|
|
|
#include "CoreController.h"
|
2022-02-28 19:52:43 +01:00
|
|
|
#include "HasActionsIF.h"
|
|
|
|
#include "event.h"
|
2022-03-01 13:34:12 +01:00
|
|
|
#include "fsfw/serviceinterface/ServiceInterface.h"
|
2022-03-01 15:06:59 +01:00
|
|
|
#include "libxiphos.h"
|
2022-02-28 16:47:36 +01:00
|
|
|
|
2022-02-28 19:52:43 +01:00
|
|
|
static constexpr bool CAT_FILE_TO_CONSOLE = false;
|
2022-02-28 16:47:36 +01:00
|
|
|
const std::string CONF_PATH = "/tmp/conf";
|
|
|
|
const std::string REBOOT_FILE = CONF_PATH + "/reboot.txt";
|
|
|
|
|
|
|
|
void catFileToConsole();
|
2022-02-25 11:34:42 +01:00
|
|
|
|
2022-03-01 13:34:12 +01:00
|
|
|
ServiceInterfaceStream sif::debug("DEBUG");
|
|
|
|
ServiceInterfaceStream sif::info("INFO");
|
|
|
|
ServiceInterfaceStream sif::warning("WARNING");
|
|
|
|
ServiceInterfaceStream sif::error("ERROR", false, false, true);
|
|
|
|
|
2022-03-01 15:06:59 +01:00
|
|
|
TEST_CASE("Core Controller Reboot File Handling", "[reboot-file]") {
|
|
|
|
if (not std::filesystem::exists(CONF_PATH)) {
|
2022-02-28 19:52:43 +01:00
|
|
|
std::filesystem::create_directory(CONF_PATH);
|
|
|
|
}
|
|
|
|
CoreController ctrl;
|
2022-03-01 14:44:50 +01:00
|
|
|
std::array<uint8_t, 12> cmdData = {};
|
2022-02-28 19:52:43 +01:00
|
|
|
|
2022-03-01 15:06:59 +01:00
|
|
|
SECTION("Primary") {
|
2022-02-28 19:52:43 +01:00
|
|
|
xsc_libnor_chip_t chip;
|
|
|
|
xsc_libnor_copy_t copy;
|
|
|
|
RebootFile rf = {};
|
|
|
|
ctrl.rewriteRebootFile(rf);
|
2022-03-01 14:51:12 +01:00
|
|
|
REQUIRE(rf.enabled == 1);
|
2022-02-28 19:52:43 +01:00
|
|
|
REQUIRE(rf.maxCount == RebootFile::DEFAULT_MAX_BOOT_CNT);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.bootFlag == 0);
|
|
|
|
REQUIRE(rf.lastChip == 0);
|
|
|
|
REQUIRE(rf.lastCopy == 0);
|
|
|
|
// This recreates the file but should also increment the boot counter of the current image
|
|
|
|
REQUIRE(ctrl.CURRENT_CHIP == xsc::CHIP_0);
|
|
|
|
REQUIRE(ctrl.CURRENT_COPY == xsc::COPY_0);
|
2022-02-28 16:35:16 +01:00
|
|
|
ctrl.performRebootFileHandling(true);
|
2022-02-28 16:47:36 +01:00
|
|
|
catFileToConsole();
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
2022-02-28 19:52:43 +01:00
|
|
|
REQUIRE(rf.maxCount == RebootFile::DEFAULT_MAX_BOOT_CNT);
|
|
|
|
REQUIRE(rf.img00Cnt == 1);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.bootFlag == 0);
|
2022-03-01 11:57:48 +01:00
|
|
|
REQUIRE(rf.lastChip == xsc::CHIP_0);
|
|
|
|
REQUIRE(rf.lastCopy == xsc::COPY_0);
|
2022-02-28 19:52:43 +01:00
|
|
|
uint8_t newRebootCnt = 3;
|
2022-03-01 15:06:59 +01:00
|
|
|
CHECK(ctrl.executeAction(CoreController::SET_MAX_REBOOT_CNT, 0, &newRebootCnt, 1) ==
|
|
|
|
HasActionsIF::EXECUTION_FINISHED);
|
2022-02-28 19:52:43 +01:00
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.maxCount == 3);
|
|
|
|
REQUIRE(not getRebootWasCalled(chip, copy));
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
2022-02-28 16:47:36 +01:00
|
|
|
REQUIRE(rf.enabled == 1);
|
2022-02-28 19:52:43 +01:00
|
|
|
REQUIRE(rf.img00Cnt == 3);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.bootFlag == true);
|
|
|
|
REQUIRE(rf.lastChip == xsc::CHIP_0);
|
|
|
|
REQUIRE(rf.lastCopy == xsc::COPY_0);
|
|
|
|
REQUIRE(getRebootWasCalled(chip, copy));
|
|
|
|
REQUIRE(chip == XSC_LIBNOR_CHIP_0);
|
|
|
|
REQUIRE(copy == XSC_LIBNOR_COPY_GOLD);
|
|
|
|
EventInfo info = {};
|
|
|
|
uint32_t numEvents = 0;
|
2022-02-28 20:24:40 +01:00
|
|
|
|
|
|
|
// We are now on image 0 1 and an event will be triggered
|
2022-02-28 19:52:43 +01:00
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
eventWasCalled(info, numEvents);
|
|
|
|
CHECK(numEvents == 1);
|
|
|
|
CHECK(info.event == CoreController::REBOOT_MECHANISM_TRIGGERED);
|
|
|
|
CHECK(static_cast<xsc::Chip>((info.p1 >> 16) & 0xFFFF) == xsc::CHIP_0);
|
|
|
|
CHECK(static_cast<xsc::Copy>(info.p1 & 0xFFFF) == xsc::COPY_0);
|
|
|
|
CHECK(((info.p2 >> 24) & 0xFF) == 3);
|
|
|
|
CHECK(((info.p2 >> 16) & 0xFF) == 1);
|
|
|
|
CHECK(((info.p2 >> 8) & 0xFF) == 0);
|
|
|
|
CHECK((info.p2 & 0xFF) == 0);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 3);
|
|
|
|
REQUIRE(rf.img01Cnt == 1);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
// Flag was cleared when event was thrown
|
|
|
|
REQUIRE(rf.bootFlag == false);
|
|
|
|
REQUIRE(rf.lastChip == xsc::CHIP_0);
|
2022-03-01 14:44:50 +01:00
|
|
|
REQUIRE(rf.lastCopy == xsc::COPY_1);
|
2022-02-28 19:52:43 +01:00
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 3);
|
|
|
|
REQUIRE(rf.img01Cnt == 3);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
2022-02-28 20:24:40 +01:00
|
|
|
|
|
|
|
// We are now on image 1 0 and an event will be triggered
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
eventWasCalled(info, numEvents);
|
|
|
|
CHECK(numEvents == 1);
|
|
|
|
CHECK(info.event == CoreController::REBOOT_MECHANISM_TRIGGERED);
|
|
|
|
CHECK(static_cast<xsc::Chip>((info.p1 >> 16) & 0xFFFF) == xsc::CHIP_0);
|
|
|
|
CHECK(static_cast<xsc::Copy>(info.p1 & 0xFFFF) == xsc::COPY_1);
|
|
|
|
CHECK(((info.p2 >> 24) & 0xFF) == 3);
|
|
|
|
CHECK(((info.p2 >> 16) & 0xFF) == 3);
|
|
|
|
CHECK(((info.p2 >> 8) & 0xFF) == 1);
|
|
|
|
CHECK((info.p2 & 0xFF) == 0);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 3);
|
|
|
|
REQUIRE(rf.img01Cnt == 3);
|
|
|
|
REQUIRE(rf.img10Cnt == 1);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 3);
|
|
|
|
REQUIRE(rf.img01Cnt == 3);
|
|
|
|
REQUIRE(rf.img10Cnt == 3);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
eventWasCalled(info, numEvents);
|
|
|
|
|
|
|
|
// On image 1 1 now
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
eventWasCalled(info, numEvents);
|
|
|
|
CHECK(numEvents == 1);
|
|
|
|
CHECK(info.event == CoreController::REBOOT_MECHANISM_TRIGGERED);
|
|
|
|
CHECK(static_cast<xsc::Chip>((info.p1 >> 16) & 0xFFFF) == xsc::CHIP_1);
|
|
|
|
CHECK(static_cast<xsc::Copy>(info.p1 & 0xFFFF) == xsc::COPY_0);
|
|
|
|
CHECK(((info.p2 >> 24) & 0xFF) == 3);
|
|
|
|
CHECK(((info.p2 >> 16) & 0xFF) == 3);
|
|
|
|
CHECK(((info.p2 >> 8) & 0xFF) == 3);
|
|
|
|
CHECK((info.p2 & 0xFF) == 1);
|
|
|
|
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
// Now it should fall back to 0 0 because all are invalid
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 3);
|
|
|
|
REQUIRE(rf.img01Cnt == 3);
|
|
|
|
REQUIRE(rf.img10Cnt == 3);
|
|
|
|
REQUIRE(rf.img11Cnt == 3);
|
|
|
|
|
|
|
|
// Should remain on image now
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
eventWasCalled(info, numEvents);
|
|
|
|
CHECK(numEvents == 1);
|
|
|
|
CHECK(info.event == CoreController::REBOOT_MECHANISM_TRIGGERED);
|
|
|
|
CHECK(static_cast<xsc::Chip>((info.p1 >> 16) & 0xFFFF) == xsc::CHIP_1);
|
|
|
|
CHECK(static_cast<xsc::Copy>(info.p1 & 0xFFFF) == xsc::COPY_1);
|
|
|
|
CHECK(((info.p2 >> 24) & 0xFF) == 4);
|
|
|
|
CHECK(((info.p2 >> 16) & 0xFF) == 3);
|
|
|
|
CHECK(((info.p2 >> 8) & 0xFF) == 3);
|
|
|
|
CHECK((info.p2 & 0xFF) == 3);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
2022-03-01 14:44:50 +01:00
|
|
|
REQUIRE(rf.img00Cnt == 4);
|
2022-02-28 20:24:40 +01:00
|
|
|
REQUIRE(rf.img01Cnt == 3);
|
|
|
|
REQUIRE(rf.img10Cnt == 3);
|
|
|
|
REQUIRE(rf.img11Cnt == 3);
|
|
|
|
|
|
|
|
// Reset a specific reboot counter
|
2022-03-01 14:44:50 +01:00
|
|
|
cmdData[0] = 0;
|
|
|
|
cmdData[1] = 1;
|
|
|
|
ctrl.executeAction(CoreController::RESET_REBOOT_COUNTERS, 0, cmdData.data(), 2);
|
2022-02-28 20:24:40 +01:00
|
|
|
// Reboot to 0 0 again
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
2022-03-01 14:44:50 +01:00
|
|
|
REQUIRE(rf.img00Cnt == 5);
|
2022-02-28 20:24:40 +01:00
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 3);
|
|
|
|
REQUIRE(rf.img11Cnt == 3);
|
|
|
|
CHECK(CoreController::CURRENT_CHIP == xsc::CHIP_0);
|
|
|
|
CHECK(CoreController::CURRENT_COPY == xsc::COPY_1);
|
2022-03-01 14:44:50 +01:00
|
|
|
ctrl.executeAction(CoreController::RESET_REBOOT_COUNTERS, 0, nullptr, 0);
|
2022-02-28 20:24:40 +01:00
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
uint8_t enable = 0;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_REBOOT_FILE_HANDLING, 0, &enable, 1);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 0);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
|
|
|
|
// Reboot to 1 0 explicitely
|
|
|
|
CoreController::setCurrentBootCopy(xsc::CHIP_1, xsc::COPY_0);
|
|
|
|
// Reboot three times and verify that no reboot is performed
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 0);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 4);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
// Now enable the functionality again and verify it reboots to 1 1
|
|
|
|
enable = 1;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_REBOOT_FILE_HANDLING, 0, &enable, 1);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 5);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 5);
|
|
|
|
REQUIRE(rf.img11Cnt == 1);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
// Should be on 0 0 now
|
|
|
|
CHECK(CoreController::CURRENT_CHIP == xsc::CHIP_0);
|
|
|
|
CHECK(CoreController::CURRENT_COPY == xsc::COPY_0);
|
2022-02-28 20:27:24 +01:00
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 1);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 5);
|
|
|
|
REQUIRE(rf.img11Cnt == 3);
|
|
|
|
|
|
|
|
// Now reset all reboot counters manually
|
2022-03-01 14:44:50 +01:00
|
|
|
cmdData[0] = 0;
|
|
|
|
cmdData[1] = 0;
|
|
|
|
ctrl.executeAction(CoreController::RESET_REBOOT_COUNTERS, 0, cmdData.data(), 2);
|
|
|
|
cmdData[0] = 1;
|
|
|
|
cmdData[1] = 0;
|
|
|
|
ctrl.executeAction(CoreController::RESET_REBOOT_COUNTERS, 0, cmdData.data(), 2);
|
|
|
|
cmdData[0] = 1;
|
|
|
|
cmdData[1] = 1;
|
|
|
|
ctrl.executeAction(CoreController::RESET_REBOOT_COUNTERS, 0, cmdData.data(), 2);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
|
|
|
|
// Reset lock on 0 1
|
|
|
|
cmdData[0] = false;
|
|
|
|
cmdData[1] = 0;
|
|
|
|
cmdData[2] = 1;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_IMG_LOCK, 0, cmdData.data(), 3);
|
|
|
|
CHECK(CoreController::CURRENT_CHIP == xsc::CHIP_0);
|
|
|
|
CHECK(CoreController::CURRENT_COPY == xsc::COPY_0);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
// Now should be on 0 1
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
CHECK(CoreController::CURRENT_CHIP == xsc::CHIP_0);
|
|
|
|
CHECK(CoreController::CURRENT_COPY == xsc::COPY_1);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 3);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.img00Lock == false);
|
|
|
|
REQUIRE(rf.img01Lock == false);
|
|
|
|
REQUIRE(rf.img10Lock == false);
|
|
|
|
REQUIRE(rf.img11Lock == false);
|
|
|
|
// Now simulate failure in kernel boot or reboot from ProASIC3
|
|
|
|
ctrl.setCurrentBootCopy(xsc::CHIP_0, xsc::COPY_0);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
// Image 0 1 should have been marked as invalid now. Reboot will be triggered
|
|
|
|
// on 1 0 instead of 0 1 because 0 1 is marked as locked
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 4);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.img00Lock == false);
|
|
|
|
REQUIRE(rf.img01Lock == true);
|
|
|
|
REQUIRE(rf.img10Lock == false);
|
|
|
|
REQUIRE(rf.img11Lock == false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 4);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 1);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.img00Lock == false);
|
|
|
|
REQUIRE(rf.img01Lock == true);
|
|
|
|
REQUIRE(rf.img10Lock == false);
|
|
|
|
REQUIRE(rf.img11Lock == false);
|
|
|
|
// Reset lock on 0 1 again
|
|
|
|
cmdData[0] = false;
|
|
|
|
cmdData[1] = 0;
|
|
|
|
cmdData[2] = 1;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_IMG_LOCK, 0, cmdData.data(), 3);
|
|
|
|
// Lock 1 1 manually
|
|
|
|
// Reset lock on 0 1 again
|
|
|
|
cmdData[0] = true;
|
|
|
|
cmdData[1] = 1;
|
|
|
|
cmdData[2] = 1;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_IMG_LOCK, 0, cmdData.data(), 3);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
// Should be on 0 1 now
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 4);
|
|
|
|
REQUIRE(rf.img01Cnt == 1);
|
|
|
|
REQUIRE(rf.img10Cnt == 3);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.img00Lock == false);
|
|
|
|
REQUIRE(rf.img01Lock == false);
|
|
|
|
REQUIRE(rf.img10Lock == false);
|
|
|
|
REQUIRE(rf.img11Lock == true);
|
|
|
|
// Lock everything except 0 0
|
|
|
|
cmdData[0] = true;
|
|
|
|
cmdData[1] = 0;
|
|
|
|
cmdData[2] = 1;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_IMG_LOCK, 0, cmdData.data(), 3);
|
|
|
|
cmdData[0] = true;
|
|
|
|
cmdData[1] = 1;
|
|
|
|
cmdData[2] = 0;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_IMG_LOCK, 0, cmdData.data(), 3);
|
|
|
|
ctrl.executeAction(CoreController::RESET_REBOOT_COUNTERS, 0, nullptr, 0);
|
2022-02-28 20:27:24 +01:00
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 0);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
2022-03-01 14:44:50 +01:00
|
|
|
REQUIRE(rf.img00Lock == false);
|
|
|
|
REQUIRE(rf.img01Lock == true);
|
|
|
|
REQUIRE(rf.img10Lock == true);
|
|
|
|
REQUIRE(rf.img11Lock == true);
|
|
|
|
// Switch to 0 0
|
|
|
|
ctrl.setCurrentBootCopy(xsc::CHIP_0, xsc::COPY_0);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
// Should still be on 0 0
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 4);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.img00Lock == false);
|
|
|
|
REQUIRE(rf.img01Lock == true);
|
|
|
|
REQUIRE(rf.img10Lock == true);
|
|
|
|
REQUIRE(rf.img11Lock == true);
|
|
|
|
// Unlock 1 0
|
|
|
|
cmdData[0] = false;
|
|
|
|
cmdData[1] = 1;
|
|
|
|
cmdData[2] = 0;
|
|
|
|
ctrl.executeAction(CoreController::SWITCH_IMG_LOCK, 0, cmdData.data(), 3);
|
|
|
|
// Reboots to 1 0 now
|
|
|
|
ctrl.performRebootFileHandling(false);
|
|
|
|
ctrl.parseRebootFile(REBOOT_FILE, rf);
|
|
|
|
REQUIRE(rf.enabled == 1);
|
|
|
|
REQUIRE(rf.img00Cnt == 5);
|
|
|
|
REQUIRE(rf.img01Cnt == 0);
|
|
|
|
REQUIRE(rf.img10Cnt == 0);
|
|
|
|
REQUIRE(rf.img11Cnt == 0);
|
|
|
|
REQUIRE(rf.img00Lock == false);
|
|
|
|
REQUIRE(rf.img01Lock == true);
|
|
|
|
REQUIRE(rf.img10Lock == false);
|
|
|
|
REQUIRE(rf.img11Lock == true);
|
|
|
|
REQUIRE(CoreController::CURRENT_CHIP == xsc::CHIP_1);
|
|
|
|
REQUIRE(CoreController::CURRENT_COPY == xsc::COPY_0);
|
2022-02-28 19:52:43 +01:00
|
|
|
}
|
2022-03-01 15:06:59 +01:00
|
|
|
if (std::filesystem::exists(CONF_PATH)) {
|
2022-02-28 19:52:43 +01:00
|
|
|
std::uintmax_t n = std::filesystem::remove_all(CONF_PATH);
|
|
|
|
CHECK(n == 2);
|
|
|
|
}
|
2022-02-25 11:34:42 +01:00
|
|
|
}
|
2022-02-28 16:47:36 +01:00
|
|
|
|
|
|
|
void catFileToConsole() {
|
2022-03-01 15:06:59 +01:00
|
|
|
if (CAT_FILE_TO_CONSOLE) {
|
2022-02-28 16:47:36 +01:00
|
|
|
std::ifstream file(REBOOT_FILE);
|
|
|
|
if (file.is_open()) {
|
|
|
|
std::cout << file.rdbuf();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|