test.py revision 8dd522d2a6b96c79117bdc5d6b58d336846e4346
177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines#!/usr/bin/python2.4
277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines#
377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines# Copyright 2010 Google Inc. All Rights Reserved.
477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines"""RenderScript Compiler Test.
677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
777b5baba8349b0741c36f4c0db86660bc0a96991Stephen HinesRuns subdirectories of tests for the RenderScript compiler.
877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines"""
977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
1077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesimport filecmp
1177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesimport glob
1277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesimport os
1377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesimport shutil
1477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesimport subprocess
1577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesimport sys
1677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
1777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines__author__ = 'Android'
1877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
1977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
2077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesclass Options(object):
2177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  def __init__(self):
2288bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines    return
2377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  verbose = 0
2488bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines  cleanup = 1
2577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
2677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
2777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesdef CompareFiles(filename):
2877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  actual = filename
2977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  expect = filename + '.expect'
3077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  return filecmp.cmp(actual, expect, False)
3177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
3277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
3377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesdef ExecTest(dirname):
3477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  """Executes an llvm-rs-cc test from dirname."""
3577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  passed = True
3677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
3777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  if Options.verbose != 0:
3877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    print 'Testing %s' % dirname
3977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
4077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  os.chdir(dirname)
4177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  stdout_file = open('stdout.txt', 'w')
4277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  stderr_file = open('stderr.txt', 'w')
4377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
4477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  cmd_string = ('../../../../../out/host/linux-x86/bin/llvm-rs-cc '
4577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines                '-o tmp/ -p tmp/ '
4677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines                '-I ../../../../../frameworks/base/libs/rs/scriptc/')
4777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  base_args = cmd_string.split()
4877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  rs_files = glob.glob('*.rs')
498dd522d2a6b96c79117bdc5d6b58d336846e4346Stephen Hines  rs_files.sort()
5077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  args = base_args + rs_files
5177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
52e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines  if Options.verbose > 1:
53e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    print 'Executing:',
54e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    for arg in args:
55e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines      print arg,
56e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    print
57e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines
5877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  # Execute the command and check the resulting shell return value.
5977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  # All tests that are expected to FAIL have directory names that
6077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  # start with 'F_'. Other tests that are expected to PASS have
6177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  # directory names that start with 'P_'.
6277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  ret = subprocess.call(args, stdout=stdout_file, stderr=stderr_file)
6377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  if dirname[0:2] == 'F_':
6477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    if ret == 0:
6577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      passed = False
6677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      if Options.verbose:
6777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines        print 'Command passed on invalid input'
6877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  elif dirname[0:2] == 'P_':
6977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    if ret != 0:
7077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      passed = False
7177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      if Options.verbose:
7277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines        print 'Command failed on valid input'
7377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  else:
74e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    passed = (ret == 0)
7577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    if Options.verbose:
7677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      print 'Test Directory name should start with an F or a P'
7777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
7877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  stdout_file.flush()
7977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  stderr_file.flush()
8077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  stdout_file.close()
8177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  stderr_file.close()
8277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
8377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  if not CompareFiles('stdout.txt'):
8477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    passed = False
8577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    if Options.verbose:
8677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      print 'stdout is different'
8777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  if not CompareFiles('stderr.txt'):
8877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    passed = False
8977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    if Options.verbose:
9077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      print 'stderr is different'
9177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
9288bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines  if Options.cleanup:
9388bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines    os.remove('stdout.txt')
9488bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines    os.remove('stderr.txt')
9588bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines    shutil.rmtree('tmp/')
9677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
9777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  os.chdir('..')
9877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  return passed
9977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
10077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
10188bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hinesdef Usage():
10288bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines  print ('Usage: %s [OPTION]... [TESTNAME]...'
10388bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines         'RenderScript Compiler Test Harness\n'
10488bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines         'Runs TESTNAMEs (all tests by default)\n'
10588bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines         'Available Options:\n'
10688bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines         '  -h, --help          Help message\n'
10788bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines         '  -n, --no-cleanup    Don\'t clean up after running tests\n'
10888bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines         '  -v, --verbose       Verbose output\n'
10988bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines        ) % (sys.argv[0]),
11088bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines  return
11188bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines
11288bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines
11377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesdef main():
11477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  passed = 0
11577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  failed = 0
11688bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines  files = []
117e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines  failed_tests = []
11877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
11977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  for arg in sys.argv[1:]:
12088bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines    if arg in ('-h', '--help'):
12188bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines      Usage()
12288bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines      return 0
12388bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines    elif arg in ('-n', '--no-cleanup'):
12488bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines      Options.cleanup = 0
12588bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines    elif arg in ('-v', '--verbose'):
126e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines      Options.verbose += 1
12777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    else:
12888bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines      # Test list to run
12988bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines      if os.path.isdir(arg):
13088bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines        files.append(arg)
13188bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines      else:
13288bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines        print >> sys.stderr, 'Invalid test or option: %s' % arg
13388bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines        return 1
13488bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines
13588bb794545936b6915f4ce22fd4404b3cda3bbd7Stephen Hines  if not files:
136e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    tmp_files = os.listdir('.')
137e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    # Only run tests that are known to PASS or FAIL
138e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    # Disabled tests can be marked D_ and invoked explicitly
139e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    for f in tmp_files:
140e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines      if os.path.isdir(f) and (f[0:2] == 'F_' or f[0:2] == 'P_'):
141e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        files.append(f)
14277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
14377b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  for f in files:
14477b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines    if os.path.isdir(f):
14577b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      if ExecTest(f):
14677b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines        passed += 1
14777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines      else:
14877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines        failed += 1
149e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines        failed_tests.append(f)
15077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
15177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  print 'Tests Passed: %d\n' % passed,
15277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  print 'Tests Failed: %d\n' % failed,
153e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines  if failed:
154e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    print 'Failures:',
155e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines    for t in failed_tests:
156e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines      print t,
15777b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
15877b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  return failed != 0
15977b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
16077b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines
16177b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hinesif __name__ == '__main__':
16277b5baba8349b0741c36f4c0db86660bc0a96991Stephen Hines  sys.exit(main())
163