142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#!/usr/bin/env python3
242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh# -*- coding:utf-8 -*-
342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh"""llvm-ndk-cc Toolchains Test.
442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh"""
542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
642552ec6168d994991696a04c1626ac91218a720Andrew Hsiehimport filecmp
742552ec6168d994991696a04c1626ac91218a720Andrew Hsiehimport glob
842552ec6168d994991696a04c1626ac91218a720Andrew Hsiehimport os
942552ec6168d994991696a04c1626ac91218a720Andrew Hsiehimport subprocess
1042552ec6168d994991696a04c1626ac91218a720Andrew Hsiehimport sys
1142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
1242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh__author__ = 'Nowar Gu'
1342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
1442552ec6168d994991696a04c1626ac91218a720Andrew Hsiehclass Options(object):
1542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Verbose = 0
1642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Cleanup = 1
1742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
1842552ec6168d994991696a04c1626ac91218a720Andrew Hsiehdef compareFile(Filename):
1942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  """Compare Filename and Filename.expect for equality."""
2042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Actual = Filename
2142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Expect = Filename + '.expect'
2242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
2342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if not os.path.isfile(Actual):
2442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Options.Verbose:
2542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print('Could not find {0}'.format(Actual))
2642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    return False
2742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if not os.path.isfile(Expect):
2842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Options.Verbose:
2942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print('Could not find {0}'.format(Expect))
3042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    return False
3142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
3242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  return filecmp.cmp(Actual, Expect, False)
3342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
3442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
3542552ec6168d994991696a04c1626ac91218a720Andrew Hsiehdef runFileTest(Filename):
3642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  """Run test on each file in directory."""
3742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Passed = True
3842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
3942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Options.Verbose != 0:
4042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    print('\nTesting {0}'.format(Filename))
4142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
4242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Cmd = ('../../../../../out/host/linux-x86/bin/llvm-ndk-cc'
4342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh         ' -I../../../../platforms/android-100/arch-llvm/usr/include'
4442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh         ' -I{0}'.format(os.path.dirname(os.path.realpath(Filename))))
4542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
4642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  BaseArgs = Cmd.split()
4742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  FilenameStubs = Filename.split('.')
4842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  FileBasename = FilenameStubs[0]
4942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args = BaseArgs
5042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args.append(Filename)
5142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args.append('-o')
5242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args.append(FileBasename + '.bc')
5342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
5442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  StdoutFile = open('{0}.stdout.txt'.format(FileBasename), 'w+')
5542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  StderrFile = open('{0}.stderr.txt'.format(FileBasename), 'w+')
5642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
5742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Options.Verbose > 1:
5842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    print('Executing:',end=' ')
5942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for Arg in Args:
6042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print(Arg,end=' ')
6142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    print()
6242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Ret = subprocess.call(Args, stdout=StdoutFile, stderr=StderrFile)
6342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  StdoutFile.flush()
6442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  StderrFile.flush()
6542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Options.Verbose > 1:
6642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    StdoutFile.seek(0)
6742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    StderrFile.seek(0)
6842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for Line in StdoutFile:
6942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print('STDOUT> {0}'.format(Line), end='')
7042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for Line in StderrFile:
7142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print('STDERR> {0}'.format(Line), end='')
7242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
7342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  StdoutFile.close()
7442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  StderrFile.close()
7542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  return Ret == 0
7642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
7742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
7842552ec6168d994991696a04c1626ac91218a720Andrew Hsiehdef runTest(Dirname):
7942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  """Run an llvm-ndk-cc test from Dirname."""
8042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Passed = True
8142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  os.chdir(Dirname)
8242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
8342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  SrcFiles = glob.glob('*.c')
8442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  SrcFiles.extend(glob.glob('*.cpp'))
8542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  SrcFiles.sort()
8642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  FilesPassed = []
8742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  ResultPassed = True
8842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  for File in SrcFiles:
8942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    FileRunPassed = runFileTest(File)
9042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    FileBasename = File.split('.')[0]
9142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if not compareFile('{0}.stdout.txt'.format(FileBasename)):
9242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      ResultPassed = False
9342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      if Options.Verbose:
9442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        print('stdout is different.')
9542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if not compareFile('{0}.stderr.txt'.format(FileBasename)):
9642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      ResultPassed = False
9742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      if Options.Verbose:
9842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        print('stderr is different.')
9942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    FilesPassed.append(FileRunPassed)
10042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
10142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Result = True
10242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  for FilePassed in FilesPassed:
10342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    Result = Result and FilePassed
10442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
10542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Dirname[0:2] == 'F_':
10642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Result == True:
10742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      Result = False
10842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      if Options.Verbose:
10942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        print('Command passed on invalid input.')
11042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    else:
11142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      Result = True
11242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  elif Dirname[0:2] == 'P_':
11342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Result == False:
11442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      if Options.Verbose:
11542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        print('Command failed on valid input.')
11642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  else:
11742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Options.Verbose:
11842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print('Test directory name should start with an F or a P.')
11942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
12042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Cmd = ('../../../../../out/host/linux-x86/bin/llvm-ndk-link')
12142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args = Cmd.split()
12242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args.extend(glob.glob('*.bc'))
12342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args.append('-o')
12442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Args.append('AllFilesLinked.bc')
12542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Result == True:
12642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    Ret = subprocess.call(Args)
12742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Ret != 0:
12842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      Result = False;
12942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
13042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Options.Verbose > 1:
13142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print()
13242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print('Executing:',end=' ')
13342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      for Arg in Args:
13442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        print(Arg,end=' ')
13542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print()
13642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
13742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
13842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Options.Cleanup:
13942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for File in glob.glob('*.stdout.txt'):
14042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      os.remove(File)
14142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for File in glob.glob('*.stderr.txt'):
14242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      os.remove(File)
14342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for File in glob.glob('*.bc'):
14442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      os.remove(File)
14542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
14642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  os.chdir('..')
14742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Dirname[0:2] == 'F_':
14842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      return not Result and ResultPassed
14942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  else:
15042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    return Result and ResultPassed
15142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
15242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
15342552ec6168d994991696a04c1626ac91218a720Andrew Hsiehdef showUsage():
15442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print('Usage: {0} [Option]... [directory]...'.format(sys.argv[0]))
15542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print('llvm-ndk-cc Toolchains Test')
15642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print('  -h, --help       Help message')
15742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print('  -n, --no-cleanup Do not cleanup after testing')
15842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print('  -v, --verbose    Verbose output')
15942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  return
16042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
16142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
16242552ec6168d994991696a04c1626ac91218a720Andrew Hsiehdef main():
16342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Passed = 0
16442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Failed = 0
16542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Files = []
16642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  FailedTests = []
16742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
16842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  for Arg in sys.argv[1:]:
16942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if Arg in ['-h', '--help']:
17042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      showUsage()
17142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      return 0
17242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    elif Arg in ['-n', '--no-cleanup']:
17342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      Options.Cleanup = 0
17442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    elif Arg in ['-v', '--verbose']:
17542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      Options.Verbose += 1
17642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    else:
17742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      if os.path.isdir(Arg):
17842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        Files.append(Arg)
17942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      else:
18042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        print('Invalid test or options: {0}'.format(Arg), file=sys.stderr)
18142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        return 1
18242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
18342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if not Files:
18442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    TmpFiles = os.listdir('.')
18542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for File in TmpFiles:
18642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      if os.path.isdir(File) and (File[0:2] == 'F_' or File[0:2] == 'P_'):
18742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        Files.append(File)
18842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
18942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  for Dir in Files:
19042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    if os.path.isdir(Dir):
19142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      if runTest(Dir):
19242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        Passed += 1
19342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      else:
19442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        Failed += 1
19542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh        FailedTests.append(Dir)
19642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
19742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print()
19842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print('Tests Passed: {0}'.format(Passed))
19942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  print('Tests Failed: {0}'.format(Failed))
20042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  if Failed:
20142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    print('Failures:', end=' ')
20242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    for Test in FailedTests:
20342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh      print(Test, end=' ')
20442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh    print()
20542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
20642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  return Failed != 0
20742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
20842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
20942552ec6168d994991696a04c1626ac91218a720Andrew Hsiehif __name__ == '__main__':
21042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  sys.exit(main())
211