134e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee#!/usr/bin/env python2
234e88480eda520540d253fe1662e18d63551c033Manasij Mukherjeeimport argparse
334e88480eda520540d253fe1662e18d63551c033Manasij Mukherjeeimport sys
434e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee
534e88480eda520540d253fe1662e18d63551c033Manasij Mukherjeedef main():
634e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  desc = 'Crash simulator script, useful for testing the bisection tool.\
734e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee          bisection-tool.py --cmd "./pydir/bisection-test.py -c 2x3" \
834e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee          --end 1000 --timeout 60'
934e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  argparser = argparse.ArgumentParser(description=desc)
1034e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  argparser.add_argument('--include', '-i', default=[], dest='include',
1134e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    action='append',
1234e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    help='Include list, single values or ranges')
1334e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  argparser.add_argument('--exclude', '-e', default=[], dest='exclude',
1434e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    action='append',
1534e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    help='Exclude list, single values or ranges')
1634e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  argparser.add_argument('--crash', '-c', default=[], dest='crash',
1734e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    action='append',
1834e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    help='Crash list, single values or x-separated combinations like 2x4')
1934e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee
2034e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  args = argparser.parse_args()
2134e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee
2234e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  included = {-1}
2334e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  for string in args.include:
2434e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    include_range = string.split(':')
2534e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    if len(include_range) == 1:
2634e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      included.add(int(include_range[0]))
2734e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    else:
2834e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      for num in range(int(include_range[0]), int(include_range[1])):
2934e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee        included.add(num)
3034e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee
3134e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  for string in args.exclude:
3234e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    exclude_range = string.split(':')
3334e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    if len(exclude_range) == 1:
3434e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      try:
3534e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee        included.remove(int(exclude_range[0]))
3634e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      except KeyError:
3734e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee        pass # Exclude works without a matching include
3834e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    else:
3934e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      for num in range(int(exclude_range[0]), int(exclude_range[1])):
4034e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee        included.remove(num)
4134e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee
4234e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  for string in args.crash:
4334e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    crash_combination = string.split('x')
4434e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    fail = True
4534e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    for crash in crash_combination:
4634e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      if not int(crash) in included:
4734e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee        fail = False
4834e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee    if fail:
4934e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      print 'Fail'
5034e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee      exit(1)
5134e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  print 'Success'
5234e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  exit(0)
5334e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee
5434e88480eda520540d253fe1662e18d63551c033Manasij Mukherjeeif __name__ == '__main__':
5534e88480eda520540d253fe1662e18d63551c033Manasij Mukherjee  main()
56