test_channel_priority.js (2783B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ */ 4 5 "use strict"; 6 7 const { HttpServer } = ChromeUtils.importESModule( 8 "resource://testing-common/httpd.sys.mjs" 9 ); 10 11 let httpserver; 12 let port; 13 14 function startHttpServer() { 15 httpserver = new HttpServer(); 16 17 httpserver.registerPathHandler("/resource", (metadata, response) => { 18 response.setStatusLine(metadata.httpVersion, 200, "OK"); 19 response.setHeader("Content-Type", "text/plain", false); 20 response.setHeader("Cache-Control", "no-cache", false); 21 response.bodyOutputStream.write("data", 4); 22 }); 23 24 httpserver.registerPathHandler("/redirect", (metadata, response) => { 25 response.setStatusLine(metadata.httpVersion, 302, "Redirect"); 26 response.setHeader("Location", "/resource", false); 27 response.setHeader("Cache-Control", "no-cache", false); 28 }); 29 30 httpserver.start(-1); 31 port = httpserver.identity.primaryPort; 32 } 33 34 function stopHttpServer() { 35 httpserver.stop(() => {}); 36 } 37 38 function makeRequest(uri) { 39 let requestChannel = NetUtil.newChannel({ 40 uri, 41 loadUsingSystemPrincipal: true, 42 }); 43 requestChannel.QueryInterface(Ci.nsISupportsPriority); 44 requestChannel.priority = Ci.nsISupportsPriority.PRIORITY_HIGHEST; 45 requestChannel.asyncOpen(new ChannelListener(checkResponse, requestChannel)); 46 } 47 48 function checkResponse(request, buffer, requestChannel) { 49 requestChannel.QueryInterface(Ci.nsISupportsPriority); 50 Assert.equal( 51 requestChannel.priority, 52 Ci.nsISupportsPriority.PRIORITY_HIGHEST 53 ); 54 55 // the response channel can be different (if it was redirected) 56 let responseChannel = request.QueryInterface(Ci.nsISupportsPriority); 57 Assert.equal( 58 responseChannel.priority, 59 Ci.nsISupportsPriority.PRIORITY_HIGHEST 60 ); 61 62 run_next_test(); 63 } 64 65 add_test(function test_regular_request() { 66 makeRequest(`http://localhost:${port}/resource`); 67 }); 68 69 add_test(function test_redirect() { 70 makeRequest(`http://localhost:${port}/redirect`); 71 }); 72 73 function run_test() { 74 // jshint ignore:line 75 if (!runningInParent) { 76 // add a task to report test finished to parent process at the end of test queue, 77 // since do_register_cleanup is not available in child xpcshell test script. 78 add_test(function () { 79 do_send_remote_message("finished"); 80 run_next_test(); 81 }); 82 83 // waiting for parent process to assign server port via configPort() 84 return; 85 } 86 87 startHttpServer(); 88 registerCleanupFunction(stopHttpServer); 89 run_next_test(); 90 } 91 92 // This is used by unit_ipc/test_channel_priority_wrap.js for e10s XPCShell test 93 /* exported configPort */ 94 function configPort(serverPort) { 95 // jshint ignore:line 96 port = serverPort; 97 run_next_test(); 98 }