174 std::cout <<
"testPriorities" << std::endl;
177 auto check = [&](ctk::StatusAggregator::PriorityMode mode,
auto prio0,
auto prio1,
auto prio2,
auto prio3,
178 bool warnMixed01 =
false) {
186 auto status = test.
getScalar<
int>(
"/Aggregated/status");
191 status.readNonBlocking();
192 BOOST_CHECK_EQUAL(
int(status),
int(prio0));
198 auto subcheck = [&](
auto lower,
auto higher,
bool writeS2First,
bool warnMixed =
false) {
209 std::cout << int(lower) <<
" vs. " << int(higher) << std::endl;
218 BOOST_CHECK_EQUAL(
int(status),
int(lower));
228 BOOST_CHECK_EQUAL(
int(status),
int(higher));
231 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::WARNING));
242 BOOST_CHECK_EQUAL(
int(status),
int(higher));
245 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::WARNING));
255 BOOST_CHECK_EQUAL(
int(status),
int(higher));
259 auto runAllSubchecks = [&](
bool writeS2First) {
260 subcheck(prio0, prio1, writeS2First, warnMixed01);
261 subcheck(prio0, prio2, writeS2First);
262 subcheck(prio0, prio3, writeS2First);
263 subcheck(prio1, prio2, writeS2First);
264 subcheck(prio1, prio3, writeS2First);
265 subcheck(prio2, prio3, writeS2First);
267 runAllSubchecks(
false);
268 runAllSubchecks(
true);
272 std::cout <<
"PriorityMode::fwko" << std::endl;
273 check(ctk::StatusAggregator::PriorityMode::fwko, ctk::StatusOutput::Status::OFF, ctk::StatusOutput::Status::OK,
274 ctk::StatusOutput::Status::WARNING, ctk::StatusOutput::Status::FAULT);
275 std::cout <<
"PriorityMode::fwok" << std::endl;
276 check(ctk::StatusAggregator::PriorityMode::fwok, ctk::StatusOutput::Status::OK, ctk::StatusOutput::Status::OFF,
277 ctk::StatusOutput::Status::WARNING, ctk::StatusOutput::Status::FAULT);
278 std::cout <<
"PriorityMode::ofwk" << std::endl;
279 check(ctk::StatusAggregator::PriorityMode::ofwk, ctk::StatusOutput::Status::OK, ctk::StatusOutput::Status::WARNING,
280 ctk::StatusOutput::Status::FAULT, ctk::StatusOutput::Status::OFF);
281 std::cout <<
"PriorityMode::fw_warn_mixed" << std::endl;
282 check(ctk::StatusAggregator::PriorityMode::fw_warn_mixed, ctk::StatusOutput::Status::OFF,
283 ctk::StatusOutput::Status::OK, ctk::StatusOutput::Status::WARNING, ctk::StatusOutput::Status::FAULT,
true);
349 std::cout <<
"testTwoLevels" << std::endl << std::endl << std::endl;
354 auto status = test.
getScalar<
int>(
"/Aggregated/status");
355 auto extraStatus = test.
getScalar<
int>(
"/Aggregated/extraStatus");
360 extraStatus.readLatest();
361 BOOST_CHECK_EQUAL(
int(extraStatus),
int(ctk::StatusOutput::Status::OFF));
363 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OFF));
366 app.
s.
status = ctk::StatusOutput::Status::OK;
370 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
371 app.
s.
status = ctk::StatusOutput::Status::OFF;
375 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OFF));
378 app.outerGroup.s2.status = ctk::StatusOutput::Status::OK;
379 app.outerGroup.s2.status.write();
382 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
383 app.outerGroup.s2.status = ctk::StatusOutput::Status::OFF;
384 app.outerGroup.s2.status.write();
387 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OFF));
422 std::cout <<
"testTags" << std::endl;
427 auto aggregateA = test.
getScalar<
int>(
"/aggregateA");
428 auto aggregateB = test.
getScalar<
int>(
"/aggregateB");
429 auto aggregateAll = test.
getScalar<
int>(
"/aggregateAll");
430 auto Group_aggregateA = test.
getScalar<
int>(
"/Group/aggregateA");
431 auto Group_aggregateB = test.
getScalar<
int>(
"/Group/aggregateB");
436 aggregateA.readLatest();
437 aggregateB.readLatest();
438 aggregateAll.readLatest();
439 Group_aggregateA.readLatest();
440 Group_aggregateB.readLatest();
441 BOOST_CHECK_EQUAL(
int(aggregateA),
int(ctk::StatusOutput::Status::WARNING));
442 BOOST_CHECK_EQUAL(
int(aggregateB),
int(ctk::StatusOutput::Status::OFF));
443 BOOST_CHECK_EQUAL(
int(aggregateAll),
int(ctk::StatusOutput::Status::WARNING));
444 BOOST_CHECK_EQUAL(
int(Group_aggregateA),
int(ctk::StatusOutput::Status::WARNING));
445 BOOST_CHECK_EQUAL(
int(Group_aggregateB),
int(ctk::StatusOutput::Status::OFF));
447 app.group.sAB.status = ctk::StatusOutput::Status::FAULT;
448 app.group.sAB.status.write();
454 aggregateA.readLatest();
455 aggregateB.readLatest();
456 aggregateAll.readLatest();
457 Group_aggregateA.readLatest();
458 Group_aggregateB.readLatest();
459 BOOST_CHECK_EQUAL(
int(aggregateA),
int(ctk::StatusOutput::Status::FAULT));
460 BOOST_CHECK_EQUAL(
int(aggregateB),
int(ctk::StatusOutput::Status::FAULT));
461 BOOST_CHECK_EQUAL(
int(aggregateAll),
int(ctk::StatusOutput::Status::FAULT));
462 BOOST_CHECK_EQUAL(
int(Group_aggregateA),
int(ctk::StatusOutput::Status::FAULT));
463 BOOST_CHECK_EQUAL(
int(Group_aggregateB),
int(ctk::StatusOutput::Status::FAULT));
501 std::cout <<
"testAggregatorTags" << std::endl;
506 auto checkForName = [](
auto& accessors, std::string name) {
507 return std::any_of(accessors.begin(), accessors.end(), [&name](
auto acc) { return acc.getName() == name; });
513 BOOST_TEST(accessorsAggA.size() == 4);
514 BOOST_CHECK(checkForName(accessorsAggA,
"sA"));
515 BOOST_CHECK(!checkForName(accessorsAggA,
"aggregatedA"));
520 BOOST_TEST(accessorsAggAggA.size() == 5);
521 BOOST_CHECK(checkForName(accessorsAggAggA,
"aggregatedA"));
522 BOOST_CHECK(!checkForName(accessorsAggAggA,
"sA"));
527 BOOST_TEST(accessorsAggAggB.size() == 5);
528 BOOST_CHECK(checkForName(accessorsAggAggB,
"aggregatedB"));
529 BOOST_CHECK(!checkForName(accessorsAggAggB,
"sB1"));
530 BOOST_CHECK(!checkForName(accessorsAggAggB,
"sB2"));
562 std::cout <<
"testStatusMessage" << std::endl;
567 auto status = test.
getScalar<
int>(
"/Aggregated/status");
568 auto statusMessage = test.
getScalar<std::string>(
"/Aggregated/status_message");
569 auto innerStatus = test.
getScalar<
int>(
"/Aggregated/extraStatus");
570 auto innerStatusMessage = test.
getScalar<std::string>(
"/Aggregated/extraStatus_message");
575 innerStatus.readLatest();
576 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::OK));
577 innerStatusMessage.readLatest();
578 BOOST_CHECK_EQUAL(std::string(innerStatusMessage),
"");
580 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
581 statusMessage.readLatest();
582 BOOST_CHECK_EQUAL(std::string(statusMessage),
"");
585 app.outerGroup.s1.status = ctk::StatusOutput::Status::FAULT;
586 app.outerGroup.s1.status.write();
589 statusMessage.readLatest();
590 innerStatus.readLatest();
591 innerStatusMessage.readLatest();
592 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
593 std::string faultString1 =
"/OuterGroup/s1/s1 switched to FAULT";
594 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString1);
595 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
596 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString1);
599 app.outerGroup.s1.status = ctk::StatusOutput::Status::OK;
600 app.outerGroup.s1.status.write();
603 statusMessage.readLatest();
604 innerStatus.readLatest();
605 innerStatusMessage.readLatest();
606 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
607 BOOST_CHECK_EQUAL(std::string(statusMessage),
"");
608 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::OK));
609 BOOST_CHECK_EQUAL(std::string(innerStatusMessage),
"");
612 std::string faultString2 =
"Status 2 at fault";
614 app.outerGroup.s2.status.write(ctk::StatusOutput::Status::FAULT, faultString2);
617 statusMessage.readLatest();
618 innerStatus.readLatest();
619 innerStatusMessage.readLatest();
620 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
621 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString2);
622 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
623 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString2);
627 app.outerGroup.s1.status = ctk::StatusOutput::Status::FAULT;
628 app.outerGroup.s1.status.write();
631 statusMessage.readLatest();
632 innerStatus.readLatest();
633 innerStatusMessage.readLatest();
634 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
635 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString2);
636 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
637 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString2);
641 app.outerGroup.s1.status = ctk::StatusOutput::Status::OK;
642 app.outerGroup.s1.status.write();
644 app.outerGroup.s2.status.writeOk();
647 statusMessage.readLatest();
648 innerStatus.readLatest();
649 innerStatusMessage.readLatest();
650 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::OK));
651 BOOST_CHECK_EQUAL(std::string(statusMessage),
"");
652 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::OK));
653 BOOST_CHECK_EQUAL(std::string(innerStatusMessage),
"");
657 app.outerGroup.s1.status = ctk::StatusOutput::Status::FAULT;
658 app.outerGroup.s1.status.write();
660 app.outerGroup.s2.status.write(ctk::StatusOutput::Status::FAULT, faultString2);
663 statusMessage.readLatest();
664 innerStatus.readLatest();
665 innerStatusMessage.readLatest();
666 BOOST_CHECK_EQUAL(
int(status),
int(ctk::StatusOutput::Status::FAULT));
667 BOOST_CHECK_EQUAL(std::string(statusMessage), faultString1);
668 BOOST_CHECK_EQUAL(
int(innerStatus),
int(ctk::StatusOutput::Status::FAULT));
669 BOOST_CHECK_EQUAL(std::string(innerStatusMessage), faultString1);