-
Jens Georg authoredJens Georg authored
testTimeout.cc 18.51 KiB
// Define a name for the test module.
#define BOOST_TEST_MODULE testTimeout
// Only after defining the name include the unit test header.
#include <boost/test/included/unit_test.hpp>
#include <ChimeraTK/ApplicationCore/TestFacility.h>
#include <ChimeraTK/BackendFactory.h>
#include "Server.h"
#include "TecDummy.h"
using namespace boost::unit_test_framework;
struct Fixture_t {
Server theServer{"tec_dummy"};
ChimeraTK::TestFacility testFacility;
boost::shared_ptr<TecDummy> dummy{
boost::dynamic_pointer_cast<TecDummy>(ChimeraTK::BackendFactory::getInstance().createBackend("ActualDevice"))};
};
/// TestSuite for the server, adapt name
BOOST_AUTO_TEST_SUITE(TecServerTestSuite)
/**********************************************************************************************************************/
/// Test serial timeout (as reported by the FPGA) in write operation
BOOST_FIXTURE_TEST_CASE(testSerialTimeoutWrite, Fixture_t) {
std::cout << "testSerialTimeoutWrite" << std::endl;
auto fanControlEnable = testFacility.getScalar<int>("TecModule/ctrl_ch1_fanControlEnable_wr");
auto writeCh1Group7 = testFacility.getScalar<int>("TecModule/writeCh1Group7_wr");
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
testFacility.runApplication();
fanControlEnable = 1;
fanControlEnable.write();
writeCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 0);
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
dummy->simulateSerialTimeout = true;
fanControlEnable = 42;
fanControlEnable.write();
writeCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
dummy->simulateSerialTimeout = false;
writeCh1Group7.write();
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 42);
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
/// Test serial timeout (as reported by the FPGA) in write-to-flash operation
BOOST_FIXTURE_TEST_CASE(testSerialTimeoutWriteToFlash, Fixture_t) {
std::cout << "testSerialTimeoutWriteToFlash" << std::endl;
auto fanControlEnable = testFacility.getScalar<int>("TecModule/ctrl_ch1_fanControlEnable_wr");
auto writeToFlashCh1Group7 = testFacility.getScalar<int>("TecModule/writeToFlashCh1Group7_wr");
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
testFacility.runApplication();
fanControlEnable = 1;
fanControlEnable.write();
writeToFlashCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 0);
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(dummy->getLastWriteToFlash(TecFrame::TecFrame::ExpFanControlEnable));
dummy->simulateSerialTimeout = true;
fanControlEnable = 42;
fanControlEnable.write();
writeToFlashCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
dummy->simulateSerialTimeout = false;
writeToFlashCh1Group7.write();
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 42);
BOOST_CHECK(dummy->getLastWriteToFlash(TecFrame::TecFrame::ExpFanControlEnable));
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
/// Test serial timeout (as reported by the FPGA) in read-on-demand operation
BOOST_FIXTURE_TEST_CASE(testSerialTimeoutReadOnDemand, Fixture_t) {
std::cout << "testSerialTimeoutReadOnDemand" << std::endl;
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
auto serialNumber = testFacility.getScalar<int>("TecModule/mon_serialNumber_rd");
testFacility.runApplication();
testFacility.writeScalar("TecModule/readGroup1_wr", 1);
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, 0);
auto setSerialNumberValue = 42120;
dummy->set(TecFrame::TecParameter::MonSerialNumber, setSerialNumberValue);
testFacility.writeScalar("TecModule/readGroup1_wr", 1);
dummy->simulateSerialTimeout = true;
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, 0);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::faulty);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
testFacility.writeScalar("TecModule/readGroup1_wr", 1);
dummy->simulateSerialTimeout = false;
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, 42120);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::ok);
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
/// Test serial timeout (as reported by the FPGA) in perodic read operation
BOOST_FIXTURE_TEST_CASE(testSerialTimeoutReadPeriodic, Fixture_t) {
std::cout << "testSerialTimeoutReadPeriodic" << std::endl;
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
auto serialNumber = testFacility.getScalar<int>("TecModule/mon_serialNumber_rd");
testFacility.runApplication();
int setSerialNumberValue1 = 31415926;
dummy->set(TecFrame::TecParameter::MonSerialNumber, setSerialNumberValue1);
testFacility.writeScalar<int>("TecModule/mon_serialNumber_enaPeriodicRead", 1);
theServer.periodicRead.sendTrigger();
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, setSerialNumberValue1);
int setSerialNumberValue2 = 314159265;
dummy->set(TecFrame::TecParameter::MonSerialNumber, setSerialNumberValue2);
dummy->simulateSerialTimeout = true;
theServer.periodicRead.sendTrigger();
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(static_cast<int>(serialNumber), setSerialNumberValue1);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::faulty);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
dummy->simulateSerialTimeout = false;
theServer.periodicRead.sendTrigger();
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(static_cast<int>(serialNumber), setSerialNumberValue2);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::ok);
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
/// Test FPGA timeout (loop done never set) in write operation
BOOST_FIXTURE_TEST_CASE(testFPGATimeoutWrite, Fixture_t) {
std::cout << "testFPGATimeoutWrite" << std::endl;
auto fanControlEnable = testFacility.getScalar<int>("TecModule/ctrl_ch1_fanControlEnable_wr");
auto writeCh1Group7 = testFacility.getScalar<int>("TecModule/writeCh1Group7_wr");
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
auto fpgaTimeout = testFacility.getScalar<uint32_t>("TecModule/fpgaTimeout");
testFacility.runApplication();
fpgaTimeout = 10;
fpgaTimeout.write();
dummy->loopDoneDelay = 10;
fanControlEnable = 1;
fanControlEnable.write();
writeCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 0);
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
dummy->loopDoneDelay = 11;
fanControlEnable = 42;
fanControlEnable.write();
writeCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
fpgaTimeout = 11;
fpgaTimeout.write();
writeCh1Group7.write();
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 42);
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
/// Test FPGA timeout (loop done never set) in write-to-flash operation
BOOST_FIXTURE_TEST_CASE(testFPGATimeoutWriteToFlash, Fixture_t) {
std::cout << "testFPGATimeoutWriteToFlash" << std::endl;
auto fanControlEnable = testFacility.getScalar<int>("TecModule/ctrl_ch1_fanControlEnable_wr");
auto writeToFlashCh1Group7 = testFacility.getScalar<int>("TecModule/writeToFlashCh1Group7_wr");
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
auto fpgaTimeout = testFacility.getScalar<uint32_t>("TecModule/fpgaTimeout");
testFacility.runApplication();
fpgaTimeout = 10;
fpgaTimeout.write();
dummy->loopDoneDelay = 10;
fanControlEnable = 1;
fanControlEnable.write();
writeToFlashCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 0);
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(dummy->getLastWriteToFlash(TecFrame::TecFrame::ExpFanControlEnable));
dummy->loopDoneDelay = 11;
fanControlEnable = 42;
fanControlEnable.write();
writeToFlashCh1Group7.write();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 1);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
fpgaTimeout = 11;
fpgaTimeout.write();
writeToFlashCh1Group7.write();
testFacility.stepApplication();
BOOST_CHECK_EQUAL(dummy->getInt(TecFrame::TecParameter::ExpFanControlEnable), 42);
BOOST_CHECK(dummy->getLastWriteToFlash(TecFrame::TecFrame::ExpFanControlEnable));
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
/// Test FPGA timeout (loop done never set)) in read-on-demand operation
BOOST_FIXTURE_TEST_CASE(testFPGATimeoutReadOnDemand, Fixture_t) {
std::cout << "testFPGATimeoutReadOnDemand" << std::endl;
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
auto serialNumber = testFacility.getScalar<int>("TecModule/mon_serialNumber_rd");
auto fpgaTimeout = testFacility.getScalar<uint32_t>("TecModule/fpgaTimeout");
testFacility.runApplication();
fpgaTimeout = 1;
fpgaTimeout.write();
dummy->loopDoneDelay = 1;
testFacility.writeScalar("TecModule/readGroup1_wr", 1);
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, 0);
auto setSerialNumberValue = 42120;
dummy->set(TecFrame::TecParameter::MonSerialNumber, setSerialNumberValue);
testFacility.writeScalar("TecModule/readGroup1_wr", 1);
dummy->loopDoneDelay = 2;
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, 0);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::faulty);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
testFacility.writeScalar("TecModule/readGroup1_wr", 1);
fpgaTimeout = 2;
fpgaTimeout.write();
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, 42120);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::ok);
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
/// Test FPGA timeout (loop done never set) in perodic read operation
BOOST_FIXTURE_TEST_CASE(testFPGATimeoutReadPeriodic, Fixture_t) {
std::cout << "testFPGATimeoutReadPeriodic" << std::endl;
auto errorMessage = testFacility.getScalar<std::string>("TecModule/errorMessage");
auto errorStatus = testFacility.getScalar<int>("TecModule/errorStatus");
auto errorReset = testFacility.getScalar<int>("TecModule/errorReset");
auto serialNumber = testFacility.getScalar<int>("TecModule/mon_serialNumber_rd");
auto fpgaTimeout = testFacility.getScalar<uint32_t>("TecModule/fpgaTimeout");
testFacility.runApplication();
fpgaTimeout = 20000;
fpgaTimeout.write();
dummy->loopDoneDelay = 10000;
int setSerialNumberValue1 = 31415926;
dummy->set(TecFrame::TecParameter::MonSerialNumber, setSerialNumberValue1);
testFacility.writeScalar<int>("TecModule/mon_serialNumber_enaPeriodicRead", 1);
theServer.periodicRead.sendTrigger();
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(serialNumber, setSerialNumberValue1);
int setSerialNumberValue2 = 314159265;
dummy->set(TecFrame::TecParameter::MonSerialNumber, setSerialNumberValue2);
fpgaTimeout = 10000;
fpgaTimeout.write();
dummy->loopDoneDelay = 20000;
theServer.periodicRead.sendTrigger();
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(static_cast<int>(serialNumber), setSerialNumberValue1);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::faulty);
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) != "");
BOOST_CHECK(errorStatus != 0);
dummy->loopDoneDelay = 100;
theServer.periodicRead.sendTrigger();
testFacility.stepApplication();
serialNumber.read();
BOOST_CHECK_EQUAL(static_cast<int>(serialNumber), setSerialNumberValue2);
BOOST_CHECK(serialNumber.dataValidity() == ChimeraTK::DataValidity::ok);
// error needs to be reset manually
BOOST_CHECK(!errorMessage.readLatest());
BOOST_CHECK(!errorStatus.readLatest());
errorReset.write();
testFacility.stepApplication();
BOOST_CHECK(errorMessage.readLatest());
BOOST_CHECK(errorStatus.readLatest());
BOOST_CHECK(std::string(errorMessage) == "");
BOOST_CHECK(errorStatus == 0);
}
/**********************************************************************************************************************/
BOOST_AUTO_TEST_SUITE_END()