native-tests.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #!/usr/bin/env python3
  2. import argparse
  3. import os
  4. import sys
  5. from lib.native_tests import TestsList, Verbosity, DisabledTestsPolicy
  6. class Command:
  7. LIST = 'list'
  8. RUN = 'run'
  9. def parse_args():
  10. parser = argparse.ArgumentParser(description='Run Google Test binaries')
  11. parser.add_argument('command',
  12. choices=[Command.LIST, Command.RUN],
  13. help='command to execute')
  14. parser.add_argument('-b', '--binary', nargs='+', required=False,
  15. help='binaries to run')
  16. parser.add_argument('-c', '--config', required=True,
  17. help='path to a tests config')
  18. parser.add_argument('-t', '--tests-dir', required=False,
  19. help='path to a directory with test binaries')
  20. parser.add_argument('-o', '--output-dir', required=False,
  21. help='path to a folder to save tests results')
  22. disabled_tests = parser.add_mutually_exclusive_group()
  23. disabled_tests.add_argument('--only-disabled-tests',
  24. dest='disabled_tests_policy',
  25. action='store_const',
  26. const=DisabledTestsPolicy.ONLY,
  27. help='run disabled tests only')
  28. disabled_tests.add_argument('--include-disabled-tests',
  29. dest='disabled_tests_policy',
  30. action='store_const',
  31. const=DisabledTestsPolicy.INCLUDE,
  32. help='if disabled tests should be run as well')
  33. parser.set_defaults(disabled_tests_policy=DisabledTestsPolicy.DISABLE)
  34. verbosity = parser.add_mutually_exclusive_group()
  35. verbosity.add_argument('-v', '--verbosity', required=False,
  36. default=Verbosity.CHATTY,
  37. choices=Verbosity.get_all(),
  38. help='set verbosity level')
  39. verbosity.add_argument('-q', '--quiet', required=False, action='store_const',
  40. const=Verbosity.ERRORS, dest='verbosity',
  41. help='suppress stdout from test binaries')
  42. verbosity.add_argument('-qq', '--quiet-quiet',
  43. # https://youtu.be/bXd-zZLV2i0?t=41s
  44. required=False, action='store_const',
  45. const=Verbosity.SILENT, dest='verbosity',
  46. help='suppress stdout and stderr from test binaries')
  47. args = parser.parse_args()
  48. # Additional checks.
  49. if args.command == Command.RUN and args.tests_dir is None:
  50. parser.error("specify a path to a dir with test binaries via --tests-dir")
  51. # Absolutize and check paths.
  52. # 'config' must exist and be a file.
  53. args.config = os.path.abspath(args.config)
  54. if not os.path.isfile(args.config):
  55. parser.error("file '{}' doesn't exist".format(args.config))
  56. # 'tests_dir' must exist and be a directory.
  57. if args.tests_dir is not None:
  58. args.tests_dir = os.path.abspath(args.tests_dir)
  59. if not os.path.isdir(args.tests_dir):
  60. parser.error("directory '{}' doesn't exist".format(args.tests_dir))
  61. # 'output_dir' must exist and be a directory.
  62. if args.output_dir is not None:
  63. args.output_dir = os.path.abspath(args.output_dir)
  64. if not os.path.isdir(args.output_dir):
  65. parser.error("directory '{}' doesn't exist".format(args.output_dir))
  66. return args
  67. def main():
  68. args = parse_args()
  69. tests_list = TestsList(args.config, args.tests_dir)
  70. if args.command == Command.LIST:
  71. all_binaries_names = tests_list.get_for_current_platform()
  72. print('\n'.join(all_binaries_names))
  73. return 0
  74. if args.command == Command.RUN:
  75. if args.binary is not None:
  76. return tests_list.run(args.binary, args.output_dir, args.verbosity,
  77. args.disabled_tests_policy)
  78. return tests_list.run_all(args.output_dir, args.verbosity,
  79. args.disabled_tests_policy)
  80. raise AssertionError("unexpected command '{}'".format(args.command))
  81. if __name__ == '__main__':
  82. sys.exit(main())