From 918ef0382a2c18cdddb39526ff9b314cc2bbcf56 Mon Sep 17 00:00:00 2001 From: Martin Hierholzer <martin.hierholzer@desy.de> Date: Mon, 24 Oct 2022 15:38:28 +0200 Subject: [PATCH] fix testDataValidityPropagation --- .../testDataValidityPropagation.cc | 110 +++++++++++++----- 1 file changed, 80 insertions(+), 30 deletions(-) diff --git a/tests/executables_src/testDataValidityPropagation.cc b/tests/executables_src/testDataValidityPropagation.cc index d5185e47..1dd0876e 100644 --- a/tests/executables_src/testDataValidityPropagation.cc +++ b/tests/executables_src/testDataValidityPropagation.cc @@ -4,7 +4,6 @@ #include "Application.h" #include "ApplicationModule.h" -#include "check_timeout.h" #include "DeviceModule.h" #include "ScalarAccessor.h" #include "TestFacility.h" @@ -27,6 +26,8 @@ using namespace boost::unit_test_framework; namespace ctk = ChimeraTK; +/*********************************************************************************************************************/ + // A module used for initial value tests: // It has an output which is never written to. struct TestModule0 : ctk::ApplicationModule { @@ -41,6 +42,8 @@ struct TestModule0 : ctk::ApplicationModule { } }; +/*********************************************************************************************************************/ + // module for most of hte data validity propagation tests struct TestModule1 : ctk::ApplicationModule { using ctk::ApplicationModule::ApplicationModule; @@ -78,6 +81,8 @@ struct TestModule1 : ctk::ApplicationModule { } }; +/*********************************************************************************************************************/ + struct TestModule2 : ctk::ApplicationModule { using ctk::ApplicationModule::ApplicationModule; ctk::ScalarPushInput<int> i1{this, "i1", "", ""}; @@ -95,6 +100,8 @@ struct TestModule2 : ctk::ApplicationModule { } }; +/*********************************************************************************************************************/ + struct TriggerModule : ctk::ApplicationModule { using ctk::ApplicationModule::ApplicationModule; ctk::ScalarOutput<int> o1{this, "o1", "", ""}; @@ -109,10 +116,12 @@ struct TriggerModule : ctk::ApplicationModule { } }; +/*********************************************************************************************************************/ + template<typename ModuleT> struct TestApplication1 : ctk::Application { TestApplication1() : Application("testSuite") {} - ~TestApplication1() { shutdown(); } + ~TestApplication1() override { shutdown(); } ModuleT mod{this, "m1", ""}; @@ -129,28 +138,21 @@ struct TestApplication1 : ctk::Application { } }; -// BOOST_AUTO_TEST_SUITE(dataValidityPropagation) +/*********************************************************************************************************************/ struct TestApplication3 : ctk::Application { constexpr static char const* ExceptionDummyCDD = "(ExceptionDummy?map=testDataValidityPropagation2.map)"; TestApplication3() : Application("testPartiallyInvalidDevice") {} - ~TestApplication3() { shutdown(); } + ~TestApplication3() override { shutdown(); } TriggerModule m2{this, "m2", ""}; ctk::DeviceModule device1{this, ExceptionDummyCDD, "/m2/o1"}; - - // ctk::DeviceModule device1{this, ExceptionDummyCDD}; - // void defineConnections() override { - // // use manual connection setup instead of ConnectingDeviceModule. - // // note, differently from automatic connection setup, registers contain . and not / as separator - // auto pollInput1 = device1("dev.i1", typeid(int), 1, ChimeraTK::UpdateMode::poll); - // auto pollInput2 = device1("dev.i2", typeid(int), 1, ChimeraTK::UpdateMode::poll); - // auto trigger = m2("o1"); - // pollInput1[trigger] >> cs("dev.i1", typeid(int)); - // pollInput2[trigger] >> cs("dev.i2", typeid(int)); - // } }; + +/*********************************************************************************************************************/ +/*********************************************************************************************************************/ + /** * tests the ExceptionDummyPollDecorator of the ExceptionDummyBackend, which provides a way for * forcing individual (poll-type) device outputs to DataValidity=faulty @@ -158,7 +160,6 @@ struct TestApplication3 : ctk::Application { BOOST_AUTO_TEST_CASE(testDataValidity_exceptionDummy) { TestApplication3 app; ctk::TestFacility test{app}; - // app.dumpConnections(); ChimeraTK::Device dev(TestApplication3::ExceptionDummyCDD); @@ -179,24 +180,30 @@ BOOST_AUTO_TEST_CASE(testDataValidity_exceptionDummy) { BOOST_CHECK(devI2.dataValidity() == ctk::DataValidity::ok); } +/*********************************************************************************************************************/ +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_1_1 \ref dataValidity_1_1 "1.1" * In ApplicationCore each variable has a data validiy flag attached to it. DataValidity can be 'ok' or 'faulty'. * - * Explicit test does not make sense since this is clear if this suite compiles, - * i.e. expressions testmod1.i1.dataValidity() and testmod1.o1.dataValidity(); + * Explicit test does not make sense since this is clear if this suite compiles, i.e. expressions + * testmod1.i1.dataValidity() and testmod1.o1.dataValidity(); */ +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_1_2 \ref dataValidity_1_2 "1.2" - * This flag is automatically propagated: If any of the inputs of an ApplicationModule is faulty, - * the data validity of the module becomes faulty, which means all outputs of this module will automatically be - * flagged as faulty. - * Fan-outs might be special cases (see 2.4). + * This flag is automatically propagated: If any of the inputs of an ApplicationModule is faulty, the data validity of + * the module becomes faulty, which means all outputs of this module will automatically be flagged as faulty. Fan-outs + * might be special cases (see 2.4). * * See \ref testDataValidity_2_3_3 */ +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_1_3 \ref dataValidity_1_3 "1.3" * If a device is in error state, all variables which are read from it shall be marked as 'faulty'. This flag is then @@ -221,6 +228,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_1_3) { // redmine issue: #8550 } +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_1_4 \ref dataValidity_1_4 "1.4" * The user code has the possibility to query the data validity of the module @@ -228,6 +237,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_1_3) { * No explicit test, if test suite compiles it's ok. */ +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_1_5 \ref dataValidity_1_5 "1.5" * The user code has the possibility to set the data validity of the module to 'faulty'. However, the user code cannot @@ -239,17 +250,14 @@ BOOST_AUTO_TEST_CASE(testDataValidity_1_3) { * */ +/*********************************************************************************************************************/ + /** * app with two chained modules, for \ref testDataValidity_1_6 */ struct TestApplication16 : ctk::Application { TestApplication16() : Application("testSuite") {} - ~TestApplication16() { shutdown(); } - - /*void defineConnections() { - mod1("o1") >> mod2("i1"); - findTag(".*").connectTo(cs); - }*/ + ~TestApplication16() override { shutdown(); } TestModule1 mod1{this, "m1", ""}; TestModule1 mod2{this, "m2", ""}; @@ -262,10 +270,14 @@ struct TestApplication16 : ctk::Application { */ BOOST_AUTO_TEST_CASE(testDataValidity_1_6) { TestApplication16 app; + app.mod2.i1 = {&app.mod2, "/m1/o1", "", ""}; + app.mod1.outputValidity = ctk::DataValidity::faulty; app.mod2.outputValidity = ctk::DataValidity::ok; ctk::TestFacility test{app}; + app.mod1.o1.write(); // satisfy initial value + // app.dumpConnections(); auto input = test.getScalar<int>("/m1/i1"); auto result = test.getScalar<int>("/m2/o1"); @@ -282,6 +294,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_1_6) { BOOST_CHECK(result.dataValidity() == ctk::DataValidity::faulty); } +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_1_7 \ref dataValidity_1_7 "1.7" * The user code can get the data validity flag of individual inputs and take special actions. @@ -289,6 +303,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_1_6) { * No explicit test required. */ +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_1_8 \ref dataValidity_1_8 "1.8" * The data validity of receiving variables is set to 'faulty' on construction. Like this, data is marked as faulty as @@ -308,6 +324,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_1_8) { BOOST_CHECK(o0.dataValidity() == ctk::DataValidity::faulty); } +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_2_1_1 \ref dataValidity_2_1_1 "2.1.1" * Each input and each output of a module (or fan out) is decorated with a MetaDataPropagatingRegisterDecorator @@ -335,14 +353,17 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_1_1) { BOOST_CHECK(app.mod.getDataValidity() == ctk::DataValidity::faulty); } +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_1_2 \ref dataValidity_2_1_2 "2.1.2" * The decorator knows about the module it is connected to. It is called the 'owner'. * - * There is no public function for getting the owner, but implicitly this was - * tested in \ref testDataValidity_2_1_1. + * There is no public function for getting the owner, but implicitly this was tested in \ref testDataValidity_2_1_1. */ +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_2_1_3 \ref dataValidity_2_1_3 "2.1.3" * **read:** For each read operation it checks the incoming data validity and increases/decreases the data fault @@ -372,6 +393,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_1_3) { BOOST_CHECK(app.mod.decCalled == 1); } +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_1_5 \ref dataValidity_2_1_5 "2.1.5" * **write:** When writing, the decorator is checking the validity of the owner and the individual flag of the output @@ -380,6 +403,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_1_3) { * Test ist identical to \ref testDataValidity_1_6 */ +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_2_3_1 \ref dataValidity_2_3_1 "2.3.1" * Each ApplicationModule has one data fault counter variable which is increased/decreased by @@ -394,6 +419,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_3_1) { BOOST_CHECK(testmod1.getDataValidity() == ctk::DataValidity::ok); } +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_3_2 \ref dataValidity_2_3_2 "2.3.2" * All inputs and outputs have a MetaDataPropagatingRegisterDecorator. @@ -401,6 +428,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_3_1) { * Tested in \ref testDataValidity_2_1_1 */ +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_2_3_3 \ref dataValidity_2_3_3 "2.3.3" * The main loop of the module usually does not care about data validity. If any input is invalid, all outputs are @@ -429,6 +458,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_3_3) { BOOST_CHECK(oconst.readLatest() == false); } +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_2_3_4 \ref dataValidity_2_3_4 "2.3.4" * Inside the ApplicationModule main loop the module's data fault counter is accessible. The user can increment and @@ -454,6 +485,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_3_4) { BOOST_CHECK(app.mod.dataValidity1 == false); } +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_2_4_1 \ref dataValidity_2_4_1 "2.4.1" * Only the push-type trigger input of the TriggerFanOut is equiped with a MetaDataPropagatingRegisterDecorator. @@ -478,6 +511,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_1) { BOOST_CHECK(result1.dataValidity() == ctk::DataValidity::faulty); } +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_4_2 \ref dataValidity_2_4_2 "2.4.2" * The poll-type data inputs do not have a MetaDataPropagatingRegisterDecorator. @@ -485,6 +520,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_1) { * No functionality that needs testing */ +/*********************************************************************************************************************/ + /** * \anchor testDataValidity_2_4_3 \ref dataValidity_2_4_3 "2.4.3" * The individual poll-type inputs propagate the data validity flag only to the corresponding outputs. @@ -513,6 +550,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_3) { BOOST_CHECK(result2.dataValidity() == ctk::DataValidity::ok); } +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_4_4 \ref dataValidity_2_4_4 "2.4.4" * Although the trigger conceptually has data type 'void', it can also be `faulty`. An invalid trigger is processed, @@ -521,6 +560,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_3) { * Already tested in \ref testDataValidity_2_4_1 */ +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_5_1 \ref dataValidity_2_5_1 "2.5.1" * The MetaDataPropagatingRegisterDecorator is always placed *around* the ExceptionHandlingDecorator if both @@ -529,6 +570,9 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_3) { * * Already tested in \ref testDataValidity_1_3 */ + +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_5_2 \ref dataValidity_2_5_2 "2.5.2" * The first failing read returns with the old data and the 'faulty' flag. Like this the flag is propagated to the @@ -537,6 +581,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_3) { * Already tested in \ref testDataValidity_1_3 */ +/*********************************************************************************************************************/ + /* * \anchor testDataValidity_2_6_1 \ref dataValidity_2_6_1 "2.6.1" * For device variables, the requirement of setting receiving endpoints to 'faulty' on construction can not be @@ -546,6 +592,8 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_3) { * Already tested in \ref testDataValidity_1_3 */ +/*********************************************************************************************************************/ + /* * \anchor testDataValidiy_3_1 \ref dataValidity_3_1 "3.1" * The decorators which manipulate the data fault counter are responsible for counting up and down in pairs, such that @@ -554,4 +602,6 @@ BOOST_AUTO_TEST_CASE(testDataValidity_2_4_3) { * Not tested since it's an implementation detail. */ +/*********************************************************************************************************************/ + // BOOST_AUTO_TEST_SUITE_END() -- GitLab