/******************************************************************************** * Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #include #include #include namespace { using namespace fair::mq; using namespace fair::mq::sdk::cmd; TEST(Format, Construction) { auto const props(std::vector>({{"k1", "v1"}, {"k2", "v2"}})); Cmds checkStateCmds(make()); Cmds changeStateCmds(make(Transition::Stop)); Cmds dumpConfigCmds(make()); Cmds subscribeToHeartbeatsCmds(make()); Cmds unsubscribeFromHeartbeatsCmds(make()); Cmds subscribeToStateChangeCmds(make()); Cmds unsubscribeFromStateChangeCmds(make()); Cmds stateChangeExitingReceivedCmds(make()); Cmds setPropertiesCmds(make(42, props)); Cmds currentStateCmds(make("somedeviceid", State::Running)); Cmds transitionStatusCmds(make("somedeviceid", Result::Ok, Transition::Stop)); Cmds configCmds(make("somedeviceid", "someconfig")); Cmds heartbeatSubscriptionCmds(make("somedeviceid", Result::Ok)); Cmds heartbeatUnsubscriptionCmds(make("somedeviceid", Result::Ok)); Cmds heartbeatCmds(make("somedeviceid")); Cmds stateChangeSubscriptionCmds(make("somedeviceid", Result::Ok)); Cmds stateChangeUnsubscriptionCmds(make("somedeviceid", Result::Ok)); Cmds stateChangeCmds(make("somedeviceid", 123456, State::Running, State::Ready)); Cmds propertiesSetCmds(make("somedeviceid", 42, Result::Ok)); ASSERT_EQ(checkStateCmds.At(0).GetType(), Type::check_state); ASSERT_EQ(changeStateCmds.At(0).GetType(), Type::change_state); ASSERT_EQ(static_cast(changeStateCmds.At(0)).GetTransition(), Transition::Stop); ASSERT_EQ(dumpConfigCmds.At(0).GetType(), Type::dump_config); ASSERT_EQ(subscribeToHeartbeatsCmds.At(0).GetType(), Type::subscribe_to_heartbeats); ASSERT_EQ(unsubscribeFromHeartbeatsCmds.At(0).GetType(), Type::unsubscribe_from_heartbeats); ASSERT_EQ(subscribeToStateChangeCmds.At(0).GetType(), Type::subscribe_to_state_change); ASSERT_EQ(unsubscribeFromStateChangeCmds.At(0).GetType(), Type::unsubscribe_from_state_change); ASSERT_EQ(stateChangeExitingReceivedCmds.At(0).GetType(), Type::state_change_exiting_received); ASSERT_EQ(setPropertiesCmds.At(0).GetType(), Type::set_properties); ASSERT_EQ(static_cast(setPropertiesCmds.At(0)).GetRequestId(), 42); ASSERT_EQ(static_cast(setPropertiesCmds.At(0)).GetProps(), props); ASSERT_EQ(currentStateCmds.At(0).GetType(), Type::current_state); ASSERT_EQ(static_cast(currentStateCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(currentStateCmds.At(0)).GetCurrentState(), State::Running); ASSERT_EQ(transitionStatusCmds.At(0).GetType(), Type::transition_status); ASSERT_EQ(static_cast(transitionStatusCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(transitionStatusCmds.At(0)).GetResult(), Result::Ok); ASSERT_EQ(static_cast(transitionStatusCmds.At(0)).GetTransition(), Transition::Stop); ASSERT_EQ(configCmds.At(0).GetType(), Type::config); ASSERT_EQ(static_cast(configCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(configCmds.At(0)).GetConfig(), "someconfig"); ASSERT_EQ(heartbeatSubscriptionCmds.At(0).GetType(), Type::heartbeat_subscription); ASSERT_EQ(static_cast(heartbeatSubscriptionCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(heartbeatSubscriptionCmds.At(0)).GetResult(), Result::Ok); ASSERT_EQ(heartbeatUnsubscriptionCmds.At(0).GetType(), Type::heartbeat_unsubscription); ASSERT_EQ(static_cast(heartbeatUnsubscriptionCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(heartbeatUnsubscriptionCmds.At(0)).GetResult(), Result::Ok); ASSERT_EQ(heartbeatCmds.At(0).GetType(), Type::heartbeat); ASSERT_EQ(static_cast(heartbeatCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(stateChangeSubscriptionCmds.At(0).GetType(), Type::state_change_subscription); ASSERT_EQ(static_cast(stateChangeSubscriptionCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(stateChangeSubscriptionCmds.At(0)).GetResult(), Result::Ok); ASSERT_EQ(stateChangeUnsubscriptionCmds.At(0).GetType(), Type::state_change_unsubscription); ASSERT_EQ(static_cast(stateChangeUnsubscriptionCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(stateChangeUnsubscriptionCmds.At(0)).GetResult(), Result::Ok); ASSERT_EQ(stateChangeCmds.At(0).GetType(), Type::state_change); ASSERT_EQ(static_cast(stateChangeCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(stateChangeCmds.At(0)).GetTaskId(), 123456); ASSERT_EQ(static_cast(stateChangeCmds.At(0)).GetLastState(), State::Running); ASSERT_EQ(static_cast(stateChangeCmds.At(0)).GetCurrentState(), State::Ready); ASSERT_EQ(propertiesSetCmds.At(0).GetType(), Type::properties_set); ASSERT_EQ(static_cast(propertiesSetCmds.At(0)).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(propertiesSetCmds.At(0)).GetRequestId(), 42); ASSERT_EQ(static_cast(propertiesSetCmds.At(0)).GetResult(), Result::Ok); } void fillCommands(Cmds& cmds) { auto const props(std::vector>({{"k1", "v1"}, {"k2", "v2"}})); cmds.Add(); cmds.Add(Transition::Stop); cmds.Add(); cmds.Add(); cmds.Add(); cmds.Add(); cmds.Add(); cmds.Add(); cmds.Add(42, props); cmds.Add("somedeviceid", State::Running); cmds.Add("somedeviceid", Result::Ok, Transition::Stop); cmds.Add("somedeviceid", "someconfig"); cmds.Add("somedeviceid", Result::Ok); cmds.Add("somedeviceid", Result::Ok); cmds.Add("somedeviceid"); cmds.Add("somedeviceid", Result::Ok); cmds.Add("somedeviceid", Result::Ok); cmds.Add("somedeviceid", 123456, State::Running, State::Ready); cmds.Add("somedeviceid", 42, Result::Ok); } void checkCommands(Cmds& cmds) { ASSERT_EQ(cmds.Size(), 19); int count = 0; auto const props(std::vector>({{"k1", "v1"}, {"k2", "v2"}})); for (const auto& cmd : cmds) { switch (cmd->GetType()) { case Type::check_state: ++count; break; case Type::change_state: ++count; ASSERT_EQ(static_cast(*cmd).GetTransition(), Transition::Stop); break; case Type::dump_config: ++count; break; case Type::subscribe_to_heartbeats: ++count; break; case Type::unsubscribe_from_heartbeats: ++count; break; case Type::subscribe_to_state_change: ++count; break; case Type::unsubscribe_from_state_change: ++count; break; case Type::state_change_exiting_received: ++count; break; case Type::set_properties: ++count; ASSERT_EQ(static_cast(*cmd).GetRequestId(), 42); ASSERT_EQ(static_cast(*cmd).GetProps(), props); break; case Type::current_state: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetCurrentState(), State::Running); break; case Type::transition_status: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetResult(), Result::Ok); ASSERT_EQ(static_cast(*cmd).GetTransition(), Transition::Stop); break; case Type::config: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetConfig(), "someconfig"); break; case Type::heartbeat_subscription: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetResult(), Result::Ok); break; case Type::heartbeat_unsubscription: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetResult(), Result::Ok); break; case Type::heartbeat: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); break; case Type::state_change_subscription: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetResult(), Result::Ok); break; case Type::state_change_unsubscription: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetResult(), Result::Ok); break; case Type::state_change: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetTaskId(), 123456); ASSERT_EQ(static_cast(*cmd).GetLastState(), State::Running); ASSERT_EQ(static_cast(*cmd).GetCurrentState(), State::Ready); break; case Type::properties_set: ++count; ASSERT_EQ(static_cast(*cmd).GetDeviceId(), "somedeviceid"); ASSERT_EQ(static_cast(*cmd).GetRequestId(), 42); ASSERT_EQ(static_cast(*cmd).GetResult(), Result::Ok); break; default: ASSERT_TRUE(false); break; } } ASSERT_EQ(count, 19); } TEST(Format, SerializationBinary) { Cmds outCmds; fillCommands(outCmds); std::string buffer(outCmds.Serialize()); Cmds inCmds; inCmds.Deserialize(buffer); checkCommands(inCmds); } TEST(Format, SerializationJSON) { Cmds outCmds; fillCommands(outCmds); std::string buffer(outCmds.Serialize(Format::JSON)); Cmds inCmds; inCmds.Deserialize(buffer, Format::JSON); checkCommands(inCmds); } } // namespace