#!/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())