132 std::cout <<
"testDataValidity" << std::endl;
137 auto status = test.
getScalar<
int>(
"/Aggregated/status");
143 app.
s.
status = ctk::StatusOutput::Status::OK;
146 BOOST_CHECK(status.readNonBlocking() ==
true);
147 BOOST_CHECK(status.dataValidity() == ctk::DataValidity::faulty);
148 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
151 app.
s.
status = ctk::StatusOutput::Status::OFF;
154 BOOST_CHECK(status.readNonBlocking() ==
true);
155 BOOST_CHECK(status.dataValidity() == ctk::DataValidity::faulty);
156 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OFF));
160 app.outerGroup.s1.status = ctk::StatusOutput::Status::FAULT;
161 app.outerGroup.s1.status.write();
163 BOOST_CHECK(status.readNonBlocking() ==
true);
164 BOOST_CHECK(status.dataValidity() == ctk::DataValidity::ok);
165 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
186 std::cout <<
"testPriorities" << std::endl;
189 auto check = [&](ctk::StatusAggregator::PriorityMode mode,
auto prio0,
auto prio1,
auto prio2,
auto prio3,
190 bool warnMixed01 =
false) {
198 auto status = test.
getScalar<
int>(
"/Aggregated/status");
203 status.readNonBlocking();
204 BOOST_CHECK_EQUAL(
int(status),
int(prio0));
210 auto subcheck = [&](
auto lower,
auto higher,
bool writeS2First,
bool warnMixed =
false) {
221 std::cout << int(lower) <<
" vs. " << int(higher) << std::endl;
230 BOOST_CHECK_EQUAL(
int(status),
int(lower));
240 BOOST_CHECK_EQUAL(
int(status),
int(higher));
243 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::WARNING));
254 BOOST_CHECK_EQUAL(
int(status),
int(higher));
257 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::WARNING));
267 BOOST_CHECK_EQUAL(
int(status),
int(higher));
271 auto runAllSubchecks = [&](
bool writeS2First) {
272 subcheck(prio0, prio1, writeS2First, warnMixed01);
273 subcheck(prio0, prio2, writeS2First);
274 subcheck(prio0, prio3, writeS2First);
275 subcheck(prio1, prio2, writeS2First);
276 subcheck(prio1, prio3, writeS2First);
277 subcheck(prio2, prio3, writeS2First);
279 runAllSubchecks(
false);
280 runAllSubchecks(
true);
284 std::cout <<
"PriorityMode::fwko" << std::endl;
285 check(ctk::StatusAggregator::PriorityMode::fwko, ctk::StatusOutput::Status::OFF, ctk::StatusOutput::Status::OK,
286 ctk::StatusOutput::Status::WARNING, ctk::StatusOutput::Status::FAULT);
287 std::cout <<
"PriorityMode::fwok" << std::endl;
288 check(ctk::StatusAggregator::PriorityMode::fwok, ctk::StatusOutput::Status::OK, ctk::StatusOutput::Status::OFF,
289 ctk::StatusOutput::Status::WARNING, ctk::StatusOutput::Status::FAULT);
290 std::cout <<
"PriorityMode::ofwk" << std::endl;
291 check(ctk::StatusAggregator::PriorityMode::ofwk, ctk::StatusOutput::Status::OK, ctk::StatusOutput::Status::WARNING,
292 ctk::StatusOutput::Status::FAULT, ctk::StatusOutput::Status::OFF);
293 std::cout <<
"PriorityMode::fw_warn_mixed" << std::endl;
294 check(ctk::StatusAggregator::PriorityMode::fw_warn_mixed, ctk::StatusOutput::Status::OFF,
295 ctk::StatusOutput::Status::OK, ctk::StatusOutput::Status::WARNING, ctk::StatusOutput::Status::FAULT,
true);
361 std::cout <<
"testTwoLevels" << std::endl << std::endl << std::endl;
366 auto status = test.
getScalar<
int>(
"/Aggregated/status");
367 auto extraStatus = test.
getScalar<
int>(
"/Aggregated/extraStatus");
372 extraStatus.readLatest();
373 BOOST_CHECK_EQUAL(
int(extraStatus),
int(ctk::StatusOutput::Status::OFF));
375 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OFF));
378 app.
s.
status = ctk::StatusOutput::Status::OK;
382 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
383 app.
s.
status = ctk::StatusOutput::Status::OFF;
387 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OFF));
390 app.outerGroup.s2.status = ctk::StatusOutput::Status::OK;
391 app.outerGroup.s2.status.write();
394 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
395 app.outerGroup.s2.status = ctk::StatusOutput::Status::OFF;
396 app.outerGroup.s2.status.write();
399 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OFF));
434 std::cout <<
"testTags" << std::endl;
439 auto aggregateA = test.
getScalar<
int>(
"/aggregateA");
440 auto aggregateB = test.
getScalar<
int>(
"/aggregateB");
441 auto aggregateAll = test.
getScalar<
int>(
"/aggregateAll");
442 auto Group_aggregateA = test.
getScalar<
int>(
"/Group/aggregateA");
443 auto Group_aggregateB = test.
getScalar<
int>(
"/Group/aggregateB");
448 aggregateA.readLatest();
449 aggregateB.readLatest();
450 aggregateAll.readLatest();
451 Group_aggregateA.readLatest();
452 Group_aggregateB.readLatest();
453 BOOST_CHECK_EQUAL(
int(aggregateA),
int(ctk::StatusOutput::Status::WARNING));
454 BOOST_CHECK_EQUAL(
int(aggregateB),
int(ctk::StatusOutput::Status::OFF));
455 BOOST_CHECK_EQUAL(
int(aggregateAll),
int(ctk::StatusOutput::Status::WARNING));
456 BOOST_CHECK_EQUAL(
int(Group_aggregateA),
int(ctk::StatusOutput::Status::WARNING));
457 BOOST_CHECK_EQUAL(
int(Group_aggregateB),
int(ctk::StatusOutput::Status::OFF));
459 app.group.sAB.status = ctk::StatusOutput::Status::FAULT;
460 app.group.sAB.status.write();
466 aggregateA.readLatest();
467 aggregateB.readLatest();
468 aggregateAll.readLatest();
469 Group_aggregateA.readLatest();
470 Group_aggregateB.readLatest();
471 BOOST_CHECK_EQUAL(
int(aggregateA),
int(ctk::StatusOutput::Status::FAULT));
472 BOOST_CHECK_EQUAL(
int(aggregateB),
int(ctk::StatusOutput::Status::FAULT));
473 BOOST_CHECK_EQUAL(
int(aggregateAll),
int(ctk::StatusOutput::Status::FAULT));
474 BOOST_CHECK_EQUAL(
int(Group_aggregateA),
int(ctk::StatusOutput::Status::FAULT));
475 BOOST_CHECK_EQUAL(
int(Group_aggregateB),
int(ctk::StatusOutput::Status::FAULT));
516 std::cout <<
"testAggregatorTags" << std::endl;
521 auto checkForName = [](
auto& accessors, std::string name) {
522 return std::any_of(accessors.begin(), accessors.end(), [&name](
auto acc) { return acc.getName() == name; });
528 BOOST_TEST(accessorsAggA.size() == 4);
529 BOOST_CHECK(checkForName(accessorsAggA,
"sA"));
530 BOOST_CHECK(!checkForName(accessorsAggA,
"aggregatedA"));
535 BOOST_TEST(accessorsAggAggA.size() == 5);
536 BOOST_CHECK(checkForName(accessorsAggAggA,
"aggregatedA"));
537 BOOST_CHECK(!checkForName(accessorsAggAggA,
"sA"));
542 BOOST_TEST(accessorsAggAggB.size() == 5);
543 BOOST_CHECK(checkForName(accessorsAggAggB,
"aggregatedB"));
544 BOOST_CHECK(!checkForName(accessorsAggAggB,
"sB1"));
545 BOOST_CHECK(!checkForName(accessorsAggAggB,
"sB2"));
550 BOOST_TEST(accessorsAggNotB.size() == 6);
551 BOOST_CHECK(checkForName(accessorsAggNotB,
"aggregatedA"));
552 BOOST_CHECK(checkForName(accessorsAggNotB,
"sC"));
553 BOOST_CHECK(!checkForName(accessorsAggNotB,
"sB1"));
554 BOOST_CHECK(!checkForName(accessorsAggNotB,
"sB2"));
555 BOOST_CHECK(!checkForName(accessorsAggNotB,
"aggregatedB"));
587 std::cout <<
"testStatusMessage" << std::endl;
592 auto status = test.
getScalar<
int>(
"/Aggregated/status");
593 auto statusMessage = test.
getScalar<std::string>(
"/Aggregated/status_message");
594 auto innerStatus = test.
getScalar<
int>(
"/Aggregated/extraStatus");
595 auto innerStatusMessage = test.
getScalar<std::string>(
"/Aggregated/extraStatus_message");
600 innerStatus.readLatest();
601 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::OK));
602 innerStatusMessage.readLatest();
603 BOOST_CHECK_EQUAL(std::string(innerStatusMessage),
"");
605 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
606 statusMessage.readLatest();
607 BOOST_CHECK_EQUAL(std::string(statusMessage),
"");
610 app.outerGroup.s1.status = ctk::StatusOutput::Status::FAULT;
611 app.outerGroup.s1.status.write();
614 statusMessage.readLatest();
615 innerStatus.readLatest();
616 innerStatusMessage.readLatest();
617 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
618 std::string faultString1 =
"/OuterGroup/s1/s1 switched to FAULT";
619 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString1);
620 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
621 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString1);
624 app.outerGroup.s1.status = ctk::StatusOutput::Status::OK;
625 app.outerGroup.s1.status.write();
628 statusMessage.readLatest();
629 innerStatus.readLatest();
630 innerStatusMessage.readLatest();
631 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
632 BOOST_CHECK_EQUAL(std::string(statusMessage),
"");
633 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::OK));
634 BOOST_CHECK_EQUAL(std::string(innerStatusMessage),
"");
637 std::string faultString2 =
"Status 2 at fault";
639 app.outerGroup.s2.status.write(ctk::StatusOutput::Status::FAULT, faultString2);
642 statusMessage.readLatest();
643 innerStatus.readLatest();
644 innerStatusMessage.readLatest();
645 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
646 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString2);
647 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
648 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString2);
652 app.outerGroup.s1.status = ctk::StatusOutput::Status::FAULT;
653 app.outerGroup.s1.status.write();
656 statusMessage.readLatest();
657 innerStatus.readLatest();
658 innerStatusMessage.readLatest();
659 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
660 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString2);
661 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
662 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString2);
666 app.outerGroup.s1.status = ctk::StatusOutput::Status::OK;
667 app.outerGroup.s1.status.write();
669 app.outerGroup.s2.status.writeOk();
672 statusMessage.readLatest();
673 innerStatus.readLatest();
674 innerStatusMessage.readLatest();
675 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
676 BOOST_CHECK_EQUAL(std::string(statusMessage),
"");
677 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::OK));
678 BOOST_CHECK_EQUAL(std::string(innerStatusMessage),
"");
682 app.outerGroup.s1.status = ctk::StatusOutput::Status::FAULT;
683 app.outerGroup.s1.status.write();
685 app.outerGroup.s2.status.write(ctk::StatusOutput::Status::FAULT, faultString2);
688 statusMessage.readLatest();
689 innerStatus.readLatest();
690 innerStatusMessage.readLatest();
691 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
692 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString1);
693 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
694 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString1);