12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#!/usr/bin/env python
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch"""Script for a testing an existing SDK.
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochThis script is normally run immediately after build_sdk.py.
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch"""
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import optparse
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport subprocess
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import sys
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import buildbot_common
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import build_projects
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import build_sdk
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import build_version
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import parse_dsc
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SDK_SRC_DIR = os.path.dirname(SCRIPT_DIR)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SDK_LIBRARY_DIR = os.path.join(SDK_SRC_DIR, 'libraries')
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SDK_DIR = os.path.dirname(SDK_SRC_DIR)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SRC_DIR = os.path.dirname(SDK_DIR)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OUT_DIR = os.path.join(SRC_DIR, 'out')
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)sys.path.append(os.path.join(SDK_SRC_DIR, 'tools'))
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import getos
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef StepBuildExamples(pepperdir):
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for config in ('Debug', 'Release'):
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    build_sdk.BuildStepMakeAll(pepperdir, 'examples',
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               'Build Examples (%s)' % config,
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               deps=False, config=config)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef StepCopyTests(pepperdir, toolchains, build_experimental):
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buildbot_common.BuildStep('Copy Tests')
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Update test libraries and test apps
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  filters = {
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    'DEST': ['tests']
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if not build_experimental:
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    filters['EXPERIMENTAL'] = False
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, include=filters)
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  build_projects.UpdateHelpers(pepperdir, clobber=False)
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  build_projects.UpdateProjects(pepperdir, tree, clobber=False,
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                toolchains=toolchains)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef StepBuildTests(pepperdir):
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for config in ('Debug', 'Release'):
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    build_sdk.BuildStepMakeAll(pepperdir, 'tests',
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   'Build Tests (%s)' % config,
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   deps=False, config=config)
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef StepRunSelLdrTests(pepperdir):
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  filters = {
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    'SEL_LDR': True
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, include=filters)
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def RunTest(test, toolchain, arch, config):
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    args = ['TOOLCHAIN=%s' % toolchain, 'NACL_ARCH=%s' % arch]
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    args += ['SEL_LDR=1', 'run']
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    build_projects.BuildProjectsBranch(pepperdir, test, clean=False,
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                       deps=False, config=config,
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                       args=args)
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if getos.GetPlatform() == 'win':
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    # On win32 we only support running on the system
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    # arch
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    archs = (getos.GetSystemArch('win'),)
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  elif getos.GetPlatform() == 'mac':
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    # We only ship 32-bit version of sel_ldr on mac.
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    archs = ('x86_32',)
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  else:
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    # On linux we can run both 32 and 64-bit
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    archs = ('x86_64', 'x86_32')
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for root, projects in tree.iteritems():
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for project in projects:
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      title = 'sel_ldr tests: %s' % os.path.basename(project['NAME'])
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      location = os.path.join(root, project['NAME'])
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      buildbot_common.BuildStep(title)
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      for toolchain in ('newlib', 'glibc'):
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        for arch in archs:
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          for config in ('Debug', 'Release'):
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            RunTest(location, toolchain, arch, config)
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochdef StepRunBrowserTests(toolchains, experimental):
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  buildbot_common.BuildStep('Run Tests')
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  args = [
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    sys.executable,
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    os.path.join(SCRIPT_DIR, 'test_projects.py'),
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ]
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if experimental:
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    args.append('-x')
108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for toolchain in toolchains:
109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    args.extend(['-t', toolchain])
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  try:
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    subprocess.check_call(args)
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  except subprocess.CalledProcessError:
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    buildbot_common.ErrorExit('Error running tests.')
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def main(args):
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  usage = '%prog [<options>] [<phase...>]'
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  parser = optparse.OptionParser(description=__doc__, usage=usage)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--experimental', help='build experimental tests',
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    action='store_true')
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser.add_option('--verbose', help='Verbose output', action='store_true')
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if 'NACL_SDK_ROOT' in os.environ:
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    # We don't want the currently configured NACL_SDK_ROOT to have any effect
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    # of the build.
127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    del os.environ['NACL_SDK_ROOT']
128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options, args = parser.parse_args(args[1:])
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pepper_ver = str(int(build_version.ChromeMajorVersion()))
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pepperdir = os.path.join(OUT_DIR, 'pepper_' + pepper_ver)
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  toolchains = ['newlib', 'glibc', 'pnacl']
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  toolchains.append(getos.GetPlatform())
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if options.verbose:
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    build_projects.verbose = True
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  phases = [
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ('build_examples', StepBuildExamples, pepperdir),
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ('copy_tests', StepCopyTests, pepperdir, toolchains, options.experimental),
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ('build_tests', StepBuildTests, pepperdir),
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ('sel_ldr_tests', StepRunSelLdrTests, pepperdir),
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ('browser_tests', StepRunBrowserTests, toolchains, options.experimental),
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ]
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if args:
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    phase_names = [p[0] for p in phases]
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for arg in args:
1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if arg not in phase_names:
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        msg = 'Invalid argument: %s\n' % arg
1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        msg += 'Possible arguments:\n'
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        for name in phase_names:
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          msg += '   %s\n' % name
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        parser.error(msg.strip())
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for phase in phases:
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    phase_name = phase[0]
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if args and phase_name not in args:
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      continue
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    phase_func = phase[1]
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    phase_args = phase[2:]
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    phase_func(*phase_args)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if __name__ == '__main__':
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  try:
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sys.exit(main(sys.argv))
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  except KeyboardInterrupt:
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    buildbot_common.ErrorExit('test_sdk: interrupted')
173