# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import unittest import mozunit import os from mozpack.chrome.manifest import ( ManifestContent, ManifestLocale, ManifestSkin, Manifest, ManifestResource, ManifestOverride, ManifestComponent, ManifestContract, ManifestInterfaces, ManifestBinaryComponent, ManifestCategory, ManifestStyle, ManifestOverlay, MANIFESTS_TYPES, parse_manifest, parse_manifest_line, ) from mozpack.errors import errors, AccumulatedErrors from test_errors import TestErrors class TestManifest(unittest.TestCase): def test_parse_manifest(self): manifest = [ 'content global content/global/', 'content global content/global/ application=foo application=bar' + ' platform', 'locale global en-US content/en-US/', 'locale global en-US content/en-US/ application=foo', 'skin global classic/1.0 content/skin/classic/', 'skin global classic/1.0 content/skin/classic/ application=foo' + ' os=WINNT', '', 'manifest pdfjs/chrome.manifest', 'resource gre-resources toolkit/res/', 'override chrome://global/locale/netError.dtd' + ' chrome://browser/locale/netError.dtd', '# Comment', 'component {b2bba4df-057d-41ea-b6b1-94a10a8ede68} foo.js', 'contract @mozilla.org/foo;1' + ' {b2bba4df-057d-41ea-b6b1-94a10a8ede68}', 'interfaces foo.xpt', 'binary-component bar.so', 'category command-line-handler m-browser' + ' @mozilla.org/browser/clh;1' + ' application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}', 'style chrome://global/content/customizeToolbar.xul' + ' chrome://browser/skin/', 'overlay chrome://global/content/viewSource.xul' + ' chrome://browser/content/viewSourceOverlay.xul', ] other_manifest = [ 'content global content/global/' ] expected_result = [ ManifestContent('', 'global', 'content/global/'), ManifestContent('', 'global', 'content/global/', 'application=foo', 'application=bar', 'platform'), ManifestLocale('', 'global', 'en-US', 'content/en-US/'), ManifestLocale('', 'global', 'en-US', 'content/en-US/', 'application=foo'), ManifestSkin('', 'global', 'classic/1.0', 'content/skin/classic/'), ManifestSkin('', 'global', 'classic/1.0', 'content/skin/classic/', 'application=foo', 'os=WINNT'), Manifest('', 'pdfjs/chrome.manifest'), ManifestResource('', 'gre-resources', 'toolkit/res/'), ManifestOverride('', 'chrome://global/locale/netError.dtd', 'chrome://browser/locale/netError.dtd'), ManifestComponent('', '{b2bba4df-057d-41ea-b6b1-94a10a8ede68}', 'foo.js'), ManifestContract('', '@mozilla.org/foo;1', '{b2bba4df-057d-41ea-b6b1-94a10a8ede68}'), ManifestInterfaces('', 'foo.xpt'), ManifestBinaryComponent('', 'bar.so'), ManifestCategory('', 'command-line-handler', 'm-browser', '@mozilla.org/browser/clh;1', 'application=' + '{ec8030f7-c20a-464f-9b0e-13a3a9e97384}'), ManifestStyle('', 'chrome://global/content/customizeToolbar.xul', 'chrome://browser/skin/'), ManifestOverlay('', 'chrome://global/content/viewSource.xul', 'chrome://browser/content/viewSourceOverlay.xul'), ] with mozunit.MockedOpen({'manifest': '\n'.join(manifest), 'other/manifest': '\n'.join(other_manifest)}): # Ensure we have tests for all types of manifests. self.assertEqual(set(type(e) for e in expected_result), set(MANIFESTS_TYPES.values())) self.assertEqual(list(parse_manifest(os.curdir, 'manifest')), expected_result) self.assertEqual(list(parse_manifest(os.curdir, 'other/manifest')), [ManifestContent('other', 'global', 'content/global/')]) def test_manifest_rebase(self): m = parse_manifest_line('chrome', 'content global content/global/') m = m.rebase('') self.assertEqual(str(m), 'content global chrome/content/global/') m = m.rebase('chrome') self.assertEqual(str(m), 'content global content/global/') m = parse_manifest_line('chrome/foo', 'content global content/global/') m = m.rebase('chrome') self.assertEqual(str(m), 'content global foo/content/global/') m = m.rebase('chrome/foo') self.assertEqual(str(m), 'content global content/global/') m = parse_manifest_line('modules/foo', 'resource foo ./') m = m.rebase('modules') self.assertEqual(str(m), 'resource foo foo/') m = m.rebase('modules/foo') self.assertEqual(str(m), 'resource foo ./') m = parse_manifest_line('chrome', 'content browser browser/content/') m = m.rebase('chrome/browser').move('jar:browser.jar!').rebase('') self.assertEqual(str(m), 'content browser jar:browser.jar!/content/') class TestManifestErrors(TestErrors, unittest.TestCase): def test_parse_manifest_errors(self): manifest = [ 'skin global classic/1.0 content/skin/classic/ platform', '', 'binary-component bar.so', 'unsupported foo', ] with mozunit.MockedOpen({'manifest': '\n'.join(manifest)}): with self.assertRaises(AccumulatedErrors): with errors.accumulate(): list(parse_manifest(os.curdir, 'manifest')) out = self.get_output() # Expecting 2 errors self.assertEqual(len(out), 2) path = os.path.abspath('manifest') # First on line 1 self.assertTrue(out[0].startswith('Error: %s:1: ' % path)) # Second on line 4 self.assertTrue(out[1].startswith('Error: %s:4: ' % path)) if __name__ == '__main__': mozunit.main()