blob: b89bca5a0fb107b76002ede0182ad3e2b875c776 [file] [log] [blame]
/*
* Copyright (C) 2020 CESNET, https://photonics.cesnet.cz/
*
* Written by Tomáš Pecka <tomas.pecka@fit.cvut.cz>
*
*/
#include "trompeloeil_doctest.h"
#include "fake.h"
#include "health/manager/StateManager.h"
#include "test_log_setup.h"
TEST_CASE("State multiplexer")
{
TEST_INIT_LOGS;
trompeloeil::sequence seq1;
auto mx = std::make_shared<velia::health::StateManager>();
auto o1 = std::make_shared<FakeOutput>();
mx->m_outputSignal.connect([&](const velia::health::State state) { o1->update(state); });
SECTION("One input")
{
REQUIRE_STATE_OUTPUT(OK);
auto i1 = std::make_shared<ManuallyInvokableInput>(mx);
SECTION("Nothing happens")
{
}
SECTION("State changes")
{
REQUIRE_STATE_OUTPUT(ERROR);
i1->invokeChangeState(velia::health::State::ERROR);
REQUIRE_STATE_OUTPUT(OK);
i1->invokeChangeState(velia::health::State::OK);
}
}
SECTION("Multiple inputs")
{
REQUIRE_STATE_OUTPUT(OK);
auto i1 = std::make_shared<ManuallyInvokableInput>(mx);
auto i2 = std::make_shared<ManuallyInvokableInput>(mx);
SECTION("Nothing happens")
{
}
SECTION("State changes")
{
i1->invokeChangeState(velia::health::State::OK); // [OK, OK]
i2->invokeChangeState(velia::health::State::OK); // [OK, OK]
{
REQUIRE_STATE_OUTPUT(ERROR);
i1->invokeChangeState(velia::health::State::ERROR); // [ERROR, OK]
}
{
REQUIRE_STATE_OUTPUT(WARNING);
i1->invokeChangeState(velia::health::State::WARNING); // [WARNING, OK]
}
i2->invokeChangeState(velia::health::State::OK); // [WARNING, OK]
{
REQUIRE_STATE_OUTPUT(OK);
i1->invokeChangeState(velia::health::State::OK); // [OK, OK]
}
{
REQUIRE_STATE_OUTPUT(ERROR);
i2->invokeChangeState(velia::health::State::ERROR); // [OK, ERROR]
}
{
REQUIRE_STATE_OUTPUT(WARNING);
i2->invokeChangeState(velia::health::State::WARNING); // [OK, WARNING]
}
i1->invokeChangeState(velia::health::State::WARNING); // [WARNING, WARNING]
{
REQUIRE_STATE_OUTPUT(ERROR);
i2->invokeChangeState(velia::health::State::ERROR); // [WARNING, ERROR]
}
{
REQUIRE_STATE_OUTPUT(WARNING);
i2->invokeChangeState(velia::health::State::WARNING); // [WARNING, WARNING]
}
i1->invokeChangeState(velia::health::State::OK); // [OK, WARNING]
{
REQUIRE_STATE_OUTPUT(OK);
i2->invokeChangeState(velia::health::State::OK); // [OK, OK]
}
i1.reset(); // [OK]
i2.reset(); // [], but no update because there's nothing new to report
{
REQUIRE_STATE_OUTPUT(OK);
i1 = std::make_shared<ManuallyInvokableInput>(mx); // [OK]
}
i1.reset(); // []
}
}
}