#!/usr/bin/env python
#
# Post-process the output of test-dumpevents and check it for correctness.
#

import math
import re
import sys

text = sys.stdin.readlines()

try:
    expect_inserted_pos = text.index("Inserted:\n")
    expect_active_pos = text.index("Active:\n")
    got_inserted_pos = text.index("Inserted events:\n")
    got_active_pos = text.index("Active events:\n")
except ValueError:
    sys.stderr.write("Missing expected dividing line in dumpevents output")
    sys.exit(1)

if not (expect_inserted_pos < expect_active_pos <
        got_inserted_pos < got_active_pos):
    sys.stderr.write("Sections out of order in dumpevents output")
    sys.exit(1)

now,T= text[1].split()
T = float(T)

want_inserted = set(text[expect_inserted_pos+1:expect_active_pos])
want_active = set(text[expect_active_pos+1:got_inserted_pos-1])
got_inserted = set(text[got_inserted_pos+1:got_active_pos])
got_active = set(text[got_active_pos+1:])

pat = re.compile(r'Timeout=([0-9\.]+)')
def replace_time(m):
    t = float(m.group(1))
    if .9 < abs(t-T) < 1.1:
        return "Timeout=T+1"
    elif 2.4 < abs(t-T) < 2.6:
        return "Timeout=T+2.5"
    else:
        return m.group(0)

cleaned_inserted = set( pat.sub(replace_time, s) for s in got_inserted
                        if "Internal" not in s)

if cleaned_inserted != want_inserted:
    sys.stderr.write("Inserted event lists were not as expected!")
    sys.exit(1)

if set(got_active) != set(want_active):
    sys.stderr.write("Active event lists were not as expected!")
    sys.exit(1)

