1#!/usr/bin/env python3 2# -*- coding:utf-8 -*- 3"""llvm-ndk-cc Toolchains Test. 4""" 5 6import filecmp 7import glob 8import os 9import subprocess 10import sys 11 12__author__ = 'Nowar Gu' 13 14class Options(object): 15 Verbose = 0 16 Cleanup = 1 17 18def compareFile(Filename): 19 """Compare Filename and Filename.expect for equality.""" 20 Actual = Filename 21 Expect = Filename + '.expect' 22 23 if not os.path.isfile(Actual): 24 if Options.Verbose: 25 print('Could not find {0}'.format(Actual)) 26 return False 27 if not os.path.isfile(Expect): 28 if Options.Verbose: 29 print('Could not find {0}'.format(Expect)) 30 return False 31 32 return filecmp.cmp(Actual, Expect, False) 33 34 35def runFileTest(Filename): 36 """Run test on each file in directory.""" 37 Passed = True 38 39 if Options.Verbose != 0: 40 print('\nTesting {0}'.format(Filename)) 41 42 Cmd = ('../../../../../out/host/linux-x86/bin/llvm-ndk-cc' 43 ' -I../../../../platforms/android-100/arch-llvm/usr/include' 44 ' -I{0}'.format(os.path.dirname(os.path.realpath(Filename)))) 45 46 BaseArgs = Cmd.split() 47 FilenameStubs = Filename.split('.') 48 FileBasename = FilenameStubs[0] 49 Args = BaseArgs 50 Args.append(Filename) 51 Args.append('-o') 52 Args.append(FileBasename + '.bc') 53 54 StdoutFile = open('{0}.stdout.txt'.format(FileBasename), 'w+') 55 StderrFile = open('{0}.stderr.txt'.format(FileBasename), 'w+') 56 57 if Options.Verbose > 1: 58 print('Executing:',end=' ') 59 for Arg in Args: 60 print(Arg,end=' ') 61 print() 62 Ret = subprocess.call(Args, stdout=StdoutFile, stderr=StderrFile) 63 StdoutFile.flush() 64 StderrFile.flush() 65 if Options.Verbose > 1: 66 StdoutFile.seek(0) 67 StderrFile.seek(0) 68 for Line in StdoutFile: 69 print('STDOUT> {0}'.format(Line), end='') 70 for Line in StderrFile: 71 print('STDERR> {0}'.format(Line), end='') 72 73 StdoutFile.close() 74 StderrFile.close() 75 return Ret == 0 76 77 78def runTest(Dirname): 79 """Run an llvm-ndk-cc test from Dirname.""" 80 Passed = True 81 os.chdir(Dirname) 82 83 SrcFiles = glob.glob('*.c') 84 SrcFiles.extend(glob.glob('*.cpp')) 85 SrcFiles.sort() 86 FilesPassed = [] 87 ResultPassed = True 88 for File in SrcFiles: 89 FileRunPassed = runFileTest(File) 90 FileBasename = File.split('.')[0] 91 if not compareFile('{0}.stdout.txt'.format(FileBasename)): 92 ResultPassed = False 93 if Options.Verbose: 94 print('stdout is different.') 95 if not compareFile('{0}.stderr.txt'.format(FileBasename)): 96 ResultPassed = False 97 if Options.Verbose: 98 print('stderr is different.') 99 FilesPassed.append(FileRunPassed) 100 101 Result = True 102 for FilePassed in FilesPassed: 103 Result = Result and FilePassed 104 105 if Dirname[0:2] == 'F_': 106 if Result == True: 107 Result = False 108 if Options.Verbose: 109 print('Command passed on invalid input.') 110 else: 111 Result = True 112 elif Dirname[0:2] == 'P_': 113 if Result == False: 114 if Options.Verbose: 115 print('Command failed on valid input.') 116 else: 117 if Options.Verbose: 118 print('Test directory name should start with an F or a P.') 119 120 Cmd = ('../../../../../out/host/linux-x86/bin/llvm-ndk-link') 121 Args = Cmd.split() 122 Args.extend(glob.glob('*.bc')) 123 Args.append('-o') 124 Args.append('AllFilesLinked.bc') 125 if Result == True: 126 Ret = subprocess.call(Args) 127 if Ret != 0: 128 Result = False; 129 130 if Options.Verbose > 1: 131 print() 132 print('Executing:',end=' ') 133 for Arg in Args: 134 print(Arg,end=' ') 135 print() 136 137 138 if Options.Cleanup: 139 for File in glob.glob('*.stdout.txt'): 140 os.remove(File) 141 for File in glob.glob('*.stderr.txt'): 142 os.remove(File) 143 for File in glob.glob('*.bc'): 144 os.remove(File) 145 146 os.chdir('..') 147 if Dirname[0:2] == 'F_': 148 return not Result and ResultPassed 149 else: 150 return Result and ResultPassed 151 152 153def showUsage(): 154 print('Usage: {0} [Option]... [directory]...'.format(sys.argv[0])) 155 print('llvm-ndk-cc Toolchains Test') 156 print(' -h, --help Help message') 157 print(' -n, --no-cleanup Do not cleanup after testing') 158 print(' -v, --verbose Verbose output') 159 return 160 161 162def main(): 163 Passed = 0 164 Failed = 0 165 Files = [] 166 FailedTests = [] 167 168 for Arg in sys.argv[1:]: 169 if Arg in ['-h', '--help']: 170 showUsage() 171 return 0 172 elif Arg in ['-n', '--no-cleanup']: 173 Options.Cleanup = 0 174 elif Arg in ['-v', '--verbose']: 175 Options.Verbose += 1 176 else: 177 if os.path.isdir(Arg): 178 Files.append(Arg) 179 else: 180 print('Invalid test or options: {0}'.format(Arg), file=sys.stderr) 181 return 1 182 183 if not Files: 184 TmpFiles = os.listdir('.') 185 for File in TmpFiles: 186 if os.path.isdir(File) and (File[0:2] == 'F_' or File[0:2] == 'P_'): 187 Files.append(File) 188 189 for Dir in Files: 190 if os.path.isdir(Dir): 191 if runTest(Dir): 192 Passed += 1 193 else: 194 Failed += 1 195 FailedTests.append(Dir) 196 197 print() 198 print('Tests Passed: {0}'.format(Passed)) 199 print('Tests Failed: {0}'.format(Failed)) 200 if Failed: 201 print('Failures:', end=' ') 202 for Test in FailedTests: 203 print(Test, end=' ') 204 print() 205 206 return Failed != 0 207 208 209if __name__ == '__main__': 210 sys.exit(main()) 211