Pruning: Relax too strong assertion: PRUNED => !ARMED

If two Connect stages are sequenced, both sides can become ARMED.
However, that means that the wave of PRUNED status updates, shouldn't
overwrite a present ARMED state.
Added unit test.
This commit is contained in:
Robert Haschke 2022-03-04 09:07:40 +01:00
parent 8d7225d3b6
commit 096c671887
2 changed files with 17 additions and 2 deletions

View File

@ -83,8 +83,9 @@ bool InterfaceState::Priority::operator<(const InterfaceState::Priority& other)
}
void InterfaceState::updatePriority(const InterfaceState::Priority& priority) {
// Never overwrite ARMED with PRUNED: PRUNED => !ARMED
assert(priority.status() != InterfaceState::Status::PRUNED || priority_.status() != InterfaceState::Status::ARMED);
// Never overwrite ARMED with PRUNED
if (priority.status() == InterfaceState::Status::PRUNED && priority_.status() == InterfaceState::Status::ARMED)
return;
if (owner()) {
owner()->updatePriority(this, priority);

View File

@ -193,3 +193,17 @@ TEST_F(Pruning, PropagateFromParallelContainerMultiplePaths) {
// the failure in one branch of Alternatives must not prune computing back
EXPECT_EQ(back->runs_, 1u);
}
TEST_F(Pruning, TwoConnects) {
add(t, new GeneratorMockup({ 0 }));
add(t, new ForwardMockup({ INF }));
add(t, new ConnectMockup());
add(t, new GeneratorMockup());
add(t, new ConnectMockup());
add(t, new GeneratorMockup());
add(t, new ForwardMockup());
EXPECT_FALSE(t.plan());
}