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