mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	# ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D172359
		
			
				
	
	
		
			176 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# 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 os
 | 
						|
import unittest
 | 
						|
 | 
						|
import mozunit
 | 
						|
 | 
						|
from mozpack.chrome.manifest import (
 | 
						|
    MANIFESTS_TYPES,
 | 
						|
    Manifest,
 | 
						|
    ManifestBinaryComponent,
 | 
						|
    ManifestCategory,
 | 
						|
    ManifestComponent,
 | 
						|
    ManifestContent,
 | 
						|
    ManifestContract,
 | 
						|
    ManifestInterfaces,
 | 
						|
    ManifestLocale,
 | 
						|
    ManifestOverlay,
 | 
						|
    ManifestOverride,
 | 
						|
    ManifestResource,
 | 
						|
    ManifestSkin,
 | 
						|
    ManifestStyle,
 | 
						|
    parse_manifest,
 | 
						|
    parse_manifest_line,
 | 
						|
)
 | 
						|
from mozpack.errors import AccumulatedErrors, errors
 | 
						|
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/viewSource.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/viewSource.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()
 |