forked from mirrors/gecko-dev
		
	 2a883bbb74
			
		
	
	
		2a883bbb74
		
	
	
	
	
		
			
			It seems that the changes introduced in python 3.3 (see https://peps.python.org/pep-0420/) made the previous workaround not needed anymore. Depends on D169964 Differential Revision: https://phabricator.services.mozilla.com/D170080
		
			
				
	
	
		
			215 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			215 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 json
 | |
| import os
 | |
| from textwrap import dedent
 | |
| 
 | |
| import helpers  # Import test helpers module.
 | |
| import mozunit
 | |
| import pytest
 | |
| 
 | |
| helpers.setup()
 | |
| 
 | |
| from GenerateWebIDLBindings import APIEvent, APIFunction, APINamespace, APIType, Schemas
 | |
| 
 | |
| 
 | |
| def test_parse_simple_single_api_namespace(write_jsonschema_fixtures):
 | |
|     """
 | |
|     Test Basic loading and parsing a single API JSONSchema:
 | |
|     - single line comments outside of the json structure are ignored
 | |
|     - parse a simple namespace that includes one permission, type,
 | |
|       function and event
 | |
|     """
 | |
|     schema_dir = write_jsonschema_fixtures(
 | |
|         {
 | |
|             "test_api.json": dedent(
 | |
|                 """
 | |
|           // Single line comments added before the JSON data are tolerated
 | |
|           // and ignored.
 | |
|           [
 | |
|             {
 | |
|               "namespace": "fantasyApi",
 | |
|               "permissions": ["fantasyPermission"],
 | |
|               "types": [
 | |
|                   {
 | |
|                     "id": "MyType",
 | |
|                     "type": "string",
 | |
|                     "choices": ["value1", "value2"]
 | |
|                   }
 | |
|               ],
 | |
|               "functions": [
 | |
|                 {
 | |
|                   "name": "myMethod",
 | |
|                   "type": "function",
 | |
|                   "parameters": [
 | |
|                     { "name": "fnParam", "type": "string" },
 | |
|                     { "name": "fnRefParam", "$ref": "MyType" }
 | |
|                   ]
 | |
|                 }
 | |
|               ],
 | |
|               "events": [
 | |
|                 {
 | |
|                   "name": "onSomeEvent",
 | |
|                   "type": "function",
 | |
|                   "parameters": [
 | |
|                      { "name": "evParam", "type": "string" },
 | |
|                      { "name": "evRefParam", "$ref": "MyType" }
 | |
|                   ]
 | |
|                 }
 | |
|               ]
 | |
|             }
 | |
|           ]
 | |
|         """
 | |
|             ),
 | |
|         }
 | |
|     )
 | |
| 
 | |
|     schemas = Schemas()
 | |
|     schemas.load_schemas(schema_dir, "toolkit")
 | |
| 
 | |
|     assert schemas.get_all_namespace_names() == ["fantasyApi"]
 | |
| 
 | |
|     apiNs = schemas.api_namespaces["fantasyApi"]
 | |
|     assert isinstance(apiNs, APINamespace)
 | |
| 
 | |
|     # Properties related to where the JSON schema is coming from
 | |
|     # (toolkit, browser or mobile schema directories).
 | |
|     assert apiNs.in_toolkit
 | |
|     assert not apiNs.in_browser
 | |
|     assert not apiNs.in_mobile
 | |
| 
 | |
|     # api_path_string is expected to be exactly the namespace name for
 | |
|     # non-nested API namespaces.
 | |
|     assert apiNs.api_path_string == "fantasyApi"
 | |
| 
 | |
|     # parse the schema and verify it includes the expected types events and function.
 | |
|     schemas.parse_schemas()
 | |
| 
 | |
|     assert set(["fantasyPermission"]) == apiNs.permissions
 | |
|     assert ["MyType"] == list(apiNs.types.keys())
 | |
|     assert ["myMethod"] == list(apiNs.functions.keys())
 | |
|     assert ["onSomeEvent"] == list(apiNs.events.keys())
 | |
| 
 | |
|     type_entry = apiNs.types.get("MyType")
 | |
|     fn_entry = apiNs.functions.get("myMethod")
 | |
|     ev_entry = apiNs.events.get("onSomeEvent")
 | |
| 
 | |
|     assert isinstance(type_entry, APIType)
 | |
|     assert isinstance(fn_entry, APIFunction)
 | |
|     assert isinstance(ev_entry, APIEvent)
 | |
| 
 | |
| 
 | |
| def test_parse_error_on_types_without_id_or_extend(
 | |
|     base_schema, write_jsonschema_fixtures
 | |
| ):
 | |
|     """
 | |
|     Test parsing types without id or $extend raise an error while parsing.
 | |
|     """
 | |
|     schema_dir = write_jsonschema_fixtures(
 | |
|         {
 | |
|             "test_broken_types.json": json.dumps(
 | |
|                 [
 | |
|                     {
 | |
|                         **base_schema(),
 | |
|                         "namespace": "testBrokenTypeAPI",
 | |
|                         "types": [
 | |
|                             {
 | |
|                                 # type with no "id2 or "$ref" properties
 | |
|                             }
 | |
|                         ],
 | |
|                     }
 | |
|                 ]
 | |
|             )
 | |
|         }
 | |
|     )
 | |
| 
 | |
|     schemas = Schemas()
 | |
|     schemas.load_schemas(schema_dir, "toolkit")
 | |
| 
 | |
|     with pytest.raises(
 | |
|         Exception,
 | |
|         match=r"Error loading schema type data defined in 'toolkit testBrokenTypeAPI'",
 | |
|     ):
 | |
|         schemas.parse_schemas()
 | |
| 
 | |
| 
 | |
| def test_parse_ignores_unsupported_types(base_schema, write_jsonschema_fixtures):
 | |
|     """
 | |
|     Test parsing types without id or $extend raise an error while parsing.
 | |
|     """
 | |
|     schema_dir = write_jsonschema_fixtures(
 | |
|         {
 | |
|             "test_broken_types.json": json.dumps(
 | |
|                 [
 | |
|                     {
 | |
|                         **base_schema(),
 | |
|                         "namespace": "testUnsupportedTypesAPI",
 | |
|                         "types": [
 | |
|                             {
 | |
|                                 "id": "AnUnsupportedType",
 | |
|                                 "type": "string",
 | |
|                                 "unsupported": True,
 | |
|                             },
 | |
|                             {
 | |
|                                 # missing id or $ref shouldn't matter
 | |
|                                 # no parsing error expected.
 | |
|                                 "unsupported": True,
 | |
|                             },
 | |
|                             {"id": "ASupportedType", "type": "string"},
 | |
|                         ],
 | |
|                     }
 | |
|                 ]
 | |
|             )
 | |
|         }
 | |
|     )
 | |
| 
 | |
|     schemas = Schemas()
 | |
|     schemas.load_schemas(schema_dir, "toolkit")
 | |
|     schemas.parse_schemas()
 | |
|     apiNs = schemas.api_namespaces["testUnsupportedTypesAPI"]
 | |
|     assert set(apiNs.types.keys()) == set(["ASupportedType"])
 | |
| 
 | |
| 
 | |
| def test_parse_error_on_namespace_with_inconsistent_max_manifest_version(
 | |
|     base_schema, write_jsonschema_fixtures, tmpdir
 | |
| ):
 | |
|     """
 | |
|     Test parsing types without id or $extend raise an error while parsing.
 | |
|     """
 | |
|     browser_schema_dir = os.path.join(tmpdir, "browser")
 | |
|     mobile_schema_dir = os.path.join(tmpdir, "mobile")
 | |
|     os.mkdir(browser_schema_dir)
 | |
|     os.mkdir(mobile_schema_dir)
 | |
| 
 | |
|     base_namespace_schema = {
 | |
|         **base_schema(),
 | |
|         "namespace": "testInconsistentMaxManifestVersion",
 | |
|     }
 | |
| 
 | |
|     browser_schema = {**base_namespace_schema, "max_manifest_version": 2}
 | |
|     mobile_schema = {**base_namespace_schema, "max_manifest_version": 3}
 | |
| 
 | |
|     write_jsonschema_fixtures(
 | |
|         {"test_inconsistent_maxmv.json": json.dumps([browser_schema])},
 | |
|         browser_schema_dir,
 | |
|     )
 | |
| 
 | |
|     write_jsonschema_fixtures(
 | |
|         {"test_inconsistent_maxmv.json": json.dumps([mobile_schema])}, mobile_schema_dir
 | |
|     )
 | |
| 
 | |
|     schemas = Schemas()
 | |
|     schemas.load_schemas(browser_schema_dir, "browser")
 | |
|     schemas.load_schemas(mobile_schema_dir, "mobile")
 | |
| 
 | |
|     with pytest.raises(
 | |
|         TypeError,
 | |
|         match=r"Error loading schema data - overwriting existing max_manifest_version value",
 | |
|     ):
 | |
|         schemas.parse_schemas()
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     mozunit.main()
 |