diff --git a/carnot/test_unhappy_path.py b/carnot/test_unhappy_path.py index 6f60215..45a2052 100644 --- a/carnot/test_unhappy_path.py +++ b/carnot/test_unhappy_path.py @@ -153,44 +153,49 @@ class TestCarnotHappyPath(TestCase): proposed_block = leader.latest_event self.assertIsNotNone(proposed_block) - node: MockCarnot - timeouts = [] - for node in (nodes[int_to_id(_id)] for _id in range(3)): - node.local_timeout() - timeouts.append(node.latest_event) + for view in range(1, 4): + node: MockCarnot + timeouts = [] + for node in (nodes[int_to_id(_id)] for _id in range(3)): + node.local_timeout() + timeouts.append(node.latest_event) - leader.timeout_detected(timeouts) - timeout_qc = leader.latest_event + leader.timeout_detected(timeouts) + timeout_qc = leader.latest_event + for node in nodes.values(): + node.received_timeout_qc(timeout_qc) + + # new view votes from leafs + for node in (nodes[int_to_id(_id)] for _id in (2, 3, 4)): + node.approve_new_view(timeout_qc, set()) + + new_views_leafs_3_4 = [nodes[int_to_id(_id)].latest_event for _id in (3, 4)] + new_view_leaf_2 = nodes[int_to_id(2)].latest_event + + # new view votes from committee 1 () + node_1: MockCarnot = nodes[int_to_id(1)] + node_1.approve_new_view(timeout_qc, new_views_leafs_3_4) + new_view_1 = node_1.latest_event + + # committee 1 and committee 2 new view votes + new_views = [new_view_1, new_view_leaf_2] + + # forward root childs votes to root committee (compound of just the leader in this case) + leader.approve_new_view(timeout_qc, new_views) + root_new_view = leader.latest_event + + leader.propose_block(view+1, [root_new_view, new_view_1, new_view_leaf_2]) + + # Add final assertions on nodes + proposed_block = leader.latest_event + self.assertEqual(proposed_block.view, view + 1) + self.assertEqual(proposed_block.qc.view, view) + self.assertEqual(proposed_block.qc.high_qc().view, 0) + self.assertEqual(leader.last_timeout_view_qc.view, view) + self.assertEqual(leader.local_high_qc.view, 0) + self.assertEqual(leader.highest_voted_view, view) + for node in nodes.values(): + node.receive_block(proposed_block) for node in nodes.values(): - node.received_timeout_qc(timeout_qc) - - # new view votes from leafs - for node in (nodes[int_to_id(_id)] for _id in (2, 3, 4)): - node.approve_new_view(timeout_qc, set()) - - new_views_leafs_3_4 = [nodes[int_to_id(_id)].latest_event for _id in (3, 4)] - new_view_leaf_2 = nodes[int_to_id(2)].latest_event - - # new view votes from committee 1 () - node_1: MockCarnot = nodes[int_to_id(1)] - node_1.approve_new_view(timeout_qc, new_views_leafs_3_4) - new_view_1 = node_1.latest_event - - # committee 1 and committee 2 new view votes - new_views = [new_view_1, new_view_leaf_2] - - # forward root childs votes to root committee (compound of just the leader in this case) - leader.approve_new_view(timeout_qc, new_views) - root_new_view = leader.latest_event - - leader.propose_block(2, [root_new_view, new_view_1, new_view_leaf_2]) - - # Add final assertions on nodes - new_block_1 = leader.latest_event - self.assertEqual(new_block_1.view, 2) - self.assertEqual(new_block_1.qc.view, 1) - self.assertEqual(new_block_1.qc.high_qc().view, 0) - self.assertEqual(leader.last_timeout_view_qc.view, 1) - self.assertEqual(leader.local_high_qc.view, 0) - self.assertEqual(leader.highest_voted_view, 1) + self.assertEqual(node.latest_committed_view, 0)