Bug 1807268 - Re-enable verifyShowClipboardSuggestionsToggleTest UI test r=jajohnson
[gecko.git] / netwerk / test / unit / test_cookiejars.js
blobaaf8832f62f02a42fcbffa4a3deed1e355921513
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/. */
5 /*
6  *  Test that channels with different LoadInfo
7  *  are stored in separate namespaces ("cookie jars")
8  */
10 "use strict";
12 ChromeUtils.defineLazyGetter(this, "URL", function () {
13   return "http://localhost:" + httpserver.identity.primaryPort;
14 });
16 const { HttpServer } = ChromeUtils.importESModule(
17   "resource://testing-common/httpd.sys.mjs"
20 var httpserver = new HttpServer();
22 var cookieSetPath = "/setcookie";
23 var cookieCheckPath = "/checkcookie";
25 function inChildProcess() {
26   return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
29 // Test array:
30 //  - element 0: name for cookie, used both to set and later to check
31 //  - element 1: loadInfo (determines cookie namespace)
33 // TODO: bug 722850: make private browsing work per-app, and add tests.  For now
34 // all values are 'false' for PB.
36 var tests = [
37   {
38     cookieName: "LCC_App0_BrowF_PrivF",
39     originAttributes: new OriginAttributes(0),
40   },
41   {
42     cookieName: "LCC_App1_BrowF_PrivF",
43     originAttributes: new OriginAttributes(1),
44   },
47 // test number: index into 'tests' array
48 var i = 0;
50 function setupChannel(path) {
51   var chan = NetUtil.newChannel({
52     uri: URL + path,
53     loadUsingSystemPrincipal: true,
54   });
55   chan.loadInfo.originAttributes = tests[i].originAttributes;
56   chan.QueryInterface(Ci.nsIHttpChannel);
58   let loadGroup = Cc["@mozilla.org/network/load-group;1"].createInstance(
59     Ci.nsILoadGroup
60   );
62   if (chan.loadInfo.originAttributes.privateBrowsingId == 0) {
63     loadGroup.notificationCallbacks = Cu.createLoadContext();
64     chan.loadGroup = loadGroup;
66     chan.notificationCallbacks = Cu.createLoadContext();
67   } else {
68     loadGroup.notificationCallbacks = Cu.createPrivateLoadContext();
69     chan.loadGroup = loadGroup;
71     chan.notificationCallbacks = Cu.createPrivateLoadContext();
72   }
74   return chan;
77 function setCookie() {
78   var channel = setupChannel(cookieSetPath);
79   channel.setRequestHeader("foo-set-cookie", tests[i].cookieName, false);
80   channel.asyncOpen(new ChannelListener(setNextCookie, null));
83 function setNextCookie() {
84   if (++i == tests.length) {
85     // all cookies set: switch to checking them
86     i = 0;
87     checkCookie();
88   } else {
89     info("setNextCookie:i=" + i);
90     setCookie();
91   }
94 // Open channel that should send one and only one correct Cookie: header to
95 // server, corresponding to it's namespace
96 function checkCookie() {
97   var channel = setupChannel(cookieCheckPath);
98   channel.asyncOpen(new ChannelListener(completeCheckCookie, null));
101 function completeCheckCookie(request) {
102   // Look for all cookies in what the server saw: fail if we see any besides the
103   // one expected cookie for each namespace;
104   var expectedCookie = tests[i].cookieName;
105   request.QueryInterface(Ci.nsIHttpChannel);
106   var cookiesSeen = request.getResponseHeader("foo-saw-cookies");
108   var j;
109   for (j = 0; j < tests.length; j++) {
110     var cookieToCheck = tests[j].cookieName;
111     let found = cookiesSeen.includes(cookieToCheck);
112     if (found && expectedCookie != cookieToCheck) {
113       do_throw(
114         "test index " +
115           i +
116           ": found unexpected cookie '" +
117           cookieToCheck +
118           "': in '" +
119           cookiesSeen +
120           "'"
121       );
122     } else if (!found && expectedCookie == cookieToCheck) {
123       do_throw(
124         "test index " +
125           i +
126           ": missing expected cookie '" +
127           expectedCookie +
128           "': in '" +
129           cookiesSeen +
130           "'"
131       );
132     }
133   }
134   // If we get here we're good.
135   info("Saw only correct cookie '" + expectedCookie + "'");
136   Assert.ok(true);
138   if (++i == tests.length) {
139     // end of tests
140     httpserver.stop(do_test_finished);
141   } else {
142     checkCookie();
143   }
146 function run_test() {
147   // Allow all cookies if the pref service is available in this process.
148   if (!inChildProcess()) {
149     Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
150     Services.prefs.setBoolPref(
151       "network.cookieJarSettings.unblocked_for_testing",
152       true
153     );
154   }
156   httpserver.registerPathHandler(cookieSetPath, cookieSetHandler);
157   httpserver.registerPathHandler(cookieCheckPath, cookieCheckHandler);
158   httpserver.start(-1);
160   setCookie();
161   do_test_pending();
164 function cookieSetHandler(metadata, response) {
165   var cookieName = metadata.getHeader("foo-set-cookie");
167   response.setStatusLine(metadata.httpVersion, 200, "Ok");
168   response.setHeader("Set-Cookie", cookieName + "=1; Path=/", false);
169   response.setHeader("Content-Type", "text/plain");
170   response.bodyOutputStream.write("Ok", "Ok".length);
173 function cookieCheckHandler(metadata, response) {
174   var cookies = metadata.getHeader("Cookie");
176   response.setStatusLine(metadata.httpVersion, 200, "Ok");
177   response.setHeader("foo-saw-cookies", cookies, false);
178   response.setHeader("Content-Type", "text/plain");
179   response.bodyOutputStream.write("Ok", "Ok".length);