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

Side by Side Diff: tests/test_packagerGecko.py

Issue 29501558: Issue 5383 - Add tests for the Chrome and Firefox packagers (Closed)
Patch Set: Addressing pep8 error from last review Created Aug. 11, 2017, 12:12 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5 import os
6 import io
7
8 import pytest
9
10 import json
11
12 from zipfile import ZipFile
13
14 from xml.etree import ElementTree
15
16 from buildtools import packagerGecko
17 from buildtools import localeTools
18
19 from buildtools.packager import getBuildVersion, Files, readMetadata
20 from buildtools.tests.tools import copy_metadata
21
22 MESSAGES = '\n'.join((
Vasily Kuznetsov 2017/08/11 16:46:02 Our style guide recommends that things that you it
23 'name=Name {0}',
24 'description=Awesome description {0}',
25 ))
26
27
28 @pytest.fixture
29 def gecko_metadata(tmpdir):
30 filename = 'metadata.gecko'
31 copy_metadata(filename, tmpdir)
32
33 return readMetadata(str(tmpdir), 'gecko')
34
35
36 @pytest.fixture
37 def scripts(tmpdir):
38 """Example scripts for testing addMissingFiles"""
39 lib_dir = tmpdir.mkdir('lib')
40 lib_dir.join('ext.js').write('require("hooks");')
41
42 content_dir = tmpdir.mkdir('chrome').mkdir('content')
43 content_dir.join('common.js').write('require("hooks");')
44
45
46 @pytest.fixture
47 def prefs_json(tmpdir):
48 """Minimal .json file for testing processJSONFiles"""
49 lib_dir = tmpdir.mkdir('lib')
50 lib_dir.join('prefs.json').write(json.dumps(
51 {'foo': 'bar'}
52 ))
53
54
55 @pytest.fixture
56 def locales(tmpdir):
57 """Minimal locales for testing locale-processing"""
58 chrome_dir = tmpdir.mkdir('chrome')
59 locale_dir = chrome_dir.mkdir('locale')
60
61 data = {
62 'name': {'message': 'Name translated'},
63 'description': {'message': 'Description translated'},
64 }
65
66 for locale in ['en-US', 'de', 'kn']:
67 new_dir = locale_dir.mkdir(locale)
68 new_dir.join('meta.properties').write(MESSAGES.format(locale))
69 new_dir.join('test.json').write(json.dumps(data))
70 if locale == 'kn':
71 new_dir.join('.incomplete').write('')
72
73
74 @pytest.fixture
75 def subscriptions(tmpdir):
76 """Examplary sbuscription-configuration"""
77 tmpdir.join('subs.xml').write(
78 '<subscriptions>'
79 '<subscription title="EasyList"'
80 ' specialization="English"'
81 ' url="https://easylist-downloads.adblockplus.org/easylist.txt"'
82 ' homepage="https://easylist.adblockplus.org/"'
83 ' prefixes="en"'
84 ' author="fanboy, MonztA, Famlam, Khrin"'
85 ' type="ads"/>'
86 '</subscriptions>'
87 )
88
89
90 def test_package_files(tmpdir):
91 tmpdir.join('foo.xml').write('')
92 tmpdir.join('foo.txt').write('')
93 tmpdir.join('foo.js').write('')
94
95 params = {
96 'baseDir': str(tmpdir)
97 }
98
99 files = packagerGecko.getPackageFiles(params)
100 assert 'foo.xml' in files
101 assert 'foo.js' in files
102 assert 'foo.txt' not in files
103
104
105 @pytest.mark.usefixtures('locales')
106 @pytest.mark.parametrize('incomplete', [True, False])
107 def test_get_locales(tmpdir, incomplete):
108 locales = packagerGecko.getLocales(str(tmpdir), incomplete)
109
110 assert 'de' in locales
111 assert 'en-US' in locales
112 assert ('kn' in locales) == incomplete
113
114
115 @pytest.mark.usefixtures('locales', 'subscriptions')
116 @pytest.mark.parametrize('release', [True, False])
117 @pytest.mark.parametrize('multicompartment', [True, False])
118 def test_create_manifest(tmpdir, release, multicompartment, gecko_metadata):
119 locales = packagerGecko.getLocales(str(tmpdir))
120 contributors = packagerGecko.getContributors(gecko_metadata)
121 version = getBuildVersion(str(tmpdir), gecko_metadata, release, None)
122
123 rdfpath = os.path.join(
124 os.path.dirname(__file__),
125 'expecteddata',
126 'manifest_gecko_{}_{}.rdf'.format(release, multicompartment),
127 )
128
129 with io.open(rdfpath, 'r') as fp:
130 expected = ElementTree.fromstring(fp.read())
131
132 params = {
133 'baseDir': str(tmpdir),
134 'locales': locales,
135 'metadata': gecko_metadata,
136 'version': version.encode('utf-8'),
137 'multicompartment': multicompartment,
138 'contributors': contributors,
139 }
140 manifest = packagerGecko.createManifest(params)
141
142 tree = ElementTree.fromstring(manifest)
143
144 from buildtools.tests.tools import get_leafs_string
145 assert set(get_leafs_string(tree)) == set(get_leafs_string(expected))
146
147
148 @pytest.mark.usefixtures('locales')
149 def test_fixup_import_locales(base_files, tmpdir, gecko_metadata):
150 locale_dir = tmpdir.dirpath(tmpdir.basename, 'chrome', 'locale')
151 locale_dir.mkdir('fr').join('meta.properties').write(MESSAGES.format('fr'))
152
153 locales = packagerGecko.getLocales(str(tmpdir), False)
154
155 params = {
156 'metadata': gecko_metadata,
157 'locales': locales,
158 'baseDir': str(tmpdir)
159 }
160
161 # Should add missing fr/test.properties to files
162 packagerGecko.fixupLocales(params, base_files)
163
164 packagerGecko.importLocales(params, base_files)
165 for locale in locales:
166 properties = base_files[
167 'chrome/locale/{}/test.properties'.format(locale)
168 ]
169 translation_data = list(
170 localeTools.parsePropertiesString(properties, ''))
171
172 for trans in [
173 ('name', None, 'Name translated'),
174 ('description', None, 'Description translated')]:
175 assert trans in translation_data
176
177
178 def test_process_json_files(tmpdir, prefs_json):
179 params = {
180 'baseDir': str(tmpdir),
181 'jsonRequires': {},
182 }
183
184 files = Files(packagerGecko.getPackageFiles(params), set())
185 files.read(str(tmpdir))
186
187 packagerGecko.processJSONFiles(params, files)
188
189 assert params['jsonRequires'] == {'prefs.json': {'foo': 'bar'}}
190
191
192 @pytest.mark.usefixtures('scripts')
193 def test_add_missing_files(tmpdir, gecko_metadata):
194 params = {
195 'baseDir': str(tmpdir),
196 'metadata': gecko_metadata,
197 'jsonRequires': {},
198 'multicompartment': True,
199 'hasWebExtension': False,
200 }
201
202 files = Files(packagerGecko.getPackageFiles(params), set())
203 files.read(str(tmpdir))
204
205 packagerGecko.addMissingFiles(params, files)
206
207 assert 'let shutdownHandlers = [];' in files['bootstrap.js']
208 assert 'Services.obs.addObserver(' in files['bootstrap.js']
209 for filename in ['bootstrap.js', 'chrome/content/common.js',
210 'lib/ext.js', 'lib/hooks.js']:
211 assert filename in files
212
213
214 @pytest.mark.usefixtures('gecko_metadata', 'locales', 'subscriptions')
215 @pytest.mark.parametrize('release', [True, False])
216 @pytest.mark.parametrize('multicompartment', [True, False])
217 @pytest.mark.parametrize('all_locales', ['all', None])
218 def test_create_build(tmpdir, capsys, release, multicompartment, all_locales):
219 base_files = [
Vasily Kuznetsov 2017/08/11 16:46:02 Not a big deal, but a small simplification, perhap
220 'bootstrap.js',
221 'chrome/locale/de/test.json',
222 'chrome/locale/de/test.properties',
223 'chrome/locale/en-US/test.json',
224 'chrome/locale/en-US/test.properties',
225 'install.rdf',
226 'subs.xml'
227 ]
228
229 if all_locales is None:
230 expected = base_files
231 else:
232 expected = base_files + [
233 'chrome/locale/kn/test.json',
234 'chrome/locale/kn/test.properties'
235 ]
236
237 out_file = tmpdir.join('{}_{}_{}.zip'.format(
238 all_locales, release, multicompartment))
239
240 out_file = str(out_file)
241
242 packagerGecko.createBuild(
243 str(tmpdir),
244 locales=all_locales,
245 outFile=out_file,
246 releaseBuild=release,
247 multicompartment=multicompartment)
248
249 out, err = capsys.readouterr()
250
251 assert err ==\
252 "Warning: Mapped file adblockplusui/firstRun.html doesn't exist\n"
253
254 with ZipFile(out_file, 'r') as zipfp:
255 zipfp.testzip()
256
257 filenames = [zipinfo.filename for zipinfo in zipfp.infolist()]
258
259 for name in expected:
260 assert name in filenames
OLDNEW

Powered by Google App Engine
This is Rietveld