forked from mirrors/gecko-dev
		
	Differential Revision: https://phabricator.services.mozilla.com/D35504 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			164 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"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"
 | 
						|
  );
 | 
						|
});
 |