#include #include #include "secsgem/gem/default_handlers.hpp" #include "secsgem/gem/messages.hpp" #include "secsgem/gem/runtime.hpp" using namespace secsgem; namespace gem = secsgem::gem; namespace s2 = secsgem::secs2; #ifndef SECSGEM_DATA_DIR #error "SECSGEM_DATA_DIR not defined; see CMakeLists.txt" #endif static gem::EquipmentRuntime::Config test_config() { gem::EquipmentRuntime::Config c; c.equipment_yaml = SECSGEM_DATA_DIR "/equipment.yaml"; c.control_state_yaml = SECSGEM_DATA_DIR "/control_state.yaml"; c.process_job_yaml = SECSGEM_DATA_DIR "/process_job_state.yaml"; c.control_job_yaml = SECSGEM_DATA_DIR "/control_job_state.yaml"; c.port = 0; return c; } TEST_CASE("register_default_handlers populates the runtime's Router") { gem::EquipmentRuntime rt(test_config()); CHECK(rt.router().size() == 0); // nothing registered yet gem::register_default_handlers(rt); CHECK(rt.router().size() > 40); // the full GEM handler set (~56) } TEST_CASE("register_default_handlers: S1F1 dispatches to S1F2 On-Line Data") { gem::EquipmentRuntime rt(test_config()); gem::register_default_handlers(rt); auto reply = rt.router().dispatch(s2::Message(1, 1, true)); // Are You There REQUIRE(reply.has_value()); CHECK(reply->stream == 1); CHECK(reply->function == 2); } TEST_CASE("register_default_handlers: S2F41 reaches the on_command behaviour hook") { gem::EquipmentRuntime rt(test_config()); gem::register_default_handlers(rt); bool ran = false; std::string seen; rt.on_command("START", [&](const std::string& rcmd, const std::vector&) { ran = true; seen = rcmd; return gem::HostCmdAck::Accept; }); auto reply = rt.router().dispatch(gem::s2f41_host_command("START", {})); REQUIRE(reply.has_value()); CHECK(reply->stream == 2); CHECK(reply->function == 42); // S2F42 Host Command Ack CHECK(ran); // the handler ran inside the S2F41 dispatch CHECK(seen == "START"); } TEST_CASE("register_default_handlers: unknown command is rejected, hook not invoked") { gem::EquipmentRuntime rt(test_config()); gem::register_default_handlers(rt); auto reply = rt.router().dispatch(gem::s2f41_host_command("NO_SUCH_CMD", {})); REQUIRE(reply.has_value()); CHECK(reply->stream == 2); CHECK(reply->function == 42); // still an S2F42, carrying an error HCACK }