Skip to content
Snippets Groups Projects
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()