| OLD | NEW | 
|---|
| 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 ConfigParser |  | 
| 6 import json |  | 
| 7 import os |  | 
| 8 import shutil |  | 
| 9 import xml.etree.ElementTree as ET | 5 import xml.etree.ElementTree as ET | 
| 10 import zipfile | 6 import zipfile | 
| 11 | 7 | 
| 12 import pytest | 8 import pytest | 
| 13 | 9 | 
| 14 from buildtools import packager, packagerEdge | 10 from buildtools import packager, packagerEdge | 
| 15 | 11 | 
| 16 TEST_DIR = os.path.dirname(__file__) |  | 
| 17 TEST_METADATA = os.path.join(TEST_DIR, 'metadata.edge') |  | 
| 18 CHARS = b''.join(chr(i % 200 + 30) for i in range(500)) |  | 
| 19 MESSAGES_EN_US = json.dumps({ |  | 
| 20     'name': {'message': 'Adblock Plus'}, |  | 
| 21     'name_devbuild': {'message': 'devbuild-marker'}, |  | 
| 22     'description': { |  | 
| 23         'message': 'Adblock Plus is the most popular ad blocker ever, ' |  | 
| 24                    'and also supports websites by not blocking ' |  | 
| 25                    'unobstrusive ads by default (configurable).' |  | 
| 26     }, |  | 
| 27 }) |  | 
| 28 |  | 
| 29 |  | 
| 30 @pytest.fixture |  | 
| 31 def metadata(): |  | 
| 32     """Loaded metadata config.""" |  | 
| 33     conf_parser = ConfigParser.ConfigParser() |  | 
| 34     conf_parser.read(TEST_METADATA) |  | 
| 35     return conf_parser |  | 
| 36 |  | 
| 37 |  | 
| 38 @pytest.fixture |  | 
| 39 def files(): |  | 
| 40     """Minimal Files() for testing manifest and blockmap.""" |  | 
| 41     files = packager.Files(set(), set()) |  | 
| 42     for size in ['44', '50', '150']: |  | 
| 43         files['Assets/logo_{}.png'.format(size)] = CHARS |  | 
| 44     files['Extension/_locales/en_US/messages.json'] = MESSAGES_EN_US |  | 
| 45     files['Extension/foo.xml'] = CHARS |  | 
| 46     files['Extension/bar.png'] = CHARS * 200 |  | 
| 47     return files |  | 
| 48 |  | 
| 49 |  | 
| 50 @pytest.fixture |  | 
| 51 def srcdir(tmpdir): |  | 
| 52     """Source directory for building the package.""" |  | 
| 53     srcdir = tmpdir.mkdir('src') |  | 
| 54     shutil.copy(TEST_METADATA, str(srcdir.join('metadata.edge'))) |  | 
| 55     for size in ['44', '50', '150']: |  | 
| 56         path = srcdir.join('chrome', 'icons', 'abp-{}.png'.format(size)) |  | 
| 57         path.write(size, ensure=True) |  | 
| 58     localedir = srcdir.mkdir('_locales') |  | 
| 59     en_us_dir = localedir.mkdir('en_US') |  | 
| 60     en_us_dir.join('messages.json').write(MESSAGES_EN_US) |  | 
| 61     return srcdir |  | 
| 62 |  | 
| 63 | 12 | 
| 64 def blockmap2dict(xml_data): | 13 def blockmap2dict(xml_data): | 
| 65     """Convert AppxBlockMap.xml to a dict of dicts easier to inspect.""" | 14     """Convert AppxBlockMap.xml to a dict of dicts easier to inspect.""" | 
| 66     return { | 15     return { | 
| 67         file.get('Name'): { | 16         file.get('Name'): { | 
| 68             'size': file.get('Size'), | 17             'size': file.get('Size'), | 
| 69             'lfhsize': file.get('LfhSize'), | 18             'lfhsize': file.get('LfhSize'), | 
| 70             'blocks': [b.get('Hash') for b in file] | 19             'blocks': [b.get('Hash') for b in file] | 
| 71         } | 20         } | 
| 72         for file in ET.fromstring(xml_data) | 21         for file in ET.fromstring(xml_data) | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 122         'otf': 'application/octet-stream', | 71         'otf': 'application/octet-stream', | 
| 123         'png': 'image/png', | 72         'png': 'image/png', | 
| 124         'xml': 'application/xml' | 73         'xml': 'application/xml' | 
| 125     } | 74     } | 
| 126     assert ctm_dict['overrides'] == { | 75     assert ctm_dict['overrides'] == { | 
| 127         '/AppxBlockMap.xml': 'application/vnd.ms-appx.blockmap+xml', | 76         '/AppxBlockMap.xml': 'application/vnd.ms-appx.blockmap+xml', | 
| 128         '/AppxManifest.xml': 'application/vnd.ms-appx.manifest+xml' | 77         '/AppxManifest.xml': 'application/vnd.ms-appx.manifest+xml' | 
| 129     } | 78     } | 
| 130 | 79 | 
| 131 | 80 | 
| 132 def test_create_appx_manifest(metadata, files): | 81 @pytest.mark.parametrize('metadata_files', ['metadata.edge'], indirect=True) | 
|  | 82 @pytest.mark.usefixtures('metadata_files') | 
|  | 83 def test_create_appx_manifest(files, srcdir): | 
| 133     namespaces = { | 84     namespaces = { | 
| 134         'ns': 'http://schemas.microsoft.com/' | 85         'ns': 'http://schemas.microsoft.com/' | 
| 135               'appx/manifest/foundation/windows10', | 86               'appx/manifest/foundation/windows10', | 
| 136         'uap': 'http://schemas.microsoft.com/appx/manifest/uap/windows10', | 87         'uap': 'http://schemas.microsoft.com/appx/manifest/uap/windows10', | 
| 137         'uap3': 'http://schemas.microsoft.com/appx/manifest/uap/windows10/3', | 88         'uap3': 'http://schemas.microsoft.com/appx/manifest/uap/windows10/3', | 
| 138     } | 89     } | 
| 139 | 90 | 
| 140     def first(elem): | 91     def first(elem): | 
| 141         return elem[0] | 92         return elem[0] | 
| 142 | 93 | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 204         ('./ns:Applications/ns:Application/ns:Extensions/uap3:Extension/' | 155         ('./ns:Applications/ns:Application/ns:Extensions/uap3:Extension/' | 
| 205             'uap3:AppExtension', | 156             'uap3:AppExtension', | 
| 206             [first, attr('Id')], | 157             [first, attr('Id')], | 
| 207             '1.0'), | 158             '1.0'), | 
| 208         ('./ns:Applications/ns:Application/ns:Extensions/uap3:Extension/' | 159         ('./ns:Applications/ns:Application/ns:Extensions/uap3:Extension/' | 
| 209             'uap3:AppExtension', | 160             'uap3:AppExtension', | 
| 210             [first, attr('DisplayName')], | 161             [first, attr('DisplayName')], | 
| 211             'Adblock Plus'), | 162             'Adblock Plus'), | 
| 212     ] | 163     ] | 
| 213 | 164 | 
|  | 165     metadata = packager.readMetadata(str(srcdir), 'edge') | 
|  | 166 | 
| 214     for release_build, pairs in [(False, devbuild), (True, release)]: | 167     for release_build, pairs in [(False, devbuild), (True, release)]: | 
| 215         manifest = ET.fromstring(packagerEdge.create_appx_manifest( | 168         manifest = ET.fromstring(packagerEdge.create_appx_manifest( | 
| 216             {'metadata': metadata}, | 169             {'metadata': metadata}, | 
| 217             files, | 170             files, | 
| 218             release_build=release_build)) | 171             release_build=release_build)) | 
| 219         for expression, modifiers, value in pairs: | 172         for expression, modifiers, value in pairs: | 
| 220             res = reduce( | 173             res = reduce( | 
| 221                 lambda val, func: func(val), | 174                 lambda val, func: func(val), | 
| 222                 modifiers, | 175                 modifiers, | 
| 223                 manifest.findall(expression, namespaces=namespaces)) | 176                 manifest.findall(expression, namespaces=namespaces)) | 
| 224             assert res == value | 177             assert res == value | 
| 225 | 178 | 
| 226 | 179 | 
| 227 def test_move_files_to_extension(): | 180 def test_move_files_to_extension(chars): | 
| 228     files = packager.Files(set(), set()) | 181     files = packager.Files(set(), set()) | 
| 229     files['foo.xml'] = CHARS | 182     files['foo.xml'] = chars | 
| 230     files['foo/bar.xml'] = CHARS | 183     files['foo/bar.xml'] = chars | 
| 231     files['Extension/foo.xml'] = CHARS | 184     files['Extension/foo.xml'] = chars | 
| 232     packagerEdge.move_files_to_extension(files) | 185     packagerEdge.move_files_to_extension(files) | 
| 233     assert set(files.keys()) == { | 186     assert set(files.keys()) == { | 
| 234         'Extension/foo.xml', | 187         'Extension/foo.xml', | 
| 235         'Extension/foo/bar.xml', | 188         'Extension/foo/bar.xml', | 
| 236         'Extension/Extension/foo.xml' | 189         'Extension/Extension/foo.xml' | 
| 237     } | 190     } | 
| 238 | 191 | 
| 239 | 192 | 
|  | 193 @pytest.mark.parametrize('metadata_files', ['metadata.edge'], indirect=True) | 
|  | 194 @pytest.mark.usefixtures('metadata_files') | 
| 240 def test_create_build(tmpdir, srcdir): | 195 def test_create_build(tmpdir, srcdir): | 
| 241     out_file = str(tmpdir.join('abp.appx')) | 196     out_file = str(tmpdir.join('abp.appx')) | 
| 242     packagerEdge.createBuild(str(srcdir), outFile=out_file, releaseBuild=True) | 197     packagerEdge.createBuild(str(srcdir), outFile=out_file, releaseBuild=True) | 
| 243     appx = zipfile.ZipFile(out_file) | 198     appx = zipfile.ZipFile(out_file) | 
| 244 | 199 | 
| 245     names = set(appx.namelist()) | 200     names = set(appx.namelist()) | 
| 246     assert 'AppxManifest.xml' in names | 201     assert 'AppxManifest.xml' in names | 
| 247     assert 'AppxBlockMap.xml' in names | 202     assert 'AppxBlockMap.xml' in names | 
| 248     assert '[Content_Types].xml' in names | 203     assert '[Content_Types].xml' in names | 
| 249 | 204 | 
| 250     assert 'devbuild-marker' not in appx.read('AppxManifest.xml') | 205     assert 'devbuild-marker' not in appx.read('AppxManifest.xml') | 
| 251     assert appx.read('Assets/logo_44.png') == '44' | 206     assert appx.read('Assets/logo_44.png') == '44' | 
| 252     assert appx.read('Extension/icons/abp-44.png') == '44' | 207     assert appx.read('Extension/icons/abp-44.png') == '44' | 
| 253 | 208 | 
| 254 | 209 | 
|  | 210 @pytest.mark.parametrize('metadata_files', ['metadata.edge'], indirect=True) | 
|  | 211 @pytest.mark.usefixtures('metadata_files') | 
| 255 def test_create_devbuild(tmpdir, srcdir): | 212 def test_create_devbuild(tmpdir, srcdir): | 
| 256     out_file = str(tmpdir.join('abp.appx')) | 213     out_file = str(tmpdir.join('abp.appx')) | 
| 257     packagerEdge.createBuild(str(srcdir), outFile=out_file, releaseBuild=False) | 214     packagerEdge.createBuild(str(srcdir), outFile=out_file, releaseBuild=False) | 
| 258     appx = zipfile.ZipFile(out_file) | 215     appx = zipfile.ZipFile(out_file) | 
| 259     assert 'devbuild-marker' in appx.read('AppxManifest.xml') | 216     assert 'devbuild-marker' in appx.read('AppxManifest.xml') | 
| OLD | NEW | 
|---|