Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: tests/test_packagerWebExt.py

Issue 29501558: Issue 5383 - Add tests for the Chrome and Firefox packagers (Closed)
Left Patch Set: Completely purge PIL / Pillow, added edge-extension fixture / assert Created Sept. 11, 2017, 8:43 a.m.
Right Patch Set: Readme, difflib, buildnum Created Sept. 13, 2017, 1:29 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « tests/test_packagerEdge.py ('k') | tests/tools.py » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 # This Source Code Form is subject to the terms of the Mozilla Public 1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this 2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4 4
5 import os 5 import os
6 import shutil 6 import shutil
7 import json 7 import json
8 import re 8 import re
9 from struct import unpack
9 10
10 import pytest 11 import pytest
11 12 from Crypto.Hash import SHA
12 from buildtools import packager 13 from Crypto.PublicKey import RSA
13 from buildtools.tests.tools import DirContent 14 from Crypto.Signature import PKCS1_v1_5
Vasily Kuznetsov 2017/09/11 12:50:07 These imports also can be combined.
tlucas 2017/09/12 11:32:10 Acknowledged.
tlucas 2017/09/13 13:43:24 Done.
14 from buildtools.tests.tools import ZipContent 15
15 from buildtools.tests.tools import copy_metadata 16
16 from buildtools.tests.tools import run_webext_build 17 from buildtools import packager, packagerChrome
17 from buildtools.tests.tools import assert_all_locales_present 18 from buildtools.tests.tools import (DirContent, ZipContent, copy_metadata,
18 from buildtools.tests.tools import assert_manifest_content 19 run_webext_build, assert_manifest_content,
19 from buildtools.tests.tools import locale_files 20 assert_all_locales_present, locale_files)
20 from buildtools.tests.conftest import ALL_LANGUAGES 21 from buildtools.tests.conftest import ALL_LANGUAGES
21 22
22 23
23 LOCALES_MODULE = { 24 LOCALES_MODULE = {
24 'test.Foobar': { 25 'test.Foobar': {
25 'message': 'Ensuring dict-copy from modules for $domain$', 26 'message': 'Ensuring dict-copy from modules for $domain$',
26 'description': 'test description', 27 'description': 'test description',
27 'placeholders': {'content': '$1', 'example': 'www.adblockplus.org'} 28 'placeholders': {'content': '$1', 'example': 'www.adblockplus.org'}
28 } 29 }
29 } 30 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 filenames = set(package.namelist()) 141 filenames = set(package.namelist())
141 142
142 assert 'bar.json' in filenames 143 assert 'bar.json' in filenames
143 assert 'manifest.json' in filenames 144 assert 'manifest.json' in filenames
144 assert 'lib/foo.js' in filenames 145 assert 'lib/foo.js' in filenames
145 assert 'foo/logo_50.png' in filenames 146 assert 'foo/logo_50.png' in filenames
146 assert 'icons/logo_150.png' in filenames 147 assert 'icons/logo_150.png' in filenames
147 148
148 149
149 def assert_chrome_signature(filename, keyfile): 150 def assert_chrome_signature(filename, keyfile):
150 from struct import unpack
Vasily Kuznetsov 2017/09/11 12:50:07 Is there any specific reason to have these imports
tlucas 2017/09/12 11:32:11 Not at all - merely a result of a speedy adjustmen
tlucas 2017/09/13 13:43:25 Done.
151 from Crypto.Hash import SHA
152 from Crypto.PublicKey import RSA
153 from Crypto.Signature import PKCS1_v1_5
154
155 with open(filename, 'r') as fp: 151 with open(filename, 'r') as fp:
156 content = fp.read() 152 content = fp.read()
157 153
158 _, _, l_pubkey, l_signature = unpack('<4sIII', content[:16]) 154 _, _, l_pubkey, l_signature = unpack('<4sIII', content[:16])
159 signature = content[16 + l_pubkey: 16 + l_pubkey + l_signature] 155 signature = content[16 + l_pubkey: 16 + l_pubkey + l_signature]
160 156
161 digest = SHA.new() 157 digest = SHA.new()
162 with open(keyfile, 'r') as fp: 158 with open(keyfile, 'r') as fp:
163 rsa_key = RSA.importKey(fp.read()) 159 rsa_key = RSA.importKey(fp.read())
164 160
(...skipping 11 matching lines...) Expand all
176 172
177 manifest = package.read('manifest.json') 173 manifest = package.read('manifest.json')
178 174
179 # Chrome Web Store requires descriptive translations to be present in 175 # Chrome Web Store requires descriptive translations to be present in
180 # every language. 176 # every language.
181 for match in re.finditer(r'__MSG_(\S+)__', manifest): 177 for match in re.finditer(r'__MSG_(\S+)__', manifest):
182 name = match.group(1) 178 name = match.group(1)
183 179
184 for other in translations[1:]: 180 for other in translations[1:]:
185 assert translations[0][name]['message'] == other[name]['message'] 181 assert translations[0][name]['message'] == other[name]['message']
186
187
188 @pytest.mark.usefixtures(
189 'all_lang_locales',
190 'gecko_import',
191 'locale_modules',
192 'icons',
193 'lib_files',
194 'chrome_metadata',
195 )
196 @pytest.mark.parametrize('dev_build_release', ['build', 'devenv', 'release'])
197 def test_build_chrome(dev_build_release, keyfile, tmpdir, srcdir, capsys):
198 from buildtools import packagerChrome
199 release = dev_build_release == 'release'
200 devenv = dev_build_release == 'devenv'
201
202 run_webext_build('chrome', dev_build_release, srcdir, packagerChrome,
203 keyfile if release else None)
204
205 # The makeIcons() in packagerChrome.py should warn about non-square
206 # icons via stderr.
207 out, err = capsys.readouterr()
208 assert 'icon should be square' in err
209
210 if devenv:
211 content_class = DirContent
212 out_file_path = os.path.join(str(srcdir), 'devenv.chrome')
213 else:
214 content_class = ZipContent
215 out_file = 'adblockpluschrome-1.2.3'
216 if not release:
217 out_file += '.0'
218
219 if release:
220 out_file += '.crx'
221 else:
222 out_file += '.zip'
223
224 out_file_path = os.path.abspath(os.path.join(
225 os.path.dirname(__file__), os.pardir, out_file))
226
227 assert os.path.exists(out_file_path)
228
229 if release:
230 assert_chrome_signature(out_file_path, keyfile)
231
232 with content_class(out_file_path) as package:
233 assert_base_files(package)
234 assert_devenv_scripts(package, devenv)
235 assert_all_locales_present(package, '_locales')
236 assert_locale_upfix(package)
237 assert_gecko_locale_conversion(package)
238 assert_convert_js(package)
239 expected = os.path.join(
240 os.path.dirname(__file__),
241 'expecteddata',
242 'manifest_chrome_{}.json'.format(dev_build_release),
243 )
244 assert_manifest_content(package.read('manifest.json'), expected)
245 182
246 183
247 @pytest.mark.usefixtures( 184 @pytest.mark.usefixtures(
248 'all_lang_locales', 185 'all_lang_locales',
249 'locale_modules', 186 'locale_modules',
250 'gecko_import', 187 'gecko_import',
251 'icons', 188 'icons',
252 'lib_files', 189 'lib_files',
190 'chrome_metadata',
253 'gecko_webext_metadata', 191 'gecko_webext_metadata',
254 ) 192 )
255 @pytest.mark.parametrize('dev_build_release', ['build', 'devenv', 'release']) 193 @pytest.mark.parametrize('platform', ['chrome', 'gecko-webext'])
256 def test_build_gecko_webext(dev_build_release, tmpdir, srcdir, capsys): 194 @pytest.mark.parametrize('dev_build_release,buildnum', [
Vasily Kuznetsov 2017/09/11 12:50:07 This test seems very similar to the previous one a
tlucas 2017/09/12 11:32:11 I agree - will do (also i fear the complexity of t
tlucas 2017/09/13 13:43:25 Done.
257 from buildtools import packagerChrome 195 ('build', None),
196 ('build', '1337'),
197 ('devenv', None),
198 pytest.param('devenv', '1337', marks=pytest.mark.xfail),
199 ('release', None),
200 ('release', '1337'),
201 ])
202 def test_build_webext(platform, dev_build_release, keyfile, tmpdir, srcdir,
203 buildnum, capsys):
258 release = dev_build_release == 'release' 204 release = dev_build_release == 'release'
259 devenv = dev_build_release == 'devenv' 205 devenv = dev_build_release == 'devenv'
260 206
261 run_webext_build('gecko-webext', dev_build_release, srcdir, packagerChrome) 207 if platform == 'chrome' and release:
208 key = keyfile
209 else:
210 key = None
211
212 filenames = {
213 'gecko-webext': 'adblockplusfirefox-1.2.3{}.{}',
214 'chrome': 'adblockpluschrome-1.2.3{}.{}'
215 }
216
217 extensions = {
218 'gecko-webext': {
219 True: 'xpi',
220 False: 'xpi',
221 },
222 'chrome': {
223 True: 'crx',
224 False: 'zip',
225 },
226 }
227
228 expected_manifest = os.path.join(
229 os.path.dirname(__file__),
230 'expecteddata',
231 'manifest_{}_{}_{}.json'.format(platform, dev_build_release, buildnum),
232 )
233
234 run_webext_build(platform, dev_build_release, srcdir, packagerChrome,
235 buildnum=buildnum, keyfile=key)
262 236
263 # The makeIcons() in packagerChrome.py should warn about non-square 237 # The makeIcons() in packagerChrome.py should warn about non-square
264 # icons via stderr. 238 # icons via stderr.
265 out, err = capsys.readouterr() 239 out, err = capsys.readouterr()
266 assert 'icon should be square' in err 240 assert 'icon should be square' in err
267 241
268 if devenv: 242 if devenv:
269 content_class = DirContent 243 content_class = DirContent
270 out_file_path = os.path.join(str(srcdir), 'devenv.gecko-webext') 244 out_file_path = os.path.join(str(srcdir), 'devenv.' + platform)
271 else: 245 else:
272 content_class = ZipContent 246 content_class = ZipContent
273 out_file = 'adblockplusfirefox-1.2.3{}.xpi'.format( 247
274 '.0' if not release else '' 248 if release:
275 ) 249 add_version = ''
250 else:
251 add_version = '.' + (buildnum or '0')
252 extension = extensions[platform][release]
253
254 out_file = filenames[platform].format(add_version, extension)
276 255
277 out_file_path = os.path.abspath(os.path.join( 256 out_file_path = os.path.abspath(os.path.join(
278 os.path.dirname(__file__), os.pardir, out_file)) 257 os.path.dirname(__file__), os.pardir, out_file))
279
280 assert os.path.exists(out_file_path) 258 assert os.path.exists(out_file_path)
281 259
260 if release and platform == 'chrome':
261 assert_chrome_signature(out_file_path, keyfile)
262
282 with content_class(out_file_path) as package: 263 with content_class(out_file_path) as package:
264 assert_manifest_content(
265 package.read('manifest.json'), expected_manifest
266 )
283 assert_base_files(package) 267 assert_base_files(package)
284 assert_devenv_scripts(package, devenv) 268 assert_devenv_scripts(package, devenv)
285 assert_all_locales_present(package, '_locales') 269 assert_all_locales_present(package, '_locales')
286 assert_gecko_locale_conversion(package) 270 assert_gecko_locale_conversion(package)
287 assert_convert_js(package, True) 271 assert_convert_js(package, platform == 'gecko-webext')
288 272
289 expected = os.path.join( 273 if platform == 'chrome':
290 os.path.dirname(__file__), 274 assert_locale_upfix(package)
291 'expecteddata',
292 'manifest_gecko-webext_{}.json'.format(dev_build_release),
293 )
294 assert_manifest_content(package.read('manifest.json'), expected)
LEFTRIGHT

Powered by Google App Engine
This is Rietveld