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 | ||
