Skip to content

Commit f68d274

Browse files
authored
Merge pull request #1333 from skhoroshavin/improve_sim_tests
INDY-2223: Improve simulation tests
2 parents 018526a + 19ff211 commit f68d274

File tree

10 files changed

+36
-17
lines changed

10 files changed

+36
-17
lines changed

plenum/common/messages/internal_messages.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
('stash_data', Optional[tuple])])
4040

4141
# by default view_no for StartViewChange is None meaning that we move to the next view
42-
NeedViewChange = NamedTuple('StartViewChange',
42+
NeedViewChange = NamedTuple('NeedViewChange',
4343
[('view_no', int)])
4444
NeedViewChange.__new__.__defaults__ = (None,) * len(NeedViewChange._fields)
4545

plenum/server/consensus/ordering_service.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def __init__(self,
7474
self._network = network
7575
self._write_manager = write_manager
7676
self._name = self._data.name
77+
# TODO: We shouldn't use get_utc_epoch here, time needs to be under full control through TimerService
7778
self.get_time_for_3pc_batch = get_time_for_3pc_batch or get_utc_epoch
7879
# Flag which node set, when it have set new primaries and need to send batch
7980
self.primaries_batch_needed = False

plenum/server/consensus/view_change_service.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ def view_change_votes(self):
5757
return self._data.view_change_votes
5858

5959
def process_need_view_change(self, msg: NeedViewChange):
60+
self._logger.info("{} processing {}".format(self, msg))
61+
6062
# 1. calculate new viewno
6163
view_no = msg.view_no
6264
if view_no is None:
@@ -77,6 +79,7 @@ def process_need_view_change(self, msg: NeedViewChange):
7779
vc = self._build_view_change_msg()
7880

7981
# 5. Send ViewChangeStarted via internal bus to update other services
82+
self._logger.info("{} sending {}".format(self, vc))
8083
self._bus.send(ViewChangeStarted(view_no=self._data.view_no))
8184

8285
# 6. Send ViewChange msg to other nodes (via external bus)
@@ -128,6 +131,8 @@ def _build_view_change_msg(self):
128131
)
129132

130133
def process_view_change_message(self, msg: ViewChange, frm: str):
134+
self._logger.info("{} processing {} from {}".format(self, msg, frm))
135+
131136
result = self._validate(msg, frm)
132137
if result != PROCESS:
133138
return result, None
@@ -144,12 +149,15 @@ def process_view_change_message(self, msg: ViewChange, frm: str):
144149
digest=view_change_digest(msg)
145150
)
146151
primary_node_name = getNodeName(self._data.primary_name)
152+
self._logger.info("{} sending {}".format(self, vca))
147153
self._network.send(vca, [primary_node_name])
148154

149155
self._finish_view_change_if_needed()
150156
return PROCESS, None
151157

152158
def process_view_change_ack_message(self, msg: ViewChangeAck, frm: str):
159+
self._logger.info("{} processing {} from {}".format(self, msg, frm))
160+
153161
result = self._validate(msg, frm)
154162
if result != PROCESS:
155163
return result, None
@@ -162,6 +170,8 @@ def process_view_change_ack_message(self, msg: ViewChangeAck, frm: str):
162170
return PROCESS, None
163171

164172
def process_new_view_message(self, msg: NewView, frm: str):
173+
self._logger.info("{} processing {} from {}".format(self, msg, frm))
174+
165175
result = self._validate(msg, frm)
166176
if result != PROCESS:
167177
return result, None
@@ -181,6 +191,8 @@ def process_new_view_message(self, msg: NewView, frm: str):
181191
return PROCESS, None
182192

183193
def process_new_view_accepted(self, msg: NewViewAccepted):
194+
self._logger.info("{} processing {}".format(self, msg))
195+
184196
self._data.prev_view_prepare_cert = msg.batches[-1].pp_seq_no if msg.batches else None
185197

186198
def _validate(self, msg: Union[ViewChange, ViewChangeAck, NewView], frm: str) -> int:
@@ -217,6 +229,7 @@ def _send_new_view_if_needed(self):
217229
checkpoint=cp,
218230
batches=batches
219231
)
232+
self._logger.info("{} sending {}".format(self, nv))
220233
self._network.send(nv)
221234
self._new_view = nv
222235
self._finish_view_change()

plenum/test/consensus/order_service/sim_helper.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def setup_pool(random, req_count):
4141
pool = create_pool(random)
4242

4343
for node in pool.nodes:
44+
# TODO: This propagates to global config and sometimes breaks other tests
4445
node._orderer._config.Max3PCBatchSize = MAX_BATCH_SIZE
4546
node._orderer._config.CHK_FREQ = 5
4647
node._orderer._config.LOG_SIZE = 3 * node._orderer._config.CHK_FREQ

plenum/test/consensus/order_service/test_sim_order_during_view_change.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ def test_view_change_while_ordering_with_real_msgs(seed):
3030
partial(node._view_changer.process_need_view_change, NeedViewChange(view_no=1)))
3131
# 3. Make sure that view_change is completed
3232
for node in pool.nodes:
33-
pool.timer.wait_for(lambda: node._view_changer._data.view_no == 1, timeout=20000)
33+
pool.timer.wait_for(lambda: node._view_changer._data.view_no == 1)
3434

3535
# 3. Make sure all nodes ordered all the requests
3636
for node in pool.nodes:
37-
pool.timer.wait_for(partial(check_batch_count, node, batches_count), timeout=20000)
37+
pool.timer.wait_for(partial(check_batch_count, node, batches_count))
3838

3939
# 4. Check data consistency
4040
check_consistency(pool)

plenum/test/consensus/view_change/helper.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def some_checkpoint(random: SimRandom, view_no: int, pp_seq_no: int) -> Checkpoi
1919
def some_pool(random: SimRandom) -> (SimPool, List):
2020
pool_size = random.integer(4, 8)
2121
pool = SimPool(pool_size, random)
22+
log_size = pool.nodes[0].config.LOG_SIZE
2223

2324
# Create simulated history
2425
# TODO: Move into helper?
@@ -41,8 +42,9 @@ def some_pool(random: SimRandom) -> (SimPool, List):
4142

4243
# Initialize consensus data
4344
for i, node in enumerate(pool.nodes):
44-
node._data.preprepared = batches[:pp_count[i]]
45-
node._data.prepared = batches[:p_count[i]]
45+
high_watermark = stable_cp[i] + log_size
46+
node._data.preprepared = batches[:min(high_watermark, pp_count[i])]
47+
node._data.prepared = batches[:min(high_watermark, p_count[i])]
4648
node._data.checkpoints.update(checkpoints[:cp_count[i]])
4749
node._data.stable_checkpoint = stable_cp[i]
4850

plenum/test/consensus/view_change/test_sim_view_change.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ def check_view_change_completes_under_normal_conditions(random: SimRandom):
2121
# Make sure all nodes complete view change
2222
pool.timer.wait_for(lambda: all(not node._data.waiting_for_new_view
2323
and node._data.view_no > 0
24-
for node in pool.nodes),
25-
timeout=5 * 30 * 1000) # 5 NEW_VIEW_TIMEOUT intervals
24+
for node in pool.nodes))
2625

2726
# Make sure all nodes end up in same state
2827
for node_a, node_b in zip(pool.nodes, pool.nodes[1:]):
@@ -58,9 +57,7 @@ def calc_committed(view_changes):
5857
return committed
5958

6059

61-
# Increased count from 200 to 150 because of jenkin's failures.
62-
# After integration, need to get it back
63-
@pytest.mark.parametrize("seed", range(150))
60+
@pytest.mark.parametrize("seed", range(200))
6461
def test_view_change_completes_under_normal_conditions(seed):
6562
random = DefaultSimRandom(seed)
6663
check_view_change_completes_under_normal_conditions(random)

plenum/test/helper.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,19 +1402,24 @@ def run_for(self, seconds):
14021402
"""
14031403
self.advance_until(self._ts.value + seconds)
14041404

1405-
def wait_for(self, condition: Callable[[], bool], timeout: Optional = None):
1405+
def wait_for(self, condition: Callable[[], bool], timeout: Optional = None, max_iterations: int = 500000):
14061406
"""
14071407
Advance time in steps until condition is reached, running scheduled callbacks in process
14081408
Throws TimeoutError if fail to reach condition (under required timeout if defined)
14091409
"""
1410+
counter = 0
14101411
deadline = self._ts.value + timeout if timeout else None
1411-
while self._events and not condition():
1412+
while self._events and not condition() and counter < max_iterations:
14121413
if deadline and self._next_timestamp() > deadline:
1413-
raise TimeoutError("Failed to reach condition in required time")
1414+
raise TimeoutError("Failed to reach condition in required time, {} iterations passed".format(counter))
14141415
self.advance()
1416+
counter += 1
14151417

14161418
if not condition():
1417-
raise TimeoutError("Condition will be never reached")
1419+
if not self._events:
1420+
raise TimeoutError("Condition will be never reached, {} iterations passed".format(counter))
1421+
else:
1422+
raise TimeoutError("Failed to reach condition in {} iterations".format(max_iterations))
14181423

14191424
def run_to_completion(self):
14201425
"""

plenum/test/simulation/sim_network.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def _send_message(self, frm: str, msg: Any, dst: ExternalBus.Destination):
6262
else:
6363
assert False, "{} tried to send message {} to unsupported destination {}".format(frm, msg, dst)
6464

65-
for name in dst:
65+
for name in sorted(dst):
6666
assert name != frm, "{} tried to send message {} to itself".format(frm, msg)
6767

6868
peer = self._peers.get(name)

plenum/test/simulation/test_sim_network.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,10 @@ def test_sim_network_respects_latencies(random, test_nodes, mock_timer, initial_
159159
assert all(min_ts <= ts <= max_ts for ts in node.receive_timestamps)
160160

161161

162-
def test_sim_network_broadcast_preserves_order(mock_timer, sim_network, test_nodes, some_node):
162+
def test_sim_network_broadcast_in_lexicographic_order(mock_timer, sim_network, test_nodes, some_node):
163163
latency = 10
164164
sim_network.set_latency(latency, latency)
165-
should_receive = [node for node in test_nodes if node != some_node]
165+
should_receive = sorted([node for node in test_nodes if node != some_node], key=lambda n: n.name)
166166

167167
message = create_some_message()
168168
some_node.network.send(message)

0 commit comments

Comments
 (0)