[SyncFS] Build indexes from FileTracker entries on disk.
[chromium-blink-merge.git] / native_client_sdk / src / build_tools / test_sdk.py
blob039d71bd1fb795e89ddd35a71e6cd6ff4ddb5a8e
1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
6 """Script for a testing an existing SDK.
8 This script is normally run immediately after build_sdk.py.
9 """
11 import optparse
12 import os
13 import subprocess
14 import sys
16 import buildbot_common
17 import build_projects
18 import build_sdk
19 import build_version
20 import parse_dsc
22 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
23 SDK_SRC_DIR = os.path.dirname(SCRIPT_DIR)
24 SDK_LIBRARY_DIR = os.path.join(SDK_SRC_DIR, 'libraries')
25 SDK_DIR = os.path.dirname(SDK_SRC_DIR)
26 SRC_DIR = os.path.dirname(SDK_DIR)
27 OUT_DIR = os.path.join(SRC_DIR, 'out')
29 sys.path.append(os.path.join(SDK_SRC_DIR, 'tools'))
30 import getos
32 def StepBuildExamples(pepperdir):
33 for config in ('Debug', 'Release'):
34 build_sdk.BuildStepMakeAll(pepperdir, 'getting_started',
35 'Build Getting Started (%s)' % config,
36 deps=False, config=config)
38 build_sdk.BuildStepMakeAll(pepperdir, 'examples',
39 'Build Examples (%s)' % config,
40 deps=False, config=config)
43 def StepCopyTests(pepperdir, toolchains, build_experimental):
44 buildbot_common.BuildStep('Copy Tests')
46 # Update test libraries and test apps
47 filters = {
48 'DEST': ['tests']
50 if not build_experimental:
51 filters['EXPERIMENTAL'] = False
53 tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, include=filters)
54 build_projects.UpdateHelpers(pepperdir, clobber=False)
55 build_projects.UpdateProjects(pepperdir, tree, clobber=False,
56 toolchains=toolchains)
59 def StepBuildTests(pepperdir):
60 for config in ('Debug', 'Release'):
61 build_sdk.BuildStepMakeAll(pepperdir, 'tests',
62 'Build Tests (%s)' % config,
63 deps=False, config=config)
66 def StepRunSelLdrTests(pepperdir, sanitizer):
67 filters = {
68 'SEL_LDR': True
71 tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, include=filters)
73 def RunTest(test, toolchain, config, arch=None):
74 args = ['STANDALONE=1', 'TOOLCHAIN=%s' % toolchain]
75 if arch is not None:
76 args.append('NACL_ARCH=%s' % arch)
77 deps = False
79 if sanitizer is not None:
80 # For sanitizer builds we pass extra argument for make, and do
81 # full clean build to make sure everything is rebuilt with the
82 # correct flags
83 deps = True
84 if sanitizer == 'valgrind':
85 args += ['RUN_UNDER=valgrind']
86 else:
87 args += ['CC=clang', 'CXX=clang++',
88 'LDFLAGS=-pie -fsanitize=' + sanitizer,
89 'CFLAGS=-fPIC -fsanitize=' + sanitizer]
90 build_projects.BuildProjectsBranch(pepperdir, 'src', clean=False,
91 deps=deps, config=config,
92 args=args + ['clean'])
93 build_projects.BuildProjectsBranch(pepperdir, 'tests', clean=False,
94 deps=deps, config=config,
95 args=args + ['clean'])
97 build_projects.BuildProjectsBranch(pepperdir, test, clean=False,
98 deps=deps, config=config,
99 args=args + ['run'])
101 if getos.GetPlatform() == 'win':
102 # On win32 we only support running on the system
103 # arch
104 archs = (getos.GetSystemArch('win'),)
105 elif getos.GetPlatform() == 'mac':
106 # We only ship 32-bit version of sel_ldr on mac.
107 archs = ('x86_32',)
108 else:
109 # On linux we can run both 32 and 64-bit
110 archs = ('x86_64', 'x86_32')
112 for root, projects in tree.iteritems():
113 for project in projects:
114 if sanitizer:
115 sanitizer_name = '[sanitizer=%s]' % sanitizer
116 else:
117 sanitizer_name = ''
118 title = 'standalone test%s: %s' % (sanitizer_name,
119 os.path.basename(project['NAME']))
120 location = os.path.join(root, project['NAME'])
121 buildbot_common.BuildStep(title)
122 configs = ('Debug', 'Release')
124 # On linux we can run the standalone tests natively using the host
125 # compiler.
126 if getos.GetPlatform() == 'linux':
127 if sanitizer:
128 configs = ('Debug',)
129 for config in configs:
130 RunTest(location, 'linux', config)
132 if sanitizer:
133 continue
135 for toolchain in ('newlib', 'glibc'):
136 for arch in archs:
137 for config in configs:
138 RunTest(location, toolchain, config, arch)
141 def StepRunBrowserTests(toolchains, experimental):
142 buildbot_common.BuildStep('Run Tests')
144 args = [
145 sys.executable,
146 os.path.join(SCRIPT_DIR, 'test_projects.py'),
147 '--retry-times=3',
150 if experimental:
151 args.append('-x')
152 for toolchain in toolchains:
153 args.extend(['-t', toolchain])
155 try:
156 subprocess.check_call(args)
157 except subprocess.CalledProcessError:
158 buildbot_common.ErrorExit('Error running tests.')
161 def main(args):
162 usage = '%prog [<options>] [<phase...>]'
163 parser = optparse.OptionParser(description=__doc__, usage=usage)
164 parser.add_option('--experimental', help='build experimental tests',
165 action='store_true')
166 parser.add_option('--sanitizer',
167 help='Run sanitizer (asan/tsan/valgrind) tests',
168 action='store_true')
169 parser.add_option('--verbose', '-v', help='Verbose output',
170 action='store_true')
172 if 'NACL_SDK_ROOT' in os.environ:
173 # We don't want the currently configured NACL_SDK_ROOT to have any effect
174 # of the build.
175 del os.environ['NACL_SDK_ROOT']
177 # To setup bash completion for this command first install optcomplete
178 # and then add this line to your .bashrc:
179 # complete -F _optcomplete test_sdk.py
180 try:
181 import optcomplete
182 optcomplete.autocomplete(parser)
183 except ImportError:
184 pass
186 options, args = parser.parse_args(args[1:])
188 pepper_ver = str(int(build_version.ChromeMajorVersion()))
189 pepperdir = os.path.join(OUT_DIR, 'pepper_' + pepper_ver)
190 toolchains = ['newlib', 'glibc', 'pnacl']
191 toolchains.append(getos.GetPlatform())
193 if options.verbose:
194 build_projects.verbose = True
196 phases = [
197 ('build_examples', StepBuildExamples, pepperdir),
198 ('copy_tests', StepCopyTests, pepperdir, toolchains, options.experimental),
199 ('build_tests', StepBuildTests, pepperdir),
200 ('sel_ldr_tests', StepRunSelLdrTests, pepperdir, None),
201 ('browser_tests', StepRunBrowserTests, toolchains, options.experimental),
204 if options.sanitizer:
205 if getos.GetPlatform() != 'linux':
206 buildbot_common.ErrorExit('sanitizer tests only run on linux.')
207 phases += [
208 ('sel_ldr_tests_asan', StepRunSelLdrTests, pepperdir, 'address'),
209 ('sel_ldr_tests_tsan', StepRunSelLdrTests, pepperdir, 'thread'),
210 ('sel_ldr_tests_valgrind', StepRunSelLdrTests, pepperdir, 'valgrind')
213 if args:
214 phase_names = [p[0] for p in phases]
215 for arg in args:
216 if arg not in phase_names:
217 msg = 'Invalid argument: %s\n' % arg
218 msg += 'Possible arguments:\n'
219 for name in phase_names:
220 msg += ' %s\n' % name
221 parser.error(msg.strip())
223 for phase in phases:
224 phase_name = phase[0]
225 if args and phase_name not in args:
226 continue
227 phase_func = phase[1]
228 phase_args = phase[2:]
229 phase_func(*phase_args)
231 return 0
234 if __name__ == '__main__':
235 try:
236 sys.exit(main(sys.argv))
237 except KeyboardInterrupt:
238 buildbot_common.ErrorExit('test_sdk: interrupted')