test_loadgroup_glean.js (4178B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const { NodeHTTP2Server } = ChromeUtils.importESModule( 8 "resource://testing-common/NodeServer.sys.mjs" 9 ); 10 11 const network = Glean.network; 12 13 const page_probes = [ 14 { name: "tlsHandshake", probe: network.tlsHandshake }, 15 { name: "dnsStart", probe: network.dnsStart }, 16 { name: "dnsEnd", probe: network.dnsEnd }, 17 { name: "tcpConnection", probe: network.tcpConnection }, 18 { name: "openToFirstSent", probe: network.openToFirstSent }, 19 { name: "firstSentToLastReceived", probe: network.firstSentToLastReceived }, 20 { name: "openToFirstReceived", probe: network.openToFirstReceived }, 21 { name: "completeLoad", probe: network.completeLoad }, 22 { name: "completeLoadNet", probe: network.completeLoadNet }, 23 ]; 24 25 const sub_probes = [ 26 { name: "subTlsHandshake", probe: network.subTlsHandshake }, 27 { name: "subDnsStart", probe: network.subDnsStart }, 28 { name: "subDnsEnd", probe: network.subDnsEnd }, 29 { name: "subTcpConnection", probe: network.subTcpConnection }, 30 { name: "subOpenToFirstSent", probe: network.subOpenToFirstSent }, 31 { 32 name: "subFirstSentToLastReceived", 33 probe: network.subFirstSentToLastReceived, 34 }, 35 { name: "subOpenToFirstReceived", probe: network.subOpenToFirstReceived }, 36 { name: "subCompleteLoad", probe: network.subCompleteLoad }, 37 { name: "subCompleteLoadNet", probe: network.subCompleteLoadNet }, 38 ]; 39 40 add_setup(function test_setup() { 41 Services.fog.initializeFOG(); 42 }); 43 44 registerCleanupFunction(() => { 45 Services.fog.testResetFOG(); 46 }); 47 48 async function test_loadgroup_glean_http2(page, probes) { 49 let loadGroup = Cc["@mozilla.org/network/load-group;1"].createInstance( 50 Ci.nsILoadGroup 51 ); 52 let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService( 53 Ci.nsIX509CertDB 54 ); 55 56 addCertFromFile(certdb, "http2-ca.pem", "CTu,u,u"); 57 58 Services.fog.testResetFOG(); 59 60 let server = new NodeHTTP2Server(); 61 await server.start(); 62 registerCleanupFunction(async () => { 63 await server.stop(); 64 }); 65 66 let loadListener = { 67 onStartRequest: () => {}, 68 onStopRequest: () => { 69 for (const { name, probe } of probes) { 70 info(`testing ${name}`); 71 const result = probe.testGetValue(); 72 // Ensure there are non-zero count, sum, and first value 73 Assert.less(0, result.count); 74 Assert.less(0, result.sum); 75 Assert.less(0, Object.values(result.values)[0]); 76 } 77 }, 78 QueryInterface: ChromeUtils.generateQI([ 79 "nsIRequestObserver", 80 "nsISupportsWeakReference", 81 ]), 82 }; 83 loadGroup.groupObserver = loadListener; 84 85 await server.registerPathHandler("/", (req, resp) => { 86 resp.writeHead(200); 87 resp.end("a".repeat(100)); 88 }); 89 let chan = NetUtil.newChannel({ 90 uri: `https://localhost:${server.port()}`, 91 loadUsingSystemPrincipal: true, 92 }).QueryInterface(Ci.nsIHttpChannel); 93 94 if (page) { 95 loadGroup.defaultLoadRequest = chan; 96 } else { 97 // Set mDefaultLoadRequest to a dummy channel when testing sub 98 await server.registerPathHandler("/dummy", (req, resp) => { 99 resp.writeHead(404); 100 resp.end(); 101 }); 102 let dummy = NetUtil.newChannel({ 103 uri: `https://localhost:${server.port()}/dummy`, 104 loadUsingSystemPrincipal: true, 105 }).QueryInterface(Ci.nsIHttpChannel); 106 loadGroup.defaultLoadRequest = dummy; 107 } 108 109 loadGroup.addRequest(chan, null); 110 await new Promise(resolve => { 111 chan.asyncOpen(new ChannelListener(resolve, null, CL_ALLOW_UNKNOWN_CL)); 112 }); 113 loadGroup.removeRequest(chan, null, Cr.NS_OK); 114 115 loadGroup = null; 116 117 Cu.forceCC(); 118 Cu.forceGC(); 119 120 const result = page 121 ? network.pageLoadSize.page.testGetValue() 122 : network.pageLoadSize.subresources.testGetValue(); 123 Assert.greater(result.sum, 100, "size should > 100"); 124 } 125 126 add_task(async function test_loadgroup_glean_http2_page() { 127 await test_loadgroup_glean_http2(true, page_probes); 128 }); 129 130 add_task(async function test_loadgroup_glean_http2_sub() { 131 await test_loadgroup_glean_http2(false, sub_probes); 132 });