| 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 |