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
|
#!/usr/bin/python
# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import optparse
import re
import subprocess
import sys
import time
def Main(argv):
parser = optparse.OptionParser()
parser.add_option('-s', '--time_slop', dest='time_slop', default=1.0,
help=('how far outside of starting / ending time' +
' (as measured by python) can the output be'))
# the time slop should be small -- just enough to take care of all
# NTP adjustments.
parser.add_option('-S', '--show_output', dest='show_output',
action='store_true', default=False,
help='show wrapped program\'s output')
parser.add_option('-r', '--output_regex', dest='regex',
default=r'(\d+\.\d*|\d*.\d+) seconds',
help='regular expression for picking out time output')
options, args = parser.parse_args(argv)
fmt = '%15s: %20.6f\n' # label: time_value output format to line things up
fp_num_re = re.compile(options.regex)
time_start = time.time()
sys.stdout.write(fmt % ('Error margin', options.time_slop))
sys.stdout.write(fmt % ('Start time' , time_start))
def OutputPredicate(output_stream):
# consume output_stream looking for output time value
time_output = None
for line in output_stream:
if options.show_output:
sys.stdout.write(line + '\n')
mobj = fp_num_re.search(line)
if time_output is None and mobj is not None:
time_output = float(mobj.group(1))
sys.stdout.write(fmt % ('Output time', time_output))
time_end = time.time()
sys.stdout.write(fmt % ('End time', time_end))
if time_output is None:
sys.stderr.write('time_check: No time output found.\n')
return False
return (time_start - options.time_slop <= time_output and
time_output <= time_end + options.time_slop)
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
ok = OutputPredicate(p.stdout)
p.communicate()
if p.returncode != 0:
sys.stdout.write('Command failed with status %d: %r\n' %
(p.returncode, args))
ok = False
if ok:
sys.stdout.write('OK\n')
sys.exit(0)
else:
sys.stdout.write('FAILED\n')
sys.exit(1)
if __name__ == '__main__':
retval = Main(sys.argv[1:])
sys.stdout.write('\n\n')
sys.exit(retval)
|