Skip to content
Snippets Groups Projects
Commit 0e28a9ee authored by Martin Christoph Hierholzer's avatar Martin Christoph Hierholzer
Browse files

extended the test to make sure also the "observer" variables in the control...

extended the test to make sure also the "observer" variables in the control system show the right values
parent 7c3fadc9
No related branches found
No related tags found
No related merge requests found
...@@ -109,6 +109,8 @@ BOOST_AUTO_TEST_CASE(testNormalOperation) { ...@@ -109,6 +109,8 @@ BOOST_AUTO_TEST_CASE(testNormalOperation) {
app.initialise(); app.initialise();
app.run(); app.run();
auto var1 = test.getScalar<int>("var1"); auto var1 = test.getScalar<int>("var1");
auto var1_copied = test.getScalar<int>("var1_copied");
auto var2 = test.getScalar<double>("var2");
auto var3 = test.getScalar<double>("var3"); auto var3 = test.getScalar<double>("var3");
auto max = test.getScalar<double>("max"); auto max = test.getScalar<double>("max");
...@@ -122,62 +124,109 @@ BOOST_AUTO_TEST_CASE(testNormalOperation) { ...@@ -122,62 +124,109 @@ BOOST_AUTO_TEST_CASE(testNormalOperation) {
var1 = 49; var1 = 49;
var1.write(); var1.write();
test.stepApplication(); test.stepApplication();
var1_copied.read();
var2.read();
var3.read(); var3.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 49);
BOOST_CHECK_CLOSE(static_cast<double>(var2), 49*2.54, 0.001);
BOOST_CHECK_CLOSE(static_cast<double>(var3), 49*2.54, 0.001); BOOST_CHECK_CLOSE(static_cast<double>(var3), 49*2.54, 0.001);
BOOST_CHECK( var1.readNonBlocking() == false ); // nothing was sent through the return channel BOOST_CHECK( var1.readNonBlocking() == false ); // nothing was sent through the return channel
BOOST_CHECK( var1_copied.readLatest() == false );
BOOST_CHECK( var2.readNonBlocking() == false );
BOOST_CHECK( var3.readNonBlocking() == false );
// inject value which gets limited // inject value which gets limited
var1 = 50; var1 = 50;
var1.write(); var1.write();
test.stepApplication(); test.stepApplication();
var1.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1), 49);
var1_copied.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 50);
var1_copied.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 49);
var2.read();
BOOST_CHECK_CLOSE(static_cast<double>(var2), 50*2.54, 0.001);
var2.read();
BOOST_CHECK_CLOSE(static_cast<double>(var2), 49.5*2.54, 0.001);
var2.read();
BOOST_CHECK_CLOSE(static_cast<double>(var2), 49*2.54, 0.001);
var3.read(); var3.read();
BOOST_CHECK_CLOSE(static_cast<double>(var3), 49.5*2.54, 0.001); BOOST_CHECK_CLOSE(static_cast<double>(var3), 49.5*2.54, 0.001);
var3.read(); var3.read();
BOOST_CHECK_CLOSE(static_cast<double>(var3), 49*2.54, 0.001); BOOST_CHECK_CLOSE(static_cast<double>(var3), 49*2.54, 0.001);
var1.read(); BOOST_CHECK( var1.readNonBlocking() == false );
BOOST_CHECK_EQUAL(static_cast<int>(var1), 49); BOOST_CHECK( var1_copied.readLatest() == false );
BOOST_CHECK( var2.readNonBlocking() == false );
BOOST_CHECK( var3.readNonBlocking() == false );
// change the limit so the current value gets changed // change the limit so the current value gets changed
max = 48.5*2.54; max = 48.5*2.54;
max.write(); max.write();
test.stepApplication(); test.stepApplication();
var1.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1), 48);
var1_copied.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 48);
var2.read();
BOOST_CHECK_CLOSE(static_cast<double>(var2), 48.5*2.54, 0.001);
var2.read();
BOOST_CHECK_CLOSE(static_cast<double>(var2), 48*2.54, 0.001);
var3.read(); var3.read();
BOOST_CHECK_CLOSE(static_cast<double>(var3), 48.5*2.54, 0.001); BOOST_CHECK_CLOSE(static_cast<double>(var3), 48.5*2.54, 0.001);
var3.read(); var3.read();
BOOST_CHECK_CLOSE(static_cast<double>(var3), 48*2.54, 0.001); BOOST_CHECK_CLOSE(static_cast<double>(var3), 48*2.54, 0.001);
var1.read(); BOOST_CHECK( var1.readNonBlocking() == false );
BOOST_CHECK_EQUAL(static_cast<int>(var1), 48); BOOST_CHECK( var1_copied.readLatest() == false );
BOOST_CHECK( var2.readNonBlocking() == false );
BOOST_CHECK( var3.readNonBlocking() == false );
// Run the following tests a couple of times, as they are testing for the absence of race conditions. This makes // Run the following tests a couple of times, as they are testing for the absence of race conditions. This makes
// it more likely to find failures in a single run of the test // it more likely to find failures in a single run of the test
for(size_t i=0; i<10; ++i) { for(size_t i=0; i<10; ++i) {
// feed in some default values (so the tests can be executed multiple times in a row) // feed in some default values (so the tests can be executed multiple times in a row)
BOOST_CHECK( var1.readNonBlocking() == false );
BOOST_CHECK( var3.readNonBlocking() == false );
max = 48.5*2.54; max = 48.5*2.54;
max.write(); max.write();
test.stepApplication(); test.stepApplication();
var1 = 50; var1 = 50;
var1.write(); var1.write();
test.stepApplication(); test.stepApplication();
var1.readLatest(); // emtpy the queue var1.readLatest(); // emtpy the queues
var3.readLatest(); // emtpy the queue var1_copied.readLatest();
var2.readLatest();
var3.readLatest();
BOOST_CHECK_EQUAL(static_cast<int>(var1), 48); BOOST_CHECK_EQUAL(static_cast<int>(var1), 48);
BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 48);
BOOST_CHECK_CLOSE(static_cast<double>(var2), 48*2.54, 0.001);
BOOST_CHECK_CLOSE(static_cast<double>(var3), 48*2.54, 0.001); BOOST_CHECK_CLOSE(static_cast<double>(var3), 48*2.54, 0.001);
BOOST_CHECK( var1.readNonBlocking() == false );
BOOST_CHECK( var1_copied.readLatest() == false );
BOOST_CHECK( var2.readNonBlocking() == false );
BOOST_CHECK( var3.readNonBlocking() == false );
// concurrent change of value and limit // concurrent change of value and limit. Note: The final result must be deterministic, but which values are seen
// in between is subject to race conditions between the two concurrent updates. Thus we are using readLatest() in
// some cases here.
var1 = 30; var1 = 30;
max = 25.5*2.54; max = 25.5*2.54;
var1.write(); var1.write();
max.write(); max.write();
test.stepApplication(); test.stepApplication();
BOOST_CHECK(var3.readLatest() == true); // it is not perfectly deterministic what happens, but we should end up with this result
BOOST_CHECK_CLOSE(static_cast<double>(var3), 25*2.54, 0.001);
var1.read(); var1.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1), 25); BOOST_CHECK_EQUAL(static_cast<int>(var1), 25);
BOOST_CHECK( var3.readNonBlocking() == false ); // nothing left var1_copied.read();
BOOST_CHECK( var1.readNonBlocking() == false ); // nothing left BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 30);
BOOST_CHECK( var1_copied.readLatest() == true );
BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 25);
BOOST_CHECK( var2.readLatest() == true );
BOOST_CHECK_CLOSE(static_cast<double>(var2), 25*2.54, 0.001);
BOOST_CHECK( var3.readLatest() == true );
BOOST_CHECK_CLOSE(static_cast<double>(var3), 25*2.54, 0.001);
BOOST_CHECK( var1.readNonBlocking() == false );
BOOST_CHECK( var1_copied.readLatest() == false );
BOOST_CHECK( var2.readNonBlocking() == false );
BOOST_CHECK( var3.readNonBlocking() == false );
// concurrent change of value and limit - other order than before // concurrent change of value and limit - other order than before
var1 = 15; var1 = 15;
...@@ -185,10 +234,16 @@ BOOST_AUTO_TEST_CASE(testNormalOperation) { ...@@ -185,10 +234,16 @@ BOOST_AUTO_TEST_CASE(testNormalOperation) {
max.write(); max.write();
var1.write(); var1.write();
test.stepApplication(); test.stepApplication();
BOOST_CHECK(var3.readLatest() == true); // it is not perfectly deterministic what happens, but we should end up with this result var1_copied.read();
BOOST_CHECK_EQUAL(static_cast<int>(var1_copied), 15);
BOOST_CHECK( var2.readLatest() == true );
BOOST_CHECK_CLOSE(static_cast<double>(var2), 15*2.54, 0.001);
BOOST_CHECK( var3.readLatest() == true );
BOOST_CHECK_CLOSE(static_cast<double>(var3), 15*2.54, 0.001); BOOST_CHECK_CLOSE(static_cast<double>(var3), 15*2.54, 0.001);
BOOST_CHECK( var3.readNonBlocking() == false ); // nothing left BOOST_CHECK( var1.readNonBlocking() == false );
BOOST_CHECK( var1.readNonBlocking() == false ); // the value was rejected BOOST_CHECK( var1_copied.readLatest() == false );
BOOST_CHECK( var2.readNonBlocking() == false );
BOOST_CHECK( var3.readNonBlocking() == false );
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment