diff options
author | Mac Mollison <mollison@cs.unc.edu> | 2010-02-11 20:34:37 -0500 |
---|---|---|
committer | Mac Mollison <mollison@cs.unc.edu> | 2010-02-11 20:34:37 -0500 |
commit | f249e3bd52f35f1cfe8a75868c7e4f791a7a8367 (patch) | |
tree | e6527f50e8096f35d4077e912a9be1b3bb80fd0b | |
parent | c8eacbf0dce8e2cc1acf6bfb0232302bba592e34 (diff) |
Update runtests.py
- Terminate fatally in trace_reader if out-of-order records produced.
Thus, we no longer need this unit test.
- Fix another unit test which had broken.
-rwxr-xr-x | runtests.py | 26 | ||||
-rw-r--r-- | trace_reader.py | 13 |
2 files changed, 22 insertions, 17 deletions
diff --git a/runtests.py b/runtests.py index 1ae29f4..c235e2e 100755 --- a/runtests.py +++ b/runtests.py | |||
@@ -20,36 +20,28 @@ import os | |||
20 | ############################################################################### | 20 | ############################################################################### |
21 | 21 | ||
22 | files = [ | 22 | files = [ |
23 | './sample_traces/st-g4-0.bin', | 23 | './sample_traces/st-g6-0.bin', |
24 | './sample_traces/st-g4-1.bin', | 24 | './sample_traces/st-g6-1.bin', |
25 | './sample_traces/st-g4-2.bin', | 25 | './sample_traces/st-g6-2.bin', |
26 | './sample_traces/st-g4-3.bin', | 26 | './sample_traces/st-g6-3.bin', |
27 | ] | 27 | ] |
28 | 28 | ||
29 | ############################################################################### | 29 | ############################################################################### |
30 | # Tests | 30 | # Tests |
31 | ############################################################################### | 31 | ############################################################################### |
32 | 32 | ||
33 | # Does the trace reader sort files by time correctly? | ||
34 | def test1(): | ||
35 | stream = trace_reader.trace_reader(files) | ||
36 | last_time = 0 | ||
37 | for item in stream: | ||
38 | if last_time > item.when: | ||
39 | return "[FAIL]" | ||
40 | last_time = item.when | ||
41 | return "[SUCCESS]" | ||
42 | |||
43 | # Does our fancy trace reader get the same number of files as our naive one? | 33 | # Does our fancy trace reader get the same number of files as our naive one? |
44 | # (See naive_trace_reader.py for further explanation) | 34 | # (See naive_trace_reader.py for further explanation) |
45 | def test2(): | 35 | def test1(): |
46 | stream = trace_reader.trace_reader(files) | 36 | stream = trace_reader.trace_reader(files) |
47 | num_records = len(list(stream)) | 37 | num_records = len(list(stream)) |
48 | stream = naive_trace_reader.trace_reader(files) | 38 | stream = naive_trace_reader.trace_reader(files) |
49 | naive_num_records = len(list(stream)) | 39 | naive_num_records = len(list(stream)) |
50 | if num_records != naive_num_records: | 40 | |
41 | # We need a +1 here because the fancy reader produces a 'meta' record | ||
42 | # indicating the number of CPUs | ||
43 | if num_records != naive_num_records + 1: | ||
51 | return "[FAIL]" | 44 | return "[FAIL]" |
52 | return "[SUCCESS]" | 45 | return "[SUCCESS]" |
53 | 46 | ||
54 | print("Test 1: {}".format(test1())) | 47 | print("Test 1: {}".format(test1())) |
55 | print("Test 2: {}".format(test2())) | ||
diff --git a/trace_reader.py b/trace_reader.py index 2e5f65d..e18547e 100644 --- a/trace_reader.py +++ b/trace_reader.py | |||
@@ -53,12 +53,19 @@ def trace_reader(files): | |||
53 | 53 | ||
54 | # We keep 100 records in each buffer and then keep the buffer sorted | 54 | # We keep 100 records in each buffer and then keep the buffer sorted |
55 | # This is because records may have been recorded slightly out of order | 55 | # This is because records may have been recorded slightly out of order |
56 | # This cannot guarantee records are produced in order, but it makes it | ||
57 | # overwhelmingly probably. | ||
56 | for x in range(0,len(file_iter_buff)): | 58 | for x in range(0,len(file_iter_buff)): |
57 | for y in range(0,100): | 59 | for y in range(0,100): |
58 | file_iter_buff[x].append(next(file_iters[x])) | 60 | file_iter_buff[x].append(next(file_iters[x])) |
59 | for x in range(0,len(file_iter_buff)): | 61 | for x in range(0,len(file_iter_buff)): |
60 | file_iter_buff[x] = sorted(file_iter_buff[x],key=lambda rec: rec.when) | 62 | file_iter_buff[x] = sorted(file_iter_buff[x],key=lambda rec: rec.when) |
61 | 63 | ||
64 | # Remember the time of the last record. This way, we can make sure records | ||
65 | # truly are produced in monotonically increasing order by time and terminate | ||
66 | # fatally if they are not. | ||
67 | last_time = None | ||
68 | |||
62 | # Keep pulling records as long as we have a buffer | 69 | # Keep pulling records as long as we have a buffer |
63 | while len(file_iter_buff) > 0: | 70 | while len(file_iter_buff) > 0: |
64 | 71 | ||
@@ -87,6 +94,12 @@ def trace_reader(files): | |||
87 | del file_iter_buff[buff_to_refill] | 94 | del file_iter_buff[buff_to_refill] |
88 | del file_iters[buff_to_refill] | 95 | del file_iters[buff_to_refill] |
89 | 96 | ||
97 | # Check for monotonically increasing time | ||
98 | if last_time is not None and earliest.when < last_time: | ||
99 | exit("FATAL ERROR: trace_reader.py: out-of-order record produced") | ||
100 | else: | ||
101 | last_time = earliest.when | ||
102 | |||
90 | # Yield the record | 103 | # Yield the record |
91 | yield earliest | 104 | yield earliest |
92 | 105 | ||