OLD | NEW |
(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(( |
| 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 = [ |
| 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 |
OLD | NEW |