Source code for msgtransfer2.imp_0.checker
# sesf module: msgtransfer2.imp_0.checker
import argparse
[docs]class Checker():
"""
Maintain the global state of a distributed system of msgtransfer.imp0
nodes and check some assertions. Created by msgtransfer2.servicetester
when testing the distributed system. Maintains the following variables:
- tester: the tester object that started this checker object
- sent: sent state maintained by tester (actually tester.service) object
- rcvd_counts: list of two integers initially both 0.
rcvd_counts[j] is number of packets received at node j, for j in 0..1.
Has a function ``handle_event(e)`` that takes an event ``e`` reported
by a node, updates the global state, and checks whether an assertion
still holds.
- RPC-called by an node to report an event ``e`` at the node.
``e`` is a ``('checker','rcvd',j,msg)`` tuple, indicating the arrival
at node j of packet whose data is ``msg`` serialized.
- Assertion checked:
for every event ('checker', 'rcvd', j, msg):
sent[1-j][rcvd_counts[j]] == msg
"""
def __init__(self, servicetester, argv):
self.servicetester = servicetester
parser = argparse.ArgumentParser()
parser.add_argument("num_nodes", type=int, help="number of nodes")
args = parser.parse_args(argv[1:])
self.num_nodes = args.num_nodes
self.sent = servicetester.serviceparts.sent
self.rcvd_counts = [0, 0]
def handle_event(self, event):
"""
events: ('checker', ''rcvd', j, msg): msg recvd at node j
"""
# print("handle_event called:", event, flush=True) # DEBUG
# import pdb; pdb.set_trace()
event = event[2:]
# event: (j, msg)
j, msg = event
# check msgtransfer2.imp_0.imp assertion
if self.sent[1-j][self.rcvd_counts[j]] != msg:
print("node", j, "recv event invalid", flush=True)
else:
print("node", j, "recv event valid", flush=True)
self.rcvd_counts[j] += 1
# currently nothing to check for 'linkup' and 'linkdown' events
###### END class Checker of module msgtransfer2.imp_0.checker ############