#!/usr/bin/env python3 # -*- coding:utf-8 -*- """llvm-ndk-cc Toolchains Test. """ import filecmp import glob import os import subprocess import sys __author__ = 'Nowar Gu' class Options(object): Verbose = 0 Cleanup = 1 def compareFile(Filename): """Compare Filename and Filename.expect for equality.""" Actual = Filename Expect = Filename + '.expect' if not os.path.isfile(Actual): if Options.Verbose: print('Could not find {0}'.format(Actual)) return False if not os.path.isfile(Expect): if Options.Verbose: print('Could not find {0}'.format(Expect)) return False return filecmp.cmp(Actual, Expect, False) def runFileTest(Filename): """Run test on each file in directory.""" Passed = True if Options.Verbose != 0: print('\nTesting {0}'.format(Filename)) Cmd = ('../../../../../out/host/linux-x86/bin/llvm-ndk-cc' ' -I../../../../platforms/android-100/arch-llvm/usr/include' ' -I{0}'.format(os.path.dirname(os.path.realpath(Filename)))) BaseArgs = Cmd.split() FilenameStubs = Filename.split('.') FileBasename = FilenameStubs[0] Args = BaseArgs Args.append(Filename) Args.append('-o') Args.append(FileBasename + '.bc') StdoutFile = open('{0}.stdout.txt'.format(FileBasename), 'w+') StderrFile = open('{0}.stderr.txt'.format(FileBasename), 'w+') if Options.Verbose > 1: print('Executing:',end=' ') for Arg in Args: print(Arg,end=' ') print() Ret = subprocess.call(Args, stdout=StdoutFile, stderr=StderrFile) StdoutFile.flush() StderrFile.flush() if Options.Verbose > 1: StdoutFile.seek(0) StderrFile.seek(0) for Line in StdoutFile: print('STDOUT> {0}'.format(Line), end='') for Line in StderrFile: print('STDERR> {0}'.format(Line), end='') StdoutFile.close() StderrFile.close() return Ret == 0 def runTest(Dirname): """Run an llvm-ndk-cc test from Dirname.""" Passed = True os.chdir(Dirname) SrcFiles = glob.glob('*.c') SrcFiles.extend(glob.glob('*.cpp')) SrcFiles.sort() FilesPassed = [] ResultPassed = True for File in SrcFiles: FileRunPassed = runFileTest(File) FileBasename = File.split('.')[0] if not compareFile('{0}.stdout.txt'.format(FileBasename)): ResultPassed = False if Options.Verbose: print('stdout is different.') if not compareFile('{0}.stderr.txt'.format(FileBasename)): ResultPassed = False if Options.Verbose: print('stderr is different.') FilesPassed.append(FileRunPassed) Result = True for FilePassed in FilesPassed: Result = Result and FilePassed if Dirname[0:2] == 'F_': if Result == True: Result = False if Options.Verbose: print('Command passed on invalid input.') else: Result = True elif Dirname[0:2] == 'P_': if Result == False: if Options.Verbose: print('Command failed on valid input.') else: if Options.Verbose: print('Test directory name should start with an F or a P.') Cmd = ('../../../../../out/host/linux-x86/bin/llvm-ndk-link') Args = Cmd.split() Args.extend(glob.glob('*.bc')) Args.append('-o') Args.append('AllFilesLinked.bc') if Result == True: Ret = subprocess.call(Args) if Ret != 0: Result = False; if Options.Verbose > 1: print() print('Executing:',end=' ') for Arg in Args: print(Arg,end=' ') print() if Options.Cleanup: for File in glob.glob('*.stdout.txt'): os.remove(File) for File in glob.glob('*.stderr.txt'): os.remove(File) for File in glob.glob('*.bc'): os.remove(File) os.chdir('..') if Dirname[0:2] == 'F_': return not Result and ResultPassed else: return Result and ResultPassed def showUsage(): print('Usage: {0} [Option]... [directory]...'.format(sys.argv[0])) print('llvm-ndk-cc Toolchains Test') print(' -h, --help Help message') print(' -n, --no-cleanup Do not cleanup after testing') print(' -v, --verbose Verbose output') return def main(): Passed = 0 Failed = 0 Files = [] FailedTests = [] for Arg in sys.argv[1:]: if Arg in ['-h', '--help']: showUsage() return 0 elif Arg in ['-n', '--no-cleanup']: Options.Cleanup = 0 elif Arg in ['-v', '--verbose']: Options.Verbose += 1 else: if os.path.isdir(Arg): Files.append(Arg) else: print('Invalid test or options: {0}'.format(Arg), file=sys.stderr) return 1 if not Files: TmpFiles = os.listdir('.') for File in TmpFiles: if os.path.isdir(File) and (File[0:2] == 'F_' or File[0:2] == 'P_'): Files.append(File) for Dir in Files: if os.path.isdir(Dir): if runTest(Dir): Passed += 1 else: Failed += 1 FailedTests.append(Dir) print() print('Tests Passed: {0}'.format(Passed)) print('Tests Failed: {0}'.format(Failed)) if Failed: print('Failures:', end=' ') for Test in FailedTests: print(Test, end=' ') print() return Failed != 0 if __name__ == '__main__': sys.exit(main())