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 """Fetch prebuilt binaries to run PyAuto.
8 Sets up Chrome and PyAuto binaries using prebuilt binaries from the
9 continuous build archives. Works on mac, win, linux (32 & 64 bit).
13 $ python fetch_prebuilt_pyauto.py -d xcodebuild/Release
14 http://build.chromium.org/f/chromium/continuous/mac/LATEST
17 $ python fetch_prebuilt_pyauto.py -d chrome\Release
18 http://build.chromium.org/f/chromium/continuous/win/LATEST
35 class FetchPrebuilt(object):
36 """Util class to fetch prebuilt binaries to run PyAuto."""
39 parser
= optparse
.OptionParser()
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.')
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())
50 '-l', '--latest', action
='store_true', default
=False,
51 help='Download the latest chromium build from commondatastorage. '
53 self
._options
, self
._args
= parser
.parse_args()
54 if self
._options
.latest
:
55 self
._url
= self
._GetLastestDownloadURL
(self
._options
.platform
)
57 print >>sys
.stderr
, 'Need download url'
60 self
._url
= self
._args
[0]
61 if not self
._options
.outdir
:
62 print >>sys
.stderr
, 'Need output directory: -d/--outdir'
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',
73 }[self
._options
.platform
]
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
87 raise RuntimeError('Could not find chrome zip at ' + self
._url
)
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'
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
106 def _GetLastestDownloadURL(self
, os_platform
):
107 os_type
= {'win': 'Win',
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()
119 print >>sys
.stderr
, ('Unable to get latest from %s' % last_change_url
)
121 last_change_url
= ('http://commondatastorage.googleapis.com/'
122 'chromium-browser-continuous/%s/%s' % (os_type
,
124 return last_change_url
127 """Remove old binaries, if any."""
132 if not os
.path
.isdir(self
._outdir
):
133 os
.makedirs(self
._outdir
)
134 get_remoting
= pyauto_utils
.DoesUrlExist(self
._remoting
_zip
_url
)
136 # Fetch chrome & pyauto binaries
137 print 'Fetching', self
._chrome
_zip
_url
138 chrome_zip
= urllib
.urlretrieve(self
._chrome
_zip
_url
)[0]
141 print 'Fetching', self
._remoting
_zip
_url
142 remoting_zip
= urllib
.urlretrieve(self
._remoting
_zip
_url
)[0]
144 print 'Warning: %s does not exist.' % self
._remoting
_zip
_url
146 print 'Fetching', self
._pyautolib
_py
_url
147 pyautolib_py
= urllib
.urlretrieve(self
._pyautolib
_py
_url
)[0]
149 print 'Fetching', self
._pyautolib
_so
_url
150 pyautolib_so
= urllib
.urlretrieve(self
._pyautolib
_so
_url
)[0]
152 if self
._options
.platform
== 'mac':
153 print 'Fetching', self
._ffmpegsumo
_so
_url
154 ffmpegsumo_so
= urllib
.urlretrieve(self
._ffmpegsumo
_so
_url
)[0]
156 print 'Fetching', self
._chromedriver
_url
157 chromedriver
= urllib
.urlretrieve(self
._chromedriver
_url
)[0]
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
)
164 pyauto_utils
.UnzipFilenameToDir(chrome_zip
, self
._outdir
)
166 pyauto_utils
.UnzipFilenameToDir(remoting_zip
, self
._outdir
)
167 shutil
.move(self
._outdir
+ '/remoting-webapp',
168 self
._outdir
+ '/remoting/remoting.webapp')
170 # Copy over the binaries to outdir
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
)
176 if self
._options
.platform
== 'mac':
177 items_to_copy
[ffmpegsumo_so
] = \
178 os
.path
.join(self
._outdir
, self
._ffmpegsumo
_so
_name
)
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
)
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
)
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)
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]
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
)
209 print 'Prepared binaries in "%s"' % self
._outdir
213 if __name__
== '__main__':
214 sys
.exit(FetchPrebuilt().Run())