|
24 | 24 | #include "parallel_action.h" |
25 | 25 | #include "function_action.h" |
26 | 26 | #include "sleep_action.h" |
| 27 | +#include "dummy_action.h" |
27 | 28 |
|
28 | 29 | namespace tbox { |
29 | 30 | namespace flow { |
@@ -96,5 +97,140 @@ TEST(ParallelAction, SleepFunctionAction) { |
96 | 97 | EXPECT_TRUE(nodelay_action_succ); |
97 | 98 | } |
98 | 99 |
|
| 100 | +TEST(ParallelAction, AllFinish) { |
| 101 | + auto loop = event::Loop::New(); |
| 102 | + SetScopeExitAction([loop] { delete loop; }); |
| 103 | + |
| 104 | + auto para_action = new ParallelAction(*loop, ParallelAction::Mode::kAllFinish); |
| 105 | + SetScopeExitAction([para_action] { delete para_action; }); |
| 106 | + |
| 107 | + auto ta1 = new DummyAction(*loop); |
| 108 | + auto ta2 = new DummyAction(*loop); |
| 109 | + auto ta3 = new DummyAction(*loop); |
| 110 | + para_action->addChild(ta1); |
| 111 | + para_action->addChild(ta2); |
| 112 | + para_action->addChild(ta3); |
| 113 | + |
| 114 | + para_action->setFinishCallback( |
| 115 | + [loop](bool is_succ, const Action::Reason&, const Action::Trace&) { |
| 116 | + EXPECT_TRUE(is_succ); |
| 117 | + loop->exitLoop(); |
| 118 | + } |
| 119 | + ); |
| 120 | + |
| 121 | + para_action->start(); |
| 122 | + loop->runNext([ta1] { ta1->emitFinish(true); }); |
| 123 | + loop->runNext([ta2] { ta2->emitFinish(false); }); |
| 124 | + loop->runNext([ta3] { ta3->emitFinish(false); }); |
| 125 | + loop->runLoop(); |
| 126 | + |
| 127 | + EXPECT_EQ(ta1->state(), Action::State::kFinished); |
| 128 | + EXPECT_EQ(ta2->state(), Action::State::kFinished); |
| 129 | + EXPECT_EQ(ta3->state(), Action::State::kFinished); |
| 130 | + EXPECT_EQ(ta1->result(), Action::Result::kSuccess); |
| 131 | + EXPECT_EQ(ta2->result(), Action::Result::kFail); |
| 132 | + EXPECT_EQ(ta2->result(), Action::Result::kFail); |
| 133 | +} |
| 134 | + |
| 135 | +TEST(ParallelAction, AnyFail) { |
| 136 | + auto loop = event::Loop::New(); |
| 137 | + SetScopeExitAction([loop] { delete loop; }); |
| 138 | + |
| 139 | + auto para_action = new ParallelAction(*loop, ParallelAction::Mode::kAnyFail); |
| 140 | + SetScopeExitAction([para_action] { delete para_action; }); |
| 141 | + |
| 142 | + auto ta1 = new DummyAction(*loop); |
| 143 | + auto ta2 = new DummyAction(*loop); |
| 144 | + auto ta3 = new DummyAction(*loop); |
| 145 | + para_action->addChild(ta1); |
| 146 | + para_action->addChild(ta2); |
| 147 | + para_action->addChild(ta3); |
| 148 | + |
| 149 | + para_action->setFinishCallback( |
| 150 | + [loop](bool is_succ, const Action::Reason&, const Action::Trace&) { |
| 151 | + EXPECT_TRUE(is_succ); |
| 152 | + loop->exitLoop(); |
| 153 | + } |
| 154 | + ); |
| 155 | + |
| 156 | + para_action->start(); |
| 157 | + loop->runNext([ta1] { ta1->emitFinish(true); }); |
| 158 | + loop->runNext([ta2] { ta2->emitFinish(false); }); |
| 159 | + loop->runLoop(); |
| 160 | + |
| 161 | + EXPECT_EQ(ta1->state(), Action::State::kFinished); |
| 162 | + EXPECT_EQ(ta1->result(), Action::Result::kSuccess); |
| 163 | + EXPECT_EQ(ta2->state(), Action::State::kFinished); |
| 164 | + EXPECT_EQ(ta2->result(), Action::Result::kFail); |
| 165 | + EXPECT_EQ(ta3->state(), Action::State::kStoped); |
| 166 | +} |
| 167 | + |
| 168 | +TEST(ParallelAction, AnySucc) { |
| 169 | + auto loop = event::Loop::New(); |
| 170 | + SetScopeExitAction([loop] { delete loop; }); |
| 171 | + |
| 172 | + auto para_action = new ParallelAction(*loop, ParallelAction::Mode::kAnySucc); |
| 173 | + SetScopeExitAction([para_action] { delete para_action; }); |
| 174 | + |
| 175 | + auto ta1 = new DummyAction(*loop); |
| 176 | + auto ta2 = new DummyAction(*loop); |
| 177 | + auto ta3 = new DummyAction(*loop); |
| 178 | + para_action->addChild(ta1); |
| 179 | + para_action->addChild(ta2); |
| 180 | + para_action->addChild(ta3); |
| 181 | + |
| 182 | + para_action->setFinishCallback( |
| 183 | + [loop](bool is_succ, const Action::Reason&, const Action::Trace&) { |
| 184 | + EXPECT_TRUE(is_succ); |
| 185 | + loop->exitLoop(); |
| 186 | + } |
| 187 | + ); |
| 188 | + |
| 189 | + para_action->start(); |
| 190 | + loop->runNext([ta1] { ta1->emitFinish(false); }); |
| 191 | + loop->runNext([ta2] { ta2->emitFinish(true); }); |
| 192 | + loop->runLoop(); |
| 193 | + |
| 194 | + EXPECT_EQ(ta1->state(), Action::State::kFinished); |
| 195 | + EXPECT_EQ(ta1->result(), Action::Result::kFail); |
| 196 | + EXPECT_EQ(ta2->state(), Action::State::kFinished); |
| 197 | + EXPECT_EQ(ta2->result(), Action::Result::kSuccess); |
| 198 | + EXPECT_EQ(ta3->state(), Action::State::kStoped); |
| 199 | +} |
| 200 | + |
| 201 | +TEST(ParallelAction, Block) { |
| 202 | + auto loop = event::Loop::New(); |
| 203 | + SetScopeExitAction([loop] { delete loop; }); |
| 204 | + |
| 205 | + auto para_action = new ParallelAction(*loop, ParallelAction::Mode::kAnySucc); |
| 206 | + SetScopeExitAction([para_action] { delete para_action; }); |
| 207 | + |
| 208 | + auto ta1 = new DummyAction(*loop); |
| 209 | + auto ta2 = new DummyAction(*loop); |
| 210 | + auto ta3 = new DummyAction(*loop); |
| 211 | + para_action->addChild(ta1); |
| 212 | + para_action->addChild(ta2); |
| 213 | + para_action->addChild(ta3); |
| 214 | + |
| 215 | + para_action->setBlockCallback( |
| 216 | + [=] (const Action::Reason &r, const Action::Trace &t) { |
| 217 | + EXPECT_EQ(r.code, 111); |
| 218 | + ASSERT_EQ(t.size(), 2u); |
| 219 | + EXPECT_EQ(t[0].id, ta2->id()); |
| 220 | + loop->exitLoop(); |
| 221 | + } |
| 222 | + ); |
| 223 | + |
| 224 | + para_action->start(); |
| 225 | + loop->runNext([ta1] { ta1->emitFinish(false); }); |
| 226 | + loop->runNext([ta2] { ta2->emitBlock(Action::Reason(111)); }); |
| 227 | + loop->runLoop(); |
| 228 | + |
| 229 | + EXPECT_EQ(ta1->state(), Action::State::kFinished); |
| 230 | + EXPECT_EQ(ta1->result(), Action::Result::kFail); |
| 231 | + EXPECT_EQ(ta2->state(), Action::State::kPause); |
| 232 | + EXPECT_EQ(ta3->state(), Action::State::kPause); |
| 233 | +} |
| 234 | + |
99 | 235 | } |
100 | 236 | } |
0 commit comments