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