rename from browser/components/enterprisepolicies/tests/browser/browser_policies_validate_and_parse_API.js
rename to toolkit/components/utils/test/browser/browser_JsonSchemaValidator.js
--- a/browser/components/enterprisepolicies/tests/browser/browser_policies_validate_and_parse_API.js
+++ b/toolkit/components/utils/test/browser/browser_JsonSchemaValidator.js
@@ -1,226 +1,222 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
-/* This file will test the parameters parsing and validation directly through
- the PoliciesValidator API.
- */
-
-const { PoliciesValidator } = ChromeUtils.import("resource:///modules/policies/PoliciesValidator.jsm", {});
+ChromeUtils.import("resource://gre/modules/components-utils/JsonSchemaValidator.jsm", this);
add_task(async function test_boolean_values() {
let schema = {
type: "boolean"
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(true, schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(true, schema);
ok(valid && parsed === true, "Parsed boolean value correctly");
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(false, schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(false, schema);
ok(valid && parsed === false, "Parsed boolean value correctly");
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(0, schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(0, schema);
ok(valid && parsed === false, "0 parsed as false correctly");
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(1, schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(1, schema);
ok(valid && parsed === true, "1 parsed as true correctly");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters("0", schema)[0], "No type coercion");
- ok(!PoliciesValidator.validateAndParseParameters("true", schema)[0], "No type coercion");
- ok(!PoliciesValidator.validateAndParseParameters(2, schema)[0], "Other number values are not valid");
- ok(!PoliciesValidator.validateAndParseParameters(undefined, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters("0", schema)[0], "No type coercion");
+ ok(!JsonSchemaValidator.validateAndParseParameters("true", schema)[0], "No type coercion");
+ ok(!JsonSchemaValidator.validateAndParseParameters(2, schema)[0], "Other number values are not valid");
+ ok(!JsonSchemaValidator.validateAndParseParameters(undefined, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
});
add_task(async function test_number_values() {
let schema = {
type: "number"
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(1, schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(1, schema);
ok(valid && parsed === 1, "Parsed number value correctly");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters("1", schema)[0], "No type coercion");
- ok(!PoliciesValidator.validateAndParseParameters(true, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters("1", schema)[0], "No type coercion");
+ ok(!JsonSchemaValidator.validateAndParseParameters(true, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
});
add_task(async function test_integer_values() {
// Integer is an alias for number
let schema = {
type: "integer"
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(1, schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(1, schema);
ok(valid && parsed == 1, "Parsed integer value correctly");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters("1", schema)[0], "No type coercion");
- ok(!PoliciesValidator.validateAndParseParameters(true, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters("1", schema)[0], "No type coercion");
+ ok(!JsonSchemaValidator.validateAndParseParameters(true, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
});
add_task(async function test_string_values() {
let schema = {
type: "string"
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters("foobar", schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters("foobar", schema);
ok(valid && parsed == "foobar", "Parsed string value correctly");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters(1, schema)[0], "No type coercion");
- ok(!PoliciesValidator.validateAndParseParameters(true, schema)[0], "No type coercion");
- ok(!PoliciesValidator.validateAndParseParameters(undefined, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
- ok(!PoliciesValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(1, schema)[0], "No type coercion");
+ ok(!JsonSchemaValidator.validateAndParseParameters(true, schema)[0], "No type coercion");
+ ok(!JsonSchemaValidator.validateAndParseParameters(undefined, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
});
add_task(async function test_URL_values() {
let schema = {
type: "URL"
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters("https://www.example.com/foo#bar", schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters("https://www.example.com/foo#bar", schema);
ok(valid, "URL is valid");
ok(parsed instanceof Ci.nsIURI, "parsed is a nsIURI");
is(parsed.prePath, "https://www.example.com", "prePath is correct");
is(parsed.pathQueryRef, "/foo#bar", "pathQueryRef is correct");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters("", schema)[0], "Empty string is not accepted for URL");
- ok(!PoliciesValidator.validateAndParseParameters("www.example.com", schema)[0], "Scheme is required for URL");
- ok(!PoliciesValidator.validateAndParseParameters("https://:!$%", schema)[0], "Invalid URL");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters("", schema)[0], "Empty string is not accepted for URL");
+ ok(!JsonSchemaValidator.validateAndParseParameters("www.example.com", schema)[0], "Scheme is required for URL");
+ ok(!JsonSchemaValidator.validateAndParseParameters("https://:!$%", schema)[0], "Invalid URL");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
});
add_task(async function test_URLorEmpty_values() {
let schema = {
type: "URLorEmpty"
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters("https://www.example.com/foo#bar", schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters("https://www.example.com/foo#bar", schema);
ok(valid, "URL is valid");
ok(parsed instanceof Ci.nsIURI, "parsed is a nsIURI");
is(parsed.prePath, "https://www.example.com", "prePath is correct");
is(parsed.pathQueryRef, "/foo#bar", "pathQueryRef is correct");
// Test that this type also accept empty strings
- [valid, parsed] = PoliciesValidator.validateAndParseParameters("", schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters("", schema);
ok(valid, "URLorEmpty is valid");
ok(!parsed, "parsed value is falsy");
is(typeof(parsed), "string", "parsed is a string");
is(parsed, "", "parsed is an empty string");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters(" ", schema)[0], "Non-empty string is not accepted");
- ok(!PoliciesValidator.validateAndParseParameters("www.example.com", schema)[0], "Scheme is required for URL");
- ok(!PoliciesValidator.validateAndParseParameters("https://:!$%", schema)[0], "Invalid URL");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(" ", schema)[0], "Non-empty string is not accepted");
+ ok(!JsonSchemaValidator.validateAndParseParameters("www.example.com", schema)[0], "Scheme is required for URL");
+ ok(!JsonSchemaValidator.validateAndParseParameters("https://:!$%", schema)[0], "Invalid URL");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
});
add_task(async function test_origin_values() {
// Origin is a URL that doesn't contain a path/query string (i.e., it's only scheme + host + port)
let schema = {
type: "origin"
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters("https://www.example.com", schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters("https://www.example.com", schema);
ok(valid, "Origin is valid");
ok(parsed instanceof Ci.nsIURI, "parsed is a nsIURI");
is(parsed.prePath, "https://www.example.com", "prePath is correct");
is(parsed.pathQueryRef, "/", "pathQueryRef is corect");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters("https://www.example.com/foobar", schema)[0], "Origin cannot contain a path part");
- ok(!PoliciesValidator.validateAndParseParameters("https://:!$%", schema)[0], "Invalid origin");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters("https://www.example.com/foobar", schema)[0], "Origin cannot contain a path part");
+ ok(!JsonSchemaValidator.validateAndParseParameters("https://:!$%", schema)[0], "Invalid origin");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
});
add_task(async function test_array_values() {
// The types inside an array object must all be the same
let schema = {
type: "array",
items: {
type: "number"
}
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters([1, 2, 3], schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters([1, 2, 3], schema);
ok(valid, "Array is valid");
ok(Array.isArray(parsed), "parsed is an array");
is(parsed.length, 3, "array is correct");
// An empty array is also valid
- [valid, parsed] = PoliciesValidator.validateAndParseParameters([], schema);
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters([], schema);
ok(valid, "Array is valid");
ok(Array.isArray(parsed), "parsed is an array");
is(parsed.length, 0, "array is correct");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters([1, true, 3], schema)[0], "Mixed types");
- ok(!PoliciesValidator.validateAndParseParameters(2, schema)[0], "Type is correct but not in an array");
- ok(!PoliciesValidator.validateAndParseParameters({}, schema)[0], "Object is not an array");
+ ok(!JsonSchemaValidator.validateAndParseParameters([1, true, 3], schema)[0], "Mixed types");
+ ok(!JsonSchemaValidator.validateAndParseParameters(2, schema)[0], "Type is correct but not in an array");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Object is not an array");
});
add_task(async function test_object_values() {
let schema = {
type: "object",
properties: {
url: {
type: "URL"
},
title: {
type: "string"
}
}
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(
{
url: "https://www.example.com/foo#bar",
title: "Foo",
alias: "Bar"
},
schema);
ok(valid, "Object is valid");
ok(typeof(parsed) == "object", "parsed in an object");
ok(parsed.url instanceof Ci.nsIURI, "types inside the object are also parsed");
is(parsed.url.spec, "https://www.example.com/foo#bar", "URL was correctly parsed");
is(parsed.title, "Foo", "title was correctly parsed");
is(parsed.alias, undefined, "property not described in the schema is not present in the parsed object");
// Invalid values:
- ok(!PoliciesValidator.validateAndParseParameters(
+ ok(!JsonSchemaValidator.validateAndParseParameters(
{
url: "https://www.example.com/foo#bar",
title: 3,
},
schema)[0], "Mismatched type for title");
- ok(!PoliciesValidator.validateAndParseParameters(
+ ok(!JsonSchemaValidator.validateAndParseParameters(
{
url: "www.example.com",
title: 3,
},
schema)[0], "Invalid URL inside the object");
});
add_task(async function test_array_of_objects() {
@@ -236,17 +232,17 @@ add_task(async function test_array_of_ob
title: {
type: "string"
}
}
}
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters(
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(
[{
url: "https://www.example.com/bookmark1",
title: "Foo",
},
{
url: "https://www.example.com/bookmark2",
title: "Bar",
}],
@@ -280,17 +276,17 @@ add_task(async function test_missing_arr
type: "boolean"
}
}
}
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters({
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters({
allow: [true, true, true]
}, schema);
ok(valid, "Object is valid");
is(parsed.allow.length, 3, "Allow array is correct.");
is(parsed.block, undefined, "Block array is undefined, as expected.");
});
@@ -305,23 +301,71 @@ add_task(async function test_required_vs
"required-property": {
type: "number"
}
},
required: ["required-property"]
};
let valid, parsed;
- [valid, parsed] = PoliciesValidator.validateAndParseParameters({
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters({
"required-property": 5
}, schema);
ok(valid, "Object is valid since required property is present");
is(parsed["required-property"], 5, "required property is correct");
is(parsed["non-required-property"], undefined, "non-required property is undefined, as expected");
- [valid, parsed] = PoliciesValidator.validateAndParseParameters({
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters({
"non-required-property": 5
}, schema);
ok(!valid, "Object is not valid since the required property is missing");
is(parsed, null, "Nothing was returned as parsed");
});
+
+add_task(async function test_number_or_string_values() {
+ let schema = {
+ type: ["number", "string"],
+ };
+
+ let valid, parsed;
+ // valid values
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(1, schema);
+ ok(valid && parsed === 1, "Parsed number value correctly");
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters("foobar", schema);
+ ok(valid && parsed === "foobar", "Parsed string value correctly");
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters("1", schema);
+ ok(valid && parsed === "1", "Did not coerce string to number");
+
+ // Invalid values:
+ ok(!JsonSchemaValidator.validateAndParseParameters(true, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
+});
+
+add_task(async function test_number_or_array_values() {
+ let schema = {
+ type: ["number", "array"],
+ items: {
+ type: "number",
+ }
+ };
+
+ let valid, parsed;
+ // valid values
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters(1, schema);
+ ok(valid, "Number is valid");
+ is(parsed, 1, "Parsed correctly");
+ ok(valid && parsed === 1, "Parsed number value correctly");
+
+ [valid, parsed] = JsonSchemaValidator.validateAndParseParameters([1, 2, 3], schema);
+ ok(valid, "Array is valid");
+ Assert.deepEqual(parsed, [1, 2, 3], "Parsed correctly");
+
+ // Invalid values:
+ ok(!JsonSchemaValidator.validateAndParseParameters(true, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters({}, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(null, schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters(["a", "b"], schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters([[]], schema)[0], "Invalid value");
+ ok(!JsonSchemaValidator.validateAndParseParameters([0, 1, [2, 3]], schema)[0], "Invalid value");
+});