blob: b18b4f41481b6dcdcac6b5a522d601863669b759 [file] [log] [blame]
Daniel Berlin57196db2017-02-28 02:19:11 +00001#!/usr/bin/env python
2# This script is used to bisect skip and count arguments for --debug-counter.
3# It is similar to bisect, except it understands how to increase skip and decrease count
4import os
5import sys
6import argparse
7# This is for timeout support. Use the recommended way of import.
8# We do timeouts because when doing, execution testing, we have a habit
9# of finding variants that infinite loop
10if os.name == 'posix' and sys.version_info[0] < 3:
11 import subprocess32 as subprocess
12else:
13 import subprocess
14parser = argparse.ArgumentParser()
15
16parser.add_argument('--skipstart', type=int, default=0)
17parser.add_argument('--skipend', type=int, default=(1 << 32))
18parser.add_argument('--countstart', type=int, default=0)
19parser.add_argument('--countend', type=int, default=(1 << 32))
20parser.add_argument('--timeout', type=int, default=None)
21# Use shell support if you need to use complex shell expressions in your command
22parser.add_argument('--shell', type=bool, default=False)
23parser.add_argument('command', nargs='+')
24
25args = parser.parse_args()
26
27start = args.skipstart
28end = args.skipend
29
30print("Bisect of Skip starting!")
31print("Start: %d" % start)
32print("End: %d" % end)
33
34last = None
35while start != end and start != end-1:
36 count = start + (end - start)/2
37 print("Visiting Skip: %d with (Start, End) = (%d,%d)" % (count, start, end))
38 cmd = [x % {'skip':count, 'count':-1} for x in args.command]
39 print cmd
40 try:
41 result = subprocess.call(cmd, shell=args.shell, timeout=args.timeout)
42 if result == 0:
43 print(" PASSES! Setting end to count")
44 end = count
45 else:
46 print(" FAILS! Setting start to count")
47 start = count
48 except:
49 print(" TIMEOUT, setting end to count")
50 end = count
51firstcount = start
52print("Last good skip: %d" % start)
53start = args.countstart
54end = args.countend
55print("Bisect of Count starting!")
56print("Start: %d" % start)
57print("End: %d" % end)
58while start != end and start != end-1:
59 count = start + (end - start)/2
60 print("Visiting Count: %d with (Start, End) = (%d,%d)" % (count, start, end))
61 cmd = [x % {'count':count, 'skip':firstcount } for x in args.command]
62 print cmd
63 try:
Daniel Berlin392da4b2017-03-04 03:23:41 +000064 result = subprocess.call(cmd, shell=args.shell, timeout=args.timeout)
Daniel Berlin57196db2017-02-28 02:19:11 +000065 if result == 0:
66 print(" PASSES! Setting start to count")
67 start = count
68 else:
69 print(" FAILS! Setting end to count")
70 end = count
71 except:
72 print(" TIMEOUT, setting start to count")
73 start = count
74
75print("Last good count: %d" % start)