Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
/**
* Tests origin attributes partitionKey pattern matching.
*/
"use strict";
function testMatch(oa, pattern, shouldMatch = true) {
let msg = `Origin attributes should ${
shouldMatch ? "match" : "not match"
} pattern.`;
msg += ` oa: ${JSON.stringify(oa)} - pattern: ${JSON.stringify(pattern)}`;
Assert.equal(
ChromeUtils.originAttributesMatchPattern(oa, pattern),
shouldMatch,
msg
);
}
function getPartitionKey(scheme, baseDomain, port) {
if (!scheme || !baseDomain) {
return "";
}
return `(${scheme},${baseDomain}${port ? `,${port}` : ``})`;
}
function getOAWithPartitionKey(scheme, baseDomain, port, oa = {}) {
oa.partitionKey = getPartitionKey(scheme, baseDomain, port);
return oa;
}
/**
* Tests that an OriginAttributesPattern which is empty or only has an empty
* partitionKeyPattern matches any partitionKey.
*/
add_task(async function test_empty_pattern_matches_any() {
let list = [
getOAWithPartitionKey("https", "example.com"),
getOAWithPartitionKey("http", "example.net", 8080),
getOAWithPartitionKey(),
];
for (let oa of list) {
testMatch(oa, {});
testMatch(oa, { partitionKeyPattern: {} });
}
});
/**
* Tests that if a partitionKeyPattern is passed, but the partitionKey is
* invalid, the pattern match will always fail.
*/
add_task(async function test_invalid_pk() {
let list = [
"()",
"(,,)",
"(https)",
"(https,,)",
"(example.com)",
"(http,example.com,invalid)",
"(http,example.com,8000,1000)",
].map(partitionKey => ({ partitionKey }));
for (let oa of list) {
testMatch(oa, {});
testMatch(oa, { partitionKeyPattern: {} });
testMatch(
oa,
{ partitionKeyPattern: { baseDomain: "example.com" } },
false
);
testMatch(oa, { partitionKeyPattern: { scheme: "https" } }, false);
}
});
/**
* Tests that if a pattern sets "partitionKey" it takes precedence over "partitionKeyPattern".
*/
add_task(async function test_string_overwrites_pattern() {
let oa = getOAWithPartitionKey("https", "example.com", 8080, {
userContextId: 2,
});
testMatch(oa, { partitionKey: oa.partitionKey });
testMatch(oa, {
partitionKey: oa.partitionKey,
partitionKeyPattern: { baseDomain: "example.com" },
});
testMatch(oa, {
partitionKey: oa.partitionKey,
partitionKeyPattern: { baseDomain: "example.net" },
});
testMatch(
oa,
{
partitionKey: getPartitionKey("https", "example.net"),
partitionKeyPattern: { scheme: "https", baseDomain: "example.com" },
},
false
);
});
/**
* Tests that we can match parts of a partitionKey by setting
* partitionKeyPattern.
*/
add_task(async function test_pattern() {
let a = getOAWithPartitionKey("https", "example.com", 8080, {
userContextId: 2,
});
let b = getOAWithPartitionKey("https", "example.com", undefined, {
privateBrowsingId: 1,
});
for (let oa of [a, b]) {
// Match
testMatch(oa, { partitionKeyPattern: { scheme: "https" } });
testMatch(oa, {
partitionKeyPattern: { scheme: "https", baseDomain: "example.com" },
});
testMatch(
oa,
{
partitionKeyPattern: {
scheme: "https",
baseDomain: "example.com",
port: 8080,
},
},
oa == a
);
testMatch(oa, {
partitionKeyPattern: { baseDomain: "example.com" },
});
testMatch(
oa,
{
partitionKeyPattern: { port: 8080 },
},
oa == a
);
// Mismatch
testMatch(oa, { partitionKeyPattern: { scheme: "http" } }, false);
testMatch(
oa,
{ partitionKeyPattern: { baseDomain: "example.net" } },
false
);
testMatch(oa, { partitionKeyPattern: { port: 8443 } }, false);
testMatch(
oa,
{ partitionKeyPattern: { scheme: "https", baseDomain: "example.net" } },
false
);
}
});