OLD | NEW |
| (Empty) |
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. | |
5 | |
6 """Fetch prebuilt binaries to run PyAuto. | |
7 | |
8 Sets up Chrome and PyAuto binaries using prebuilt binaries from the | |
9 continuous build archives. Works on mac, win, linux (32 & 64 bit). | |
10 | |
11 Examples: | |
12 On Mac: | |
13 $ python fetch_prebuilt_pyauto.py -d xcodebuild/Release | |
14 http://build.chromium.org/f/chromium/continuous/mac/LATEST | |
15 | |
16 On Win: | |
17 $ python fetch_prebuilt_pyauto.py -d chrome\Release | |
18 http://build.chromium.org/f/chromium/continuous/win/LATEST | |
19 """ | |
20 | |
21 import glob | |
22 import httplib | |
23 import optparse | |
24 import os | |
25 import platform | |
26 import shutil | |
27 import sys | |
28 import urllib | |
29 import urllib2 | |
30 import urlparse | |
31 | |
32 import pyauto_utils | |
33 | |
34 | |
35 class FetchPrebuilt(object): | |
36 """Util class to fetch prebuilt binaries to run PyAuto.""" | |
37 | |
38 def _ParseArgs(self): | |
39 parser = optparse.OptionParser() | |
40 parser.add_option( | |
41 '-d', '--outdir', type='string', default=None, | |
42 help='Directory in which to setup. This is typically the directory ' | |
43 'where the binaries would go when compiled from source.') | |
44 parser.add_option( | |
45 '-p', '--platform', type='string', | |
46 default=pyauto_utils.GetCurrentPlatform(), | |
47 help='Platform. Valid options: win, mac, linux32, linux64. ' | |
48 'Default: current platform (%s)' % pyauto_utils.GetCurrentPlatform()) | |
49 parser.add_option( | |
50 '-l', '--latest', action='store_true', default=False, | |
51 help='Download the latest chromium build from commondatastorage. ' | |
52 '[default=False]') | |
53 self._options, self._args = parser.parse_args() | |
54 if self._options.latest: | |
55 self._url = self._GetLastestDownloadURL(self._options.platform) | |
56 elif not self._args: | |
57 print >>sys.stderr, 'Need download url' | |
58 sys.exit(2) | |
59 else: | |
60 self._url = self._args[0] | |
61 if not self._options.outdir: | |
62 print >>sys.stderr, 'Need output directory: -d/--outdir' | |
63 sys.exit(1) | |
64 self._outdir = self._options.outdir | |
65 # Chromium continuous build archive has a non-standard format. | |
66 if 'index.html?path=' in self._url: | |
67 self._url = self._url.replace('index.html?path=', '') | |
68 self._url = self._url.rstrip('/') | |
69 # Determine name of zip. | |
70 if not self._options.platform.startswith('linux'): | |
71 self._chrome_zip_name = 'chrome-%s' % {'mac': 'mac', | |
72 'win': 'win32' | |
73 }[self._options.platform] | |
74 else: | |
75 linux_32_names = ['linux', 'lucid32bit'] | |
76 linux_64_names = ['linux64', 'lucid64bit'] | |
77 linux_names = {'linux': linux_32_names + linux_64_names, | |
78 'linux32': linux_32_names, | |
79 'linux64': linux_64_names | |
80 }[self._options.platform] | |
81 for name in linux_names: | |
82 zip_name = 'chrome-' + name | |
83 if pyauto_utils.DoesUrlExist('%s/%s.zip' % (self._url, zip_name)): | |
84 self._chrome_zip_name = zip_name | |
85 break | |
86 else: | |
87 raise RuntimeError('Could not find chrome zip at ' + self._url) | |
88 | |
89 # Setup urls to download. | |
90 self._chrome_zip_url = '%s/%s.zip' % (self._url, self._chrome_zip_name) | |
91 self._remoting_zip_url = self._url + '/' + 'remoting-webapp.zip' | |
92 chrome_test_url = '%s/%s.test' % (self._url, self._chrome_zip_name) | |
93 self._pyautolib_py_url = '%s/pyautolib.py' % chrome_test_url | |
94 if self._options.platform == 'win': | |
95 self._pyautolib_so_name = '_pyautolib.pyd' | |
96 self._chromedriver_name = 'chromedriver.exe' | |
97 else: | |
98 self._pyautolib_so_name = '_pyautolib.so' | |
99 self._chromedriver_name = 'chromedriver' | |
100 if self._options.platform == 'mac': | |
101 self._ffmpegsumo_so_name = 'ffmpegsumo.so' | |
102 self._ffmpegsumo_so_url = chrome_test_url + '/' + self._ffmpegsumo_so_name | |
103 self._pyautolib_so_url = chrome_test_url + '/' + self._pyautolib_so_name | |
104 self._chromedriver_url = chrome_test_url + '/' + self._chromedriver_name | |
105 | |
106 def _GetLastestDownloadURL(self, os_platform): | |
107 os_type = {'win': 'Win', | |
108 'mac': 'Mac', | |
109 'linux': 'Linux', | |
110 'linux32': 'Linux', | |
111 'linux64': 'Linux_x64'}[os_platform] | |
112 if os_type == 'Linux' and platform.architecture()[0] == '64bit': | |
113 os_type = 'Linux_x64' | |
114 last_change_url = ('http://commondatastorage.googleapis.com/' | |
115 'chromium-browser-continuous/%s/LAST_CHANGE' % os_type) | |
116 response = urllib2.urlopen(last_change_url) | |
117 last_change = response.read() | |
118 if not last_change: | |
119 print >>sys.stderr, ('Unable to get latest from %s' % last_change_url) | |
120 sys.exit(2) | |
121 last_change_url = ('http://commondatastorage.googleapis.com/' | |
122 'chromium-browser-continuous/%s/%s' % (os_type, | |
123 last_change)) | |
124 return last_change_url | |
125 | |
126 def Cleanup(self): | |
127 """Remove old binaries, if any.""" | |
128 pass | |
129 | |
130 def Run(self): | |
131 self._ParseArgs() | |
132 if not os.path.isdir(self._outdir): | |
133 os.makedirs(self._outdir) | |
134 get_remoting = pyauto_utils.DoesUrlExist(self._remoting_zip_url) | |
135 | |
136 # Fetch chrome & pyauto binaries | |
137 print 'Fetching', self._chrome_zip_url | |
138 chrome_zip = urllib.urlretrieve(self._chrome_zip_url)[0] | |
139 | |
140 if get_remoting: | |
141 print 'Fetching', self._remoting_zip_url | |
142 remoting_zip = urllib.urlretrieve(self._remoting_zip_url)[0] | |
143 else: | |
144 print 'Warning: %s does not exist.' % self._remoting_zip_url | |
145 | |
146 print 'Fetching', self._pyautolib_py_url | |
147 pyautolib_py = urllib.urlretrieve(self._pyautolib_py_url)[0] | |
148 | |
149 print 'Fetching', self._pyautolib_so_url | |
150 pyautolib_so = urllib.urlretrieve(self._pyautolib_so_url)[0] | |
151 | |
152 if self._options.platform == 'mac': | |
153 print 'Fetching', self._ffmpegsumo_so_url | |
154 ffmpegsumo_so = urllib.urlretrieve(self._ffmpegsumo_so_url)[0] | |
155 | |
156 print 'Fetching', self._chromedriver_url | |
157 chromedriver = urllib.urlretrieve(self._chromedriver_url)[0] | |
158 | |
159 chrome_unzip_dir = os.path.join(self._outdir, self._chrome_zip_name) | |
160 if os.path.exists(chrome_unzip_dir): | |
161 print 'Cleaning', chrome_unzip_dir | |
162 pyauto_utils.RemovePath(chrome_unzip_dir) | |
163 print 'Unzipping' | |
164 pyauto_utils.UnzipFilenameToDir(chrome_zip, self._outdir) | |
165 if get_remoting: | |
166 pyauto_utils.UnzipFilenameToDir(remoting_zip, self._outdir) | |
167 shutil.move(self._outdir + '/remoting-webapp', | |
168 self._outdir + '/remoting/remoting.webapp') | |
169 | |
170 # Copy over the binaries to outdir | |
171 items_to_copy = { | |
172 pyautolib_py: os.path.join(self._outdir, 'pyautolib.py'), | |
173 pyautolib_so: os.path.join(self._outdir, self._pyautolib_so_name), | |
174 chromedriver: os.path.join(self._outdir, self._chromedriver_name) | |
175 } | |
176 if self._options.platform == 'mac': | |
177 items_to_copy[ffmpegsumo_so] = \ | |
178 os.path.join(self._outdir, self._ffmpegsumo_so_name) | |
179 | |
180 unzip_dir_contents = glob.glob(os.path.join(chrome_unzip_dir, '*')) | |
181 for item in unzip_dir_contents: | |
182 name = os.path.basename(item) | |
183 items_to_copy[item] = os.path.join(self._outdir, name) | |
184 | |
185 for src, dest in items_to_copy.iteritems(): | |
186 pyauto_utils.RemovePath(dest) | |
187 print '%s ==> %s' % (os.path.basename(src), dest) | |
188 shutil.move(src, dest) | |
189 pyauto_utils.RemovePath(chrome_unzip_dir) | |
190 | |
191 # Final setup (if any) | |
192 # Set executable bit on chromedriver binary. | |
193 if not self._options.platform == 'win': | |
194 os.chmod(items_to_copy[chromedriver], 0700) | |
195 | |
196 # Create symlink to .framework on Mac | |
197 if self._options.platform == 'mac': | |
198 mac_app_name = os.path.basename([x for x in unzip_dir_contents | |
199 if x.endswith('.app')][0]) | |
200 os.chdir(self._outdir) | |
201 framework = glob.glob(os.path.join( | |
202 mac_app_name, 'Contents', 'Versions', '*', '*.framework'))[0] | |
203 print framework | |
204 dest = os.path.basename(framework) | |
205 os.path.lexists(dest) and os.remove(dest) | |
206 print 'Creating symlink "%s"' % dest | |
207 os.symlink(framework, dest) | |
208 | |
209 print 'Prepared binaries in "%s"' % self._outdir | |
210 return 0 | |
211 | |
212 | |
213 if __name__ == '__main__': | |
214 sys.exit(FetchPrebuilt().Run()) | |
OLD | NEW |