-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidate_fifo.py
executable file
·78 lines (58 loc) · 2.04 KB
/
validate_fifo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python3
import argparse
import os, atexit
import textwrap
import signal
import random
import time
from enum import Enum
from collections import defaultdict, OrderedDict
def check_positive(value):
ivalue = int(value)
if ivalue <= 0:
raise argparse.ArgumentTypeError("{} is an invalid positive int value".format(value))
return ivalue
def checkProcess(filePath):
i = 1
nextMessage = defaultdict(lambda : 1)
filename = os.path.basename(filePath)
with open(filePath) as f:
for lineNumber, line in enumerate(f):
tokens = line.split()
# Check broadcast
if tokens[0] == 'b':
msg = int(tokens[1])
if msg != i:
print("File {}, Line {}: Messages broadcast out of order. Expected message {} but broadcast message {}".format(filename, lineNumber, i, msg))
return False
i += 1
# Check delivery
if tokens[0] == 'd':
sender = int(tokens[1])
msg = int(tokens[2])
if msg != nextMessage[sender]:
print("File {}, Line {}: Message delivered out of order. Expected message {}, but delivered message {}".format(filename, lineNumber, nextMessage[sender], msg))
return False
else:
nextMessage[sender] = msg + 1
return True
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--proc_num",
required=True,
type=check_positive,
dest="proc_num",
help="Total number of processes",
)
parser.add_argument('output', nargs='+')
results = parser.parse_args()
if len(results.output) != results.proc_num:
print("Not as many output files as number of processes")
exit(1)
for o in results.output:
print("Checking {}".format(o))
if checkProcess(o):
print("Validation OK")
else:
print("Validation failed!")