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

Delta Between Two Patch Sets: tests/test_packagerEdge.py

Issue 29345751: Issue 4028 - Add support for Edge extensions to buildtools (Closed)
Left Patch Set: Created June 13, 2016, 12:31 p.m.
Right Patch Set: Address Windows Store issues with blockmap and devbuild display name Created Oct. 14, 2016, 12:07 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/metadata.edge ('k') | tox.ini » ('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 ConfigParser 5 import ConfigParser
6 import io 6 import json
7 import os 7 import os
8 import shutil 8 import shutil
9 import sys
10 import xml.etree.ElementTree as ET 9 import xml.etree.ElementTree as ET
11 import zipfile 10 import zipfile
12 11
13 import pytest 12 import pytest
14 13
14 from buildtools import packager, packagerEdge
15
15 TEST_DIR = os.path.dirname(__file__) 16 TEST_DIR = os.path.dirname(__file__)
16
17 sys.path.insert(0, os.path.dirname(os.path.dirname(TEST_DIR)))
18
19 from buildtools import packager, packagerEdge # noqa: must modify path before t his.
20
21 TEST_METADATA = os.path.join(TEST_DIR, 'metadata.edge') 17 TEST_METADATA = os.path.join(TEST_DIR, 'metadata.edge')
22 CHARS = b''.join(chr(i % 200 + 30) for i in range(500)) 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 })
23 28
24 29
25 @pytest.fixture 30 @pytest.fixture
26 def metadata(): 31 def metadata():
27 """Loaded metadata config.""" 32 """Loaded metadata config."""
28 conf_parser = ConfigParser.ConfigParser() 33 conf_parser = ConfigParser.ConfigParser()
29 conf_parser.read(TEST_METADATA) 34 conf_parser.read(TEST_METADATA)
30 return conf_parser 35 return conf_parser
31 36
32 37
33 @pytest.fixture 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
34 def srcdir(tmpdir): 51 def srcdir(tmpdir):
35 """Source directory for building the package.""" 52 """Source directory for building the package."""
36 srcdir = tmpdir.mkdir('src') 53 srcdir = tmpdir.mkdir('src')
37 shutil.copy(TEST_METADATA, str(srcdir.join('metadata.edge'))) 54 shutil.copy(TEST_METADATA, str(srcdir.join('metadata.edge')))
38 for size in ['44', '50', '150']: 55 for size in ['44', '50', '150']:
39 path = srcdir.join('chrome', 'icons', 'abp-{}.png'.format(size)) 56 path = srcdir.join('chrome', 'icons', 'abp-{}.png'.format(size))
40 path.write(size, ensure=True) 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)
41 return srcdir 61 return srcdir
42 62
43 63
44 def blockmap2dict(xml_data): 64 def blockmap2dict(xml_data):
45 """Convert AppxBlockMap.xml to a dict of dicts easier to inspect.""" 65 """Convert AppxBlockMap.xml to a dict of dicts easier to inspect."""
46 return { 66 return {
47 file.get('Name'): { 67 file.get('Name'): {
48 'size': file.get('Size'), 68 'size': file.get('Size'),
49 'lfhsize': file.get('LfhSize'), 69 'lfhsize': file.get('LfhSize'),
50 'blocks': [ 70 'blocks': [b.get('Hash') for b in file]
51 {'hash': b.get('Hash'), 'size': b.get('Size', None)}
52 for b in file
53 ]
54 } 71 }
55 for file in ET.fromstring(xml_data) 72 for file in ET.fromstring(xml_data)
56 } 73 }
57 74
58 75
59 def test_create_appx_blockmap(): 76 def test_create_appx_blockmap(files):
60 files = packager.Files(set(), set()) 77 blockmap = blockmap2dict(packagerEdge.create_appx_blockmap(files))
61 files['foo.xml'] = CHARS 78 assert blockmap['Extension\\foo.xml'] == {
62 files['foo/bar.png'] = CHARS * 200
63 blockmap = blockmap2dict(packagerEdge.createAppxBlockmap(files))
64 assert blockmap['foo.xml'] == {
65 'size': '500', 79 'size': '500',
66 'lfhsize': '37', 80 'lfhsize': '47',
81 'blocks': ['Vhwfmzss1Ney+j/ssR2QVISvFyMNBQeS2P+UjeE/di0=']
82 }
83 assert blockmap['Extension\\bar.png'] == {
84 'size': '100000',
85 'lfhsize': '47',
67 'blocks': [ 86 'blocks': [
68 {'hash': 'Vhwfmzss1Ney+j/ssR2QVISvFyMNBQeS2P+UjeE/di0=', 87 'KPW2SxeEikUEGhoKmKxruUSexKun0bGXMppOqUFrX5E=',
69 'size': '500'} 88 'KQHnov1SZ1z34ttdDUjX2leYtpIIGndUVoUteieS2cw=',
70 ]
71 }
72 assert blockmap['foo\\bar.png'] == {
73 'size': '100000',
74 'lfhsize': '41',
75 'blocks': [
76 {'hash': 'KPW2SxeEikUEGhoKmKxruUSexKun0bGXMppOqUFrX5E=',
77 'size': '65536'},
78 {'hash': 'KQHnov1SZ1z34ttdDUjX2leYtpIIGndUVoUteieS2cw=',
79 'size': '34464'}
80 ] 89 ]
81 } 90 }
82 91
83 92
84 def test_create_appx_manifest(metadata): 93 def ctm2dict(content_types_map):
85 manifest = packagerEdge.createAppxManifest({'metadata': metadata}) 94 """Convert content type map to a dict."""
95 ret = {'defaults': {}, 'overrides': {}}
96 for node in ET.fromstring(content_types_map):
97 ct = node.get('ContentType')
98 if node.tag.endswith('Default'):
99 ret['defaults'][node.get('Extension')] = ct
100 elif node.tag.endswith('Override'):
101 ret['overrides'][node.get('PartName')] = ct
102 else:
103 raise ValueError('Unrecognised tag in content map: ' + node.tag)
104 return ret
105
106
107 def test_empty_content_types_map():
108 ctm_dict = ctm2dict(packagerEdge.create_content_types_map([]))
109 assert ctm_dict['defaults'] == {}
110 assert ctm_dict['overrides'] == {}
111
112
113 def test_full_content_types_map():
114 filenames = ['no-extension', packagerEdge.MANIFEST, packagerEdge.BLOCKMAP]
115 filenames += ['file.' + x for x in 'json html js png css git otf'.split()]
116 ctm_dict = ctm2dict(packagerEdge.create_content_types_map(filenames))
117 assert ctm_dict['defaults'] == {
118 'css': 'text/css',
119 'html': 'text/html',
120 'js': 'application/javascript',
121 'json': 'application/json',
122 'otf': 'application/x-font-otf',
123 'png': 'image/png',
124 'xml': 'application/xml'
125 }
126 assert ctm_dict['overrides'] == {
127 '/AppxBlockMap.xml': 'application/vnd.ms-appx.blockmap+xml',
128 '/AppxManifest.xml': 'application/vnd.ms-appx.manifest+xml'
129 }
130
131
132 def test_create_appx_manifest(metadata, files):
133 manifest = packagerEdge.create_appx_manifest(
134 {'metadata': metadata}, files, release_build=True,
135 )
86 with open(os.path.join(TEST_DIR, 'AppManifest.xml.expect')) as fp: 136 with open(os.path.join(TEST_DIR, 'AppManifest.xml.expect')) as fp:
87 manifest_expect = fp.read() 137 manifest_expect = fp.read()
88 assert manifest.strip() == manifest_expect.strip() 138 assert manifest.strip() == manifest_expect.strip()
89 139
90 140
91 def test_convert_to_appx(): 141 def test_create_devbuild_appx_manifest(metadata, files):
142 manifest = packagerEdge.create_appx_manifest(
143 {'metadata': metadata}, files, release_build=False,
144 )
145 assert 'devbuild-marker' in manifest
146
147
148 def test_move_files_to_extension():
92 files = packager.Files(set(), set()) 149 files = packager.Files(set(), set())
93 files['foo.xml'] = CHARS 150 files['foo.xml'] = CHARS
94 files['foo/bar.xml'] = CHARS 151 files['foo/bar.xml'] = CHARS
95 packagerEdge.convertToAppx(files) 152 files['Extension/foo.xml'] = CHARS
153 packagerEdge.move_files_to_extension(files)
96 assert set(files.keys()) == { 154 assert set(files.keys()) == {
97 'Extension/foo.xml', 155 'Extension/foo.xml',
98 'Extension/foo/bar.xml', 156 'Extension/foo/bar.xml',
99 '[Content_Types].xml' 157 'Extension/Extension/foo.xml'
100 } 158 }
101
102
103 def test_edge_files_zip():
104 """Test zip conversion of EdgeFiles that is overriden."""
105 files = packagerEdge.Files(set(), set())
106 files['Foo.xml'] = CHARS
107 files['bar.xml'] = CHARS
108 buffer = io.BytesIO()
109 files.zip(buffer, sortKey=lambda name: name.lower())
110 result = zipfile.ZipFile(buffer)
111 assert result.getinfo('Foo.xml').compress_type == zipfile.ZIP_STORED
112 assert result.namelist() == ['bar.xml', 'Foo.xml', 'AppxBlockMap.xml']
113 159
114 160
115 def test_create_build(tmpdir, srcdir): 161 def test_create_build(tmpdir, srcdir):
116 out_file = str(tmpdir.join('abp.appx')) 162 out_file = str(tmpdir.join('abp.appx'))
117 packagerEdge.createBuild(str(srcdir), outFile=out_file) 163 packagerEdge.createBuild(str(srcdir), outFile=out_file, releaseBuild=True)
118 appx = zipfile.ZipFile(out_file) 164 appx = zipfile.ZipFile(out_file)
119 165
120 names = set(appx.namelist()) 166 names = set(appx.namelist())
121 assert 'AppxManifest.xml' in names 167 assert 'AppxManifest.xml' in names
122 assert 'AppxBlockMap.xml' in names 168 assert 'AppxBlockMap.xml' in names
123 assert '[Content_Types].xml' in names 169 assert '[Content_Types].xml' in names
124 170
171 assert 'devbuild-marker' not in appx.read('AppxManifest.xml')
125 assert appx.read('Assets/logo_44.png') == '44' 172 assert appx.read('Assets/logo_44.png') == '44'
126 assert appx.read('Extension/icons/abp-44.png') == '44' 173 assert appx.read('Extension/icons/abp-44.png') == '44'
174
175
176 def test_create_devbuild(tmpdir, srcdir):
177 out_file = str(tmpdir.join('abp.appx'))
178 packagerEdge.createBuild(str(srcdir), outFile=out_file, releaseBuild=False)
179 appx = zipfile.ZipFile(out_file)
180 assert 'devbuild-marker' in appx.read('AppxManifest.xml')
LEFTRIGHT

Powered by Google App Engine
This is Rietveld