3737
3838using namespace cluster ;
3939
40- enum class ExpectedAction { StartWriting, GiveUpWriting, NoAction };
40+ enum class ExpectedAction { StartWriting, GiveUpWriting, NoAction, SetFallback };
4141
4242struct WriterDeciderTestParams {
4343 std::string testName;
@@ -97,6 +97,10 @@ TEST_P(WriterDeciderTest, WriterSelection)
9797 EXPECT_CALL (*clonedState, giveUpWriting ());
9898 EXPECT_CALL (writerStateRef, clone ()).WillOnce (testing::Return (testing::ByMove (std::move (clonedState))));
9999 break ;
100+ case ExpectedAction::SetFallback:
101+ EXPECT_CALL (*clonedState, setWriterDecidingFallback ());
102+ EXPECT_CALL (writerStateRef, clone ()).WillOnce (testing::Return (testing::ByMove (std::move (clonedState))));
103+ break ;
100104 case ExpectedAction::NoAction:
101105 if (not params.useEmptyClusterData ) {
102106 // For all-ReadOnly case, we still clone but don't call any action
@@ -107,19 +111,25 @@ TEST_P(WriterDeciderTest, WriterSelection)
107111 }
108112
109113 std::shared_ptr<Backend::ClusterData> clusterData;
114+ ClioNode::cUUID selfIdPtr;
110115
111116 if (params.useEmptyClusterData ) {
112117 clusterData = std::make_shared<Backend::ClusterData>(std::unexpected (std::string (" Communication failed" )));
118+ selfIdPtr = std::make_shared<boost::uuids::uuid>(selfUuid);
113119 } else {
114120 std::vector<ClioNode> nodes;
115121 nodes.reserve (params.nodes .size ());
116122 for (auto const & [uuidValue, role] : params.nodes ) {
117- nodes.push_back (makeNode (makeUuid (uuidValue), role));
123+ auto node = makeNode (makeUuid (uuidValue), role);
124+ if (uuidValue == params.selfUuidValue ) {
125+ selfIdPtr = node.uuid ; // Use the same shared_ptr as in the node
126+ }
127+ nodes.push_back (std::move (node));
118128 }
119129 clusterData = std::make_shared<Backend::ClusterData>(std::move (nodes));
120130 }
121131
122- decider.onNewState (std::make_shared<boost::uuids::uuid>(selfUuid) , clusterData);
132+ decider.onNewState (selfIdPtr , clusterData);
123133
124134 ctx.join ();
125135}
@@ -220,6 +230,43 @@ INSTANTIATE_TEST_SUITE_P(
220230 {0x03 , ClioNode::DbRole::Writer},
221231 {0x02 , ClioNode::DbRole::ReadOnly}},
222232 .expectedAction = ExpectedAction::StartWriting
233+ },
234+ WriterDeciderTestParams{
235+ .testName = " SelfIsFallbackNoActionTaken" ,
236+ .selfUuidValue = 0x01 ,
237+ .nodes = {{0x01 , ClioNode::DbRole::Fallback}, {0x02 , ClioNode::DbRole::Writer}},
238+ .expectedAction = ExpectedAction::NoAction
239+ },
240+ WriterDeciderTestParams{
241+ .testName = " OtherNodeIsFallbackSetsFallbackMode" ,
242+ .selfUuidValue = 0x01 ,
243+ .nodes = {{0x01 , ClioNode::DbRole::Writer}, {0x02 , ClioNode::DbRole::Fallback}},
244+ .expectedAction = ExpectedAction::SetFallback
245+ },
246+ WriterDeciderTestParams{
247+ .testName = " SelfIsReadOnlyOthersAreFallbackNoActionTaken" ,
248+ .selfUuidValue = 0x01 ,
249+ .nodes = {{0x01 , ClioNode::DbRole::ReadOnly}, {0x02 , ClioNode::DbRole::Fallback}},
250+ .expectedAction = ExpectedAction::NoAction
251+ },
252+ WriterDeciderTestParams{
253+ .testName = " MultipleFallbackNodesSelfNotFallbackSetsFallback" ,
254+ .selfUuidValue = 0x03 ,
255+ .nodes =
256+ {{0x01 , ClioNode::DbRole::Fallback},
257+ {0x02 , ClioNode::DbRole::Fallback},
258+ {0x03 , ClioNode::DbRole::Writer}},
259+ .expectedAction = ExpectedAction::SetFallback
260+ },
261+ WriterDeciderTestParams{
262+ .testName = " MixedRolesWithOneFallbackSetsFallback" ,
263+ .selfUuidValue = 0x02 ,
264+ .nodes =
265+ {{0x01 , ClioNode::DbRole::Writer},
266+ {0x02 , ClioNode::DbRole::NotWriter},
267+ {0x03 , ClioNode::DbRole::Fallback},
268+ {0x04 , ClioNode::DbRole::Writer}},
269+ .expectedAction = ExpectedAction::SetFallback
223270 }
224271 ),
225272 [](testing::TestParamInfo<WriterDeciderTestParams> const & info) { return info.param .testName ; }
0 commit comments