From 52280d8aa6c895c186fa3290ed9a2a295a630598 Mon Sep 17 00:00:00 2001
From: Martin Killenberg <martin.killenberg@desy.de>
Date: Thu, 9 Jul 2020 17:49:55 +0200
Subject: [PATCH] Don't use dummy raw accessors without lock. It causes subtile
 race condition (part1).

---
 .../testPropagateDataFaultFlag.cc             | 35 +++++++++++++------
 1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/tests/executables_src/testPropagateDataFaultFlag.cc b/tests/executables_src/testPropagateDataFaultFlag.cc
index d8599ace..97e15b33 100644
--- a/tests/executables_src/testPropagateDataFaultFlag.cc
+++ b/tests/executables_src/testPropagateDataFaultFlag.cc
@@ -414,15 +414,15 @@ struct TestApplication3 : ctk::Application {
   Module2 m2{this, "m2", ""};
 
   ctk::ControlSystemModule cs;
-  ctk::DeviceModule device1DummyBackend{this, ExceptionDummyCDD1};
-  ctk::DeviceModule device2DummyBackend{this, ExceptionDummyCDD2};
+  ctk::DeviceModule device1{this, ExceptionDummyCDD1};
+  ctk::DeviceModule device2{this, ExceptionDummyCDD2};
 
   void defineConnections() override {
-    device1DummyBackend["m1"]("i1") >> m1("i1");
+    device1["m1"]("i1") >> m1("i1");
     findTag("CS").connectTo(cs);
-    findTag("DEVICE1").connectTo(device1DummyBackend);
-    findTag("DEVICE2").connectTo(device2DummyBackend);
-    device1DummyBackend["m1"]("i3")[cs("trigger", typeid(int), 1)] >> cs("i3", typeid(int), 1);
+    findTag("DEVICE1").connectTo(device1);
+    findTag("DEVICE2").connectTo(device2);
+    device1["m1"]("i3")[cs("trigger", typeid(int), 1)] >> cs("i3", typeid(int), 1);
   }
 };
 
@@ -462,8 +462,9 @@ BOOST_AUTO_TEST_CASE(testThreadedFanout) {
   auto consumingFanoutSource = device1DummyBackend->getRawAccessor("m1", "i1");
   consumingFanoutSource = 10;
 
-  auto pollRegister = device2DummyBackend->getRawAccessor("m1", "i2");
+  auto pollRegister = app.device2.device.getScalarRegisterAccessor<int>("/m1/i2_DUMMY_WRITEABLE");
   pollRegister = 5;
+  pollRegister.write();
 
   test.stepApplication();
 
@@ -593,7 +594,7 @@ BOOST_FIXTURE_TEST_SUITE(data_validity_propagation_noTestFacility, Fixture_noTes
 BOOST_AUTO_TEST_CASE(testDeviceReadFailure) {
   std::cout << "testDeviceReadFailure" << std::endl;
   auto consumingFanoutSource = device1DummyBackend->getRawAccessor("m1", "i1");
-  auto pollRegister = device2DummyBackend->getRawAccessor("m1", "i2");
+  auto pollRegister = app.device2.device.getScalarRegisterAccessor<int>("/m1/i2_DUMMY_WRITEABLE");
 
   auto threadedFanoutInput = test.getScalar<int>("m1/o1");
   auto result = test.getScalar<int>("m1/Module1_result");
@@ -604,6 +605,7 @@ BOOST_AUTO_TEST_CASE(testDeviceReadFailure) {
   threadedFanoutInput = 10000;
   consumingFanoutSource = 1000;
   pollRegister = 1;
+  pollRegister.write();
 
   // -------------------------------------------------------------//
   // without errors
@@ -616,6 +618,7 @@ BOOST_AUTO_TEST_CASE(testDeviceReadFailure) {
   // device module exception
   threadedFanoutInput = 20000;
   pollRegister = 0;
+  pollRegister.write();
 
   device2DummyBackend->throwExceptionRead = true;
 
@@ -703,8 +706,9 @@ BOOST_AUTO_TEST_CASE(testConsumingFanout) {
   auto fromConsumingFanout = test.getScalar<int>("m1/i1"); // consumingfanout variable on cs side
   auto result = test.getScalar<int>("m1/Module1_result");
 
-  auto pollRegisterSource = device2DummyBackend->getRawAccessor("m1", "i2");
+  auto pollRegisterSource = app.device2.device.getScalarRegisterAccessor<int>("/m1/i2_DUMMY_WRITEABLE");
   pollRegisterSource = 100;
+  pollRegisterSource.write();
 
   threadedFanoutInput = 10;
 
@@ -769,8 +773,9 @@ BOOST_AUTO_TEST_CASE(testDataFlowOnDeviceException) {
   auto consumingFanoutSource = device1DummyBackend->getRawAccessor("m1", "i1");
   consumingFanoutSource = 1000;
 
-  auto pollRegister = device2DummyBackend->getRawAccessor("m1", "i2");
+  auto pollRegister = app.device2.device.getScalarRegisterAccessor<int>("/m1/i2_DUMMY_WRITEABLE");
   pollRegister = 100;
+  pollRegister.write();
 
   threadedFanoutInput = 1;
 
@@ -810,6 +815,7 @@ BOOST_AUTO_TEST_CASE(testDataFlowOnDeviceException) {
   // device module exception
   device2DummyBackend->throwExceptionRead = true;
   pollRegister = 200;
+  pollRegister.write();
   threadedFanoutInput = 0;
   threadedFanoutInput.write();
 
@@ -839,6 +845,7 @@ BOOST_AUTO_TEST_CASE(testDataFlowOnDeviceException) {
   // ---------------------------------------------------------------------//
   // Now both, threadedFanoutInput and pollRegister should propagate
   pollRegister = 300;
+  pollRegister.write();
   threadedFanoutInput = 2;
   threadedFanoutInput.write();
 
@@ -922,7 +929,7 @@ BOOST_AUTO_TEST_CASE(testDataValidPropagationOnException) {
   ctk::TestFacility test{false};
   test.runApplication();
 
-  auto pollRegister = device2DummyBackend->getRawAccessor("m1", "i2");
+  auto pollRegister = app.device2.device.getScalarRegisterAccessor<int>("/m1/i2_DUMMY_WRITEABLE");
   auto pushInput = test.getScalar<int>("module/o1");
   auto result = test.getScalar<int>("module/Module3_result");
 
@@ -930,6 +937,7 @@ BOOST_AUTO_TEST_CASE(testDataValidPropagationOnException) {
       test.getScalar<int32_t>(ctk::RegisterPath("/Devices") / TestApplication4::ExceptionDummyCDD2 / "status");
 
   pollRegister = 1;
+  pollRegister.write();
   pushInput = 10;
   pushInput.write();
 
@@ -939,6 +947,7 @@ BOOST_AUTO_TEST_CASE(testDataValidPropagationOnException) {
 
   // Set data validity to faulty and trigger excetion in the same update
   pollRegister = 2;
+  pollRegister.write();
   pushInput = 20;
   pushInput.setDataValidity(ctk::DataValidity::faulty);
   device2DummyBackend->throwExceptionRead = true;
@@ -970,6 +979,7 @@ BOOST_AUTO_TEST_CASE(testDataValidPropagationOnException) {
   // should be reflected in the output
   pushInput = 40;
   pollRegister = 3;
+  pollRegister.write();
   pushInput.write();
   result.read();
   BOOST_CHECK_EQUAL(result, 43);
@@ -980,6 +990,7 @@ BOOST_AUTO_TEST_CASE(testDataValidPropagationOnException) {
   // Check if we get faulty output from the exception alone,
   // keep pushInput ok
   pollRegister = 4;
+  pollRegister.write();
   pushInput = 50;
   device2DummyBackend->throwExceptionRead = true;
 
@@ -1006,6 +1017,7 @@ BOOST_AUTO_TEST_CASE(testDataValidPropagationOnException) {
   // but it's still faulty from the pushInput
   pushInput = 70;
   pollRegister = 5;
+  pollRegister.write();
   pushInput.write();
   result.read();
   BOOST_CHECK_EQUAL(result, 75);
@@ -1015,6 +1027,7 @@ BOOST_AUTO_TEST_CASE(testDataValidPropagationOnException) {
   pushInput = 80;
   pushInput.setDataValidity(ctk::DataValidity::ok);
   pollRegister = 6;
+  pollRegister.write();
   pushInput.write();
   result.read();
   BOOST_CHECK_EQUAL(result, 86);
-- 
GitLab