1#!/usr/bin/env python
2# Copyright (c) 2011 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.
5"""Builds and runs the Chrome Frame unit and integration tests,
6the exit status of the scrip is the number of failed tests.
7"""
8
9import os.path
10import sys
11import win32com.client
12
13
14# The top-level source directory.
15# All other paths in this file are relative to this directory.
16_SRC_DIR = os.path.abspath(os.path.join(
17    os.path.dirname(__file__), '../..'))
18
19
20def AbsolutePath(path):
21  '''Convert path to absolute.
22
23  Args:
24    path: a path relative to _SRC_DIR.
25
26  Returns: Path as an absolute, normalized path.
27  '''
28  return os.path.abspath(os.path.join(_SRC_DIR, path))
29
30
31# Solution path.
32_CHROME_SOLUTION = AbsolutePath('chrome/chrome.sln')
33
34# List of project files to build.
35_PROJECTS_TO_BUILD = [
36    # Chrome.exe, which in turn causes chrome.dll etc to get built.
37    AbsolutePath('chrome/chrome.vcproj'),
38
39    # Chrome Frame.
40    AbsolutePath('chrome_frame/npchrome_frame.vcproj'),
41
42    # Chrome Frame unittests.
43    AbsolutePath('chrome_frame/chrome_frame_unittests.vcproj'),
44    AbsolutePath('chrome_frame/crash_reporting/vectored_handler_tests.vcproj'),
45
46    # Chrome Frame integration tests.
47    AbsolutePath('chrome_frame/chrome_frame_tests.vcproj'),
48    AbsolutePath('chrome_frame/chrome_frame_net_tests.vcproj'),
49    AbsolutePath('chrome_frame/chrome_frame_perftests.vcproj'),
50]
51
52# List of test executables to run.
53_TESTS_TO_RUN = [
54    'chrome_frame_unittests.exe',
55    'vectored_handler_tests.exe',
56
57    'chrome_frame_tests.exe',
58    'chrome_frame_net_tests.exe',
59    # 'chrome_frame_perftests.exe',
60]
61
62def BuildProjectConfig(builder, config, project):
63  '''Builds a given project in a given configuration, exits on error.
64
65  Args:
66    builder: a Visual Studio SolutionBuild object.
67    config: the name of the configuration to build, f.ex. "Release".
68    project: the path of a project to build, either absolute or else relative
69        to the builder's solution directory.
70  '''
71  print 'Building project "%s" in configuration "%s" ' % (project, config)
72  project = os.path.normpath(project)
73  builder.BuildProject(config, project, True)
74  errors = builder.LastBuildInfo
75
76  if errors != 0:
77    print '%d errors while building config %s.' % (errors, config)
78    sys.exit(errors)
79
80
81def Main():
82  '''Builds Chrome Frame Tests and all their dependencies,
83  then runs the tests.'''
84  v = {}
85  solution = win32com.client.GetObject(_CHROME_SOLUTION)
86  builder = solution.SolutionBuild
87
88  for project in _PROJECTS_TO_BUILD:
89    BuildProjectConfig(builder, 'Debug', project)
90
91  # Ok, everything's built, run the tests.
92  failed_tests = 0
93  for test in _TESTS_TO_RUN:
94    test_path = os.path.abspath(os.path.join(_SRC_DIR, 'chrome/Debug', test))
95    exit_status = os.system(test_path)
96    if exit_status != 0:
97      failed_tests += 1
98      print "Test \"%s\" failed with status %d" % (test, exit_status)
99
100  return failed_tests
101
102
103if __name__ == "__main__":
104  sys.exit(Main())
105