diff options
Diffstat (limited to 'browser/base/content/test/caps/browser_principalSerialization_json.js')
-rw-r--r-- | browser/base/content/test/caps/browser_principalSerialization_json.js | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/browser/base/content/test/caps/browser_principalSerialization_json.js b/browser/base/content/test/caps/browser_principalSerialization_json.js new file mode 100644 index 0000000000..04afed1e2a --- /dev/null +++ b/browser/base/content/test/caps/browser_principalSerialization_json.js @@ -0,0 +1,164 @@ +"use strict"; + +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +/* + This test file exists to ensure whenever changes to principal serialization happens, + we guarantee that the data can be restored and generated into a new principal. + + The tests are written to be brittle so we encode all versions of the changes into the tests. +*/ + +add_task(async function test_nullPrincipal() { + const nullId = "0"; + // fields + const uri = 0; + const suffix = 1; + + const nullReplaceRegex = /moz-nullprincipal:{[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}}/; + const NULL_REPLACE = "NULL_PRINCIPAL_URL"; + + /* + This test should NOT be resilient to changes in versioning, + however it exists purely to verify the code doesn't unintentionally change without updating versioning and migration code. + */ + let tests = [ + { + input: { OA: {} }, + expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`, + }, + { + input: { OA: {} }, + expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`, + }, + { + input: { OA: { userContextId: 0 } }, + expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`, + }, + { + input: { OA: { userContextId: 2 } }, + expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}","${suffix}":"^userContextId=2"}}`, + }, + { + input: { OA: { privateBrowsingId: 1 } }, + expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}","${suffix}":"^privateBrowsingId=1"}}`, + }, + { + input: { OA: { privateBrowsingId: 0 } }, + expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`, + }, + ]; + + for (let test of tests) { + let p = Services.scriptSecurityManager.createNullPrincipal(test.input.OA); + let sp = E10SUtils.serializePrincipal(p); + // Not sure why cppjson is adding a \n here + let spr = atob(sp).replace(nullReplaceRegex, NULL_REPLACE); + is( + test.expected, + spr, + "Expected serialized object for " + JSON.stringify(test.input) + ); + let dp = E10SUtils.deserializePrincipal(sp); + + // Check all the origin attributes + for (let key in test.input.OA) { + is( + dp.originAttributes[key], + test.input.OA[key], + "Ensure value of " + key + " is " + test.input.OA[key] + ); + } + } +}); + +add_task(async function test_contentPrincipal() { + const contentId = "1"; + // fields + const content = 0; + // const domain = 1; + const suffix = 2; + // const csp = 3; + + /* + This test should NOT be resilient to changes in versioning, + however it exists purely to verify the code doesn't unintentionally change without updating versioning and migration code. + */ + let tests = [ + { + input: { uri: "http://example.com/", OA: {} }, + expected: `{"${contentId}":{"${content}":"http://example.com/"}}`, + }, + { + input: { uri: "http://mozilla1.com/", OA: {} }, + expected: `{"${contentId}":{"${content}":"http://mozilla1.com/"}}`, + }, + { + input: { uri: "http://mozilla2.com/", OA: { userContextId: 0 } }, + expected: `{"${contentId}":{"${content}":"http://mozilla2.com/"}}`, + }, + { + input: { uri: "http://mozilla3.com/", OA: { userContextId: 2 } }, + expected: `{"${contentId}":{"${content}":"http://mozilla3.com/","${suffix}":"^userContextId=2"}}`, + }, + { + input: { uri: "http://mozilla4.com/", OA: { privateBrowsingId: 1 } }, + expected: `{"${contentId}":{"${content}":"http://mozilla4.com/","${suffix}":"^privateBrowsingId=1"}}`, + }, + { + input: { uri: "http://mozilla5.com/", OA: { privateBrowsingId: 0 } }, + expected: `{"${contentId}":{"${content}":"http://mozilla5.com/"}}`, + }, + ]; + + for (let test of tests) { + let uri = Services.io.newURI(test.input.uri); + let p = Services.scriptSecurityManager.createContentPrincipal( + uri, + test.input.OA + ); + let sp = E10SUtils.serializePrincipal(p); + is( + test.expected, + atob(sp), + "Expected serialized object for " + test.input.uri + ); + is( + btoa(test.expected), + sp, + "Expected serialized string for " + test.input.uri + ); + let dp = E10SUtils.deserializePrincipal(sp); + is(dp.URI.spec, test.input.uri, "Ensure spec is the same"); + + // Check all the origin attributes + for (let key in test.input.OA) { + is( + dp.originAttributes[key], + test.input.OA[key], + "Ensure value of " + key + " is " + test.input.OA[key] + ); + } + } +}); + +add_task(async function test_systemPrincipal() { + const systemId = "3"; + /* + This test should NOT be resilient to changes in versioning, + however it exists purely to verify the code doesn't unintentionally change without updating versioning and migration code. + */ + const expected = `{"${systemId}":{}}`; + + let p = Services.scriptSecurityManager.getSystemPrincipal(); + let sp = E10SUtils.serializePrincipal(p); + is(expected, atob(sp), "Expected serialized object for system principal"); + is(btoa(expected), sp, "Expected serialized string for system principal"); + let dp = E10SUtils.deserializePrincipal(sp); + is( + dp, + Services.scriptSecurityManager.getSystemPrincipal(), + "Deserialized the system principal" + ); +}); |