test_ASRouterTargeting_snapshot.js (4040B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ 3 */ 4 5 "use strict"; 6 7 const { ASRouterTargeting } = ChromeUtils.importESModule( 8 "resource:///modules/asrouter/ASRouterTargeting.sys.mjs" 9 ); 10 11 add_task(async function should_ignore_rejections() { 12 let target = { 13 get foo() { 14 return new Promise(resolve => resolve(1)); 15 }, 16 17 get bar() { 18 return new Promise((resolve, reject) => reject(new Error("unspecified"))); 19 }, 20 }; 21 22 let snapshot = await ASRouterTargeting.getEnvironmentSnapshot({ 23 targets: [target], 24 }); 25 Assert.deepEqual(snapshot, { environment: { foo: 1 }, version: 1 }); 26 }); 27 28 add_task(async function nested_objects() { 29 const target = { 30 get foo() { 31 return Promise.resolve("foo"); 32 }, 33 get bar() { 34 return Promise.reject(new Error("bar")); 35 }, 36 baz: { 37 get qux() { 38 return Promise.resolve("qux"); 39 }, 40 get quux() { 41 return Promise.reject(new Error("quux")); 42 }, 43 get corge() { 44 return { 45 get grault() { 46 return Promise.resolve("grault"); 47 }, 48 get garply() { 49 return Promise.reject(new Error("garply")); 50 }, 51 }; 52 }, 53 }, 54 }; 55 56 const snapshot = await ASRouterTargeting.getEnvironmentSnapshot({ 57 targets: [target], 58 }); 59 Assert.deepEqual( 60 snapshot, 61 { 62 environment: { 63 foo: "foo", 64 baz: { 65 qux: "qux", 66 corge: { 67 grault: "grault", 68 }, 69 }, 70 }, 71 version: 1, 72 }, 73 "getEnvironmentSnapshot should resolve nested promises" 74 ); 75 }); 76 77 add_task(async function arrays() { 78 const target = { 79 foo: [1, 2, 3], 80 bar: [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)], 81 baz: Promise.resolve([1, 2, 3]), 82 qux: Promise.resolve([ 83 Promise.resolve(1), 84 Promise.resolve(2), 85 Promise.resolve(3), 86 ]), 87 quux: Promise.resolve({ 88 corge: [Promise.resolve(1), 2, 3], 89 }), 90 }; 91 92 const snapshot = await ASRouterTargeting.getEnvironmentSnapshot({ 93 targets: [target], 94 }); 95 Assert.deepEqual( 96 snapshot, 97 { 98 environment: { 99 foo: [1, 2, 3], 100 bar: [1, 2, 3], 101 baz: [1, 2, 3], 102 qux: [1, 2, 3], 103 quux: { corge: [1, 2, 3] }, 104 }, 105 version: 1, 106 }, 107 "getEnvironmentSnapshot should resolve arrays correctly" 108 ); 109 }); 110 111 add_task(async function target_order() { 112 let target1 = { 113 foo: 1, 114 bar: 1, 115 baz: 1, 116 }; 117 118 let target2 = { 119 foo: 2, 120 bar: 2, 121 }; 122 123 let target3 = { 124 foo: 3, 125 }; 126 127 // target3 supercedes target2; both supercede target1. 128 let snapshot = await ASRouterTargeting.getEnvironmentSnapshot({ 129 targets: [target3, target2, target1], 130 }); 131 Assert.deepEqual(snapshot, { 132 environment: { foo: 3, bar: 2, baz: 1 }, 133 version: 1, 134 }); 135 }); 136 137 /* 138 * NB: This test is last because it manipulates shutdown phases. 139 * 140 * Adding tests after this one will result in failures. 141 */ 142 add_task(async function should_ignore_rejections() { 143 // The order that `ASRouterTargeting.getEnvironmentSnapshot` 144 // enumerates the target object matters here, but it's guaranteed to 145 // be consistent by the `for ... in` ordering: see 146 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in#description. 147 let target = { 148 get foo() { 149 return new Promise(resolve => resolve(1)); 150 }, 151 152 get bar() { 153 return new Promise(resolve => { 154 // Pretend that we're about to shut down. 155 Services.startup.advanceShutdownPhase( 156 Services.startup.SHUTDOWN_PHASE_APPSHUTDOWN 157 ); 158 resolve(2); 159 }); 160 }, 161 162 get baz() { 163 return new Promise(resolve => resolve(3)); 164 }, 165 }; 166 167 let snapshot = await ASRouterTargeting.getEnvironmentSnapshot({ 168 targets: [target], 169 }); 170 // `baz` is dropped since we're shutting down by the time it's processed. 171 Assert.deepEqual(snapshot, { environment: { foo: 1, bar: 2 }, version: 1 }); 172 });