- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / chromedriver / test / run_all_tests.py
1 #!/usr/bin/env python
2 # Copyright 2013 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
6 """Runs all ChromeDriver end to end tests."""
7
8 import optparse
9 import os
10 import platform
11 import sys
12 import tempfile
13
14 _THIS_DIR = os.path.abspath(os.path.dirname(__file__))
15 sys.path.insert(0, os.path.join(_THIS_DIR, os.pardir))
16
17 import archive
18 import chrome_paths
19 import util
20
21 sys.path.insert(0, os.path.join(chrome_paths.GetSrc(), 'build', 'android'))
22 from pylib import constants
23
24
25 def _AppendEnvironmentPath(env_name, path):
26   if env_name in os.environ:
27     lib_path = os.environ[env_name]
28     if path not in lib_path:
29       os.environ[env_name] += os.pathsep + path
30   else:
31     os.environ[env_name] = path
32
33
34 def _AddToolsToSystemPathForWindows():
35   path_cfg_file = 'C:\\tools\\bots_path.cfg'
36   if not os.path.exists(path_cfg_file):
37     print 'Failed to find file', path_cfg_file
38   with open(path_cfg_file, 'r') as cfg:
39     paths = cfg.read().split('\n')
40   os.environ['PATH'] = os.pathsep.join(paths) + os.pathsep + os.environ['PATH']
41
42
43 def _GenerateTestCommand(script,
44                          chromedriver,
45                          ref_chromedriver=None,
46                          chrome=None,
47                          chrome_version=None,
48                          android_package=None,
49                          verbose=False):
50   _, log_path = tempfile.mkstemp(prefix='chromedriver_')
51   print 'chromedriver server log: %s' % log_path
52   cmd = [
53       sys.executable,
54       os.path.join(_THIS_DIR, script),
55       '--chromedriver=%s' % chromedriver,
56       '--log-path=%s' % log_path,
57   ]
58   if ref_chromedriver:
59     cmd.append('--reference-chromedriver=' + ref_chromedriver)
60
61   if chrome:
62     cmd.append('--chrome=' + chrome)
63
64   if chrome_version:
65     cmd.append('--chrome-version=' + chrome_version)
66
67   if verbose:
68     cmd.append('--verbose')
69
70   if android_package:
71     cmd = ['xvfb-run', '-a'] + cmd
72     cmd.append('--android-package=' + android_package)
73   return cmd
74
75
76 def RunPythonTests(chromedriver, ref_chromedriver,
77                    chrome=None, chrome_version=None,
78                    chrome_version_name=None, android_package=None):
79   version_info = ''
80   if chrome_version_name:
81     version_info = '(%s)' % chrome_version_name
82   util.MarkBuildStepStart('python_tests%s' % version_info)
83   code = util.RunCommand(
84       _GenerateTestCommand('run_py_tests.py',
85                            chromedriver,
86                            ref_chromedriver=ref_chromedriver,
87                            chrome=chrome,
88                            chrome_version=chrome_version,
89                            android_package=android_package))
90   if code:
91     util.MarkBuildStepError()
92   return code
93
94
95 def RunJavaTests(chromedriver, chrome=None, chrome_version=None,
96                  chrome_version_name=None, android_package=None,
97                  verbose=False):
98   version_info = ''
99   if chrome_version_name:
100     version_info = '(%s)' % chrome_version_name
101   util.MarkBuildStepStart('java_tests%s' % version_info)
102   code = util.RunCommand(
103       _GenerateTestCommand('run_java_tests.py',
104                            chromedriver,
105                            ref_chromedriver=None,
106                            chrome=chrome,
107                            chrome_version=chrome_version,
108                            android_package=android_package,
109                            verbose=verbose))
110   if code:
111     util.MarkBuildStepError()
112   return code
113
114
115 def RunCppTests(cpp_tests):
116   util.MarkBuildStepStart('chromedriver_tests')
117   code = util.RunCommand([cpp_tests])
118   if code:
119     util.MarkBuildStepError()
120   return code
121
122
123 def DownloadChrome(version_name, revision, download_site):
124   util.MarkBuildStepStart('download %s' % version_name)
125   return archive.DownloadChrome(revision, util.MakeTempDir(), download_site)
126
127
128 def main():
129   parser = optparse.OptionParser()
130   parser.add_option(
131       '', '--android-packages',
132       help='Comma separated list of application package names, '
133            'if running tests on Android.')
134   # Option 'chrome-version' is for desktop only.
135   parser.add_option(
136       '', '--chrome-version',
137       help='Version of chrome, e.g., \'HEAD\', \'27\', or \'26\'.'
138            'Default is to run tests against all of these versions.'
139            'Notice: this option only applies to desktop.')
140   options, _ = parser.parse_args()
141
142   exe_postfix = ''
143   if util.IsWindows():
144     exe_postfix = '.exe'
145   cpp_tests_name = 'chromedriver_tests' + exe_postfix
146   server_name = 'chromedriver' + exe_postfix
147
148   required_build_outputs = [server_name]
149   if not options.android_packages:
150     required_build_outputs += [cpp_tests_name]
151   build_dir = chrome_paths.GetBuildDir(required_build_outputs)
152   constants.SetBuildType(os.path.basename(build_dir))
153   print 'Using build outputs from', build_dir
154
155   chromedriver = os.path.join(build_dir, server_name)
156   platform_name = util.GetPlatformName()
157   if util.IsLinux() and platform.architecture()[0] == '64bit':
158     platform_name += '64'
159   ref_chromedriver = os.path.join(
160       chrome_paths.GetSrc(),
161       'chrome', 'test', 'chromedriver', 'third_party', 'java_tests',
162       'reference_builds',
163       'chromedriver_%s%s' % (platform_name, exe_postfix))
164
165   if util.IsLinux():
166     # Set LD_LIBRARY_PATH to enable successful loading of shared object files,
167     # when chromedriver2.so is not a static build.
168     _AppendEnvironmentPath('LD_LIBRARY_PATH', os.path.join(build_dir, 'lib'))
169   elif util.IsWindows():
170     # For Windows bots: add ant, java(jre) and the like to system path.
171     _AddToolsToSystemPathForWindows()
172
173   if options.android_packages:
174     os.environ['PATH'] += os.pathsep + os.path.join(
175         _THIS_DIR, os.pardir, 'chrome')
176     code = 0
177     for package in options.android_packages.split(','):
178       code1 = RunPythonTests(chromedriver,
179                              ref_chromedriver,
180                              chrome_version_name=package,
181                              android_package=package)
182       code2 = RunJavaTests(chromedriver,
183                            chrome_version_name=package,
184                            android_package=package,
185                            verbose=True)
186       code = code or code1 or code2
187     return code
188   else:
189     latest_snapshot_revision = archive.GetLatestRevision(archive.Site.SNAPSHOT)
190     versions = [
191         ['HEAD', latest_snapshot_revision],
192         ['31', archive.CHROME_31_REVISION],
193         ['30', archive.CHROME_30_REVISION],
194         ['29', archive.CHROME_29_REVISION]
195     ]
196     code = 0
197     for version in versions:
198       if options.chrome_version and version[0] != options.chrome_version:
199         continue
200       download_site = archive.Site.CONTINUOUS
201       version_name = version[0]
202       if version_name == 'HEAD':
203         version_name = version[1]
204         download_site = archive.Site.SNAPSHOT
205       chrome_path = DownloadChrome(version_name, version[1], download_site)
206       code1 = RunPythonTests(chromedriver,
207                              ref_chromedriver,
208                              chrome=chrome_path,
209                              chrome_version=version[0],
210                              chrome_version_name='v%s' % version_name)
211       code2 = RunJavaTests(chromedriver, chrome=chrome_path,
212                            chrome_version=version[0],
213                            chrome_version_name='v%s' % version_name)
214       code = code or code1 or code2
215     cpp_tests = os.path.join(build_dir, cpp_tests_name)
216     return RunCppTests(cpp_tests) or code
217
218
219 if __name__ == '__main__':
220   sys.exit(main())