Skip to content

Commit 747304f

Browse files
Merge pull request #112 from AutoModality/AM-628/fix-sending-commands
fix: manifested nodes now being checked properly.
2 parents b5efbe8 + 3865d7d commit 747304f

File tree

2 files changed

+100
-2
lines changed

2 files changed

+100
-2
lines changed

src/am_super/super_node_mediator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,12 @@ pair<bool, map<string, string>> SuperNodeMediator::allManifestedNodesCheck(
222222
Supervisor& supervisor, std::function<bool(SuperNodeMediator::SuperNodeInfo&, SuperNodeMediator&)> check)
223223
{
224224
map<string, string> failed_nodes;
225-
226225
bool success = true;
227-
std::string error_message;
226+
228227
for (pair<string, SuperNodeInfo> nodePair : supervisor.nodes)
229228
{
230229
SuperNodeInfo node = nodePair.second;
230+
std::string error_message;
231231
// only check manifested nodes, ignore others
232232
if (node.manifested)
233233
{

test/super_node_mediator_unit_tests.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
#include <gtest/gtest.h> // googletest header file
22
#include <am_super/super_node_mediator.h>
33
#include <boost/algorithm/string/join.hpp>
4+
#include <boost/algorithm/string.hpp>
5+
#include <boost/algorithm/string/join.hpp>
6+
#include <boost/range/algorithm/copy.hpp>
7+
#include <boost/range/adaptor/map.hpp>
48

59
using namespace std;
610
using namespace am;
@@ -11,8 +15,20 @@ class SuperNodeMediatorTest : public ::testing::Test
1115
const string SUPER_NODE_NAME = "my_super_node";
1216
SuperNodeMediator superNodeMediator;
1317

18+
19+
1420
SuperNodeMediatorTest() : superNodeMediator(SUPER_NODE_NAME) {}
1521

22+
SuperNodeMediator::SuperNodeInfo manifested_lifecycle_node(string node_name, LifeCycleState state)
23+
{
24+
SuperNodeMediator::SuperNodeInfo node;
25+
node.name = node_name;
26+
node.online = true;
27+
node.manifested = true;
28+
node.state = state;
29+
return node;
30+
}
31+
1632
void ASSERT_CHECK(std::function<bool(SuperNodeMediator::SuperNodeInfo&, SuperNodeMediator&)> check, LifeCycleState state, bool expected,
1733
OperatorCommand last_op_command_received = OperatorCommand::ARM, ControllerState last_controller_state_received = ControllerState::COMPLETED)
1834
{
@@ -48,6 +64,20 @@ class SuperNodeMediatorTest : public ::testing::Test
4864
}
4965
}
5066

67+
void assertAllManifestedNodesCheck(SuperNodeMediator::Supervisor supervisor,
68+
std::function<bool(SuperNodeMediator::SuperNodeInfo&, SuperNodeMediator&)> check,
69+
vector<string> expected_failed_nodes, bool expected_success)
70+
{
71+
pair<bool, map<string, string>> result = superNodeMediator.allManifestedNodesCheck(supervisor, check);
72+
vector<string> failed_nodes;
73+
boost::copy(result.second | boost::adaptors::map_keys, std::back_inserter(failed_nodes));
74+
75+
std::sort(failed_nodes.begin(), failed_nodes.end());
76+
std::sort(expected_failed_nodes.begin(), expected_failed_nodes.end());
77+
78+
ASSERT_EQ((failed_nodes == expected_failed_nodes), expected_success);
79+
}
80+
5181
void ASSERT_getStateTransition(const SuperState &current_state, const SuperState &expected_state, const OperatorCommand &operator_command = (OperatorCommand)-1,
5282
const ControllerState& controller_state = (ControllerState)-1)
5383
{
@@ -204,6 +234,74 @@ TEST_F(SuperNodeMediatorTest, allManifestedNodesCheck_FlightControllerLifeCycleN
204234
assertAllManifestedNodesCheck(expected_success = true, node, check_result = false, "[WCK2]");
205235
}
206236

237+
TEST_F(SuperNodeMediatorTest, allManifestedNodesCheck_MultipleNodes_FirstNodeFails)
238+
{
239+
SuperNodeMediator::Supervisor supervisor;
240+
supervisor.system_state = SuperState::BOOTING;
241+
242+
//supervisor stores a map<string, SuperNodeInfo>
243+
supervisor.nodes.insert({"a", manifested_lifecycle_node("a", LifeCycleState::CONFIGURING)});
244+
supervisor.nodes.insert({"b", manifested_lifecycle_node("b", LifeCycleState::INACTIVE)});
245+
supervisor.nodes.insert({"c", manifested_lifecycle_node("c", LifeCycleState::INACTIVE)});
246+
supervisor.nodes.insert({"d", manifested_lifecycle_node("d", LifeCycleState::INACTIVE)});
247+
248+
//a and c should fail
249+
vector<string> expected_failed_nodes({"a"});
250+
251+
assertAllManifestedNodesCheck(supervisor, SuperNodeMediator::checkReadyToArm, expected_failed_nodes, true);
252+
}
253+
254+
TEST_F(SuperNodeMediatorTest, allManifestedNodesCheck_MultipleNodes_TwoNodesFail)
255+
{
256+
SuperNodeMediator::Supervisor supervisor;
257+
supervisor.system_state = SuperState::BOOTING;
258+
259+
//supervisor stores a map<string, SuperNodeInfo>
260+
supervisor.nodes.insert({"a", manifested_lifecycle_node("a", LifeCycleState::CONFIGURING)});
261+
supervisor.nodes.insert({"b", manifested_lifecycle_node("b", LifeCycleState::CONFIGURING)});
262+
supervisor.nodes.insert({"c", manifested_lifecycle_node("c", LifeCycleState::INACTIVE)});
263+
supervisor.nodes.insert({"d", manifested_lifecycle_node("d", LifeCycleState::INACTIVE)});
264+
265+
//a and b should fail
266+
vector<string> expected_failed_nodes({"a", "b"});
267+
268+
assertAllManifestedNodesCheck(supervisor, SuperNodeMediator::checkReadyToArm, expected_failed_nodes, true);
269+
}
270+
271+
TEST_F(SuperNodeMediatorTest, allManifestedNodesCheck_MultipleNodes_AllNodesFail)
272+
{
273+
SuperNodeMediator::Supervisor supervisor;
274+
supervisor.system_state = SuperState::BOOTING;
275+
276+
//supervisor stores a map<string, SuperNodeInfo>
277+
supervisor.nodes.insert({"a", manifested_lifecycle_node("a", LifeCycleState::CONFIGURING)});
278+
supervisor.nodes.insert({"b", manifested_lifecycle_node("b", LifeCycleState::CONFIGURING)});
279+
supervisor.nodes.insert({"c", manifested_lifecycle_node("c", LifeCycleState::CONFIGURING)});
280+
supervisor.nodes.insert({"d", manifested_lifecycle_node("d", LifeCycleState::CONFIGURING)});
281+
282+
//all should fail
283+
vector<string> expected_failed_nodes({"a", "b", "c", "d"});
284+
285+
assertAllManifestedNodesCheck(supervisor, SuperNodeMediator::checkReadyToArm, expected_failed_nodes, true);
286+
}
287+
288+
TEST_F(SuperNodeMediatorTest, allManifestedNodesCheck_MultipleNodes_AllNodesPass)
289+
{
290+
SuperNodeMediator::Supervisor supervisor;
291+
supervisor.system_state = SuperState::BOOTING;
292+
293+
//supervisor stores a map<string, SuperNodeInfo>
294+
supervisor.nodes.insert({"a", manifested_lifecycle_node("a", LifeCycleState::INACTIVE)});
295+
supervisor.nodes.insert({"b", manifested_lifecycle_node("b", LifeCycleState::INACTIVE)});
296+
supervisor.nodes.insert({"c", manifested_lifecycle_node("c", LifeCycleState::INACTIVE)});
297+
supervisor.nodes.insert({"d", manifested_lifecycle_node("d", LifeCycleState::INACTIVE)});
298+
299+
//none should fail
300+
vector<string> expected_failed_nodes({});
301+
302+
assertAllManifestedNodesCheck(supervisor, SuperNodeMediator::checkReadyToArm, expected_failed_nodes, true);
303+
}
304+
207305
TEST_F(SuperNodeMediatorTest, parseManifest_EmptyManifest)
208306
{
209307
SuperNodeMediator::Supervisor supervisor;

0 commit comments

Comments
 (0)