forked from mirrors/gecko-dev
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()
|