netwerk/test/unit/test_cookiejars.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/netwerk/test/unit/test_cookiejars.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,149 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +/*
     1.9 + *  Test that channels with different
    1.10 + *  AppIds/inBrowserElements/usePrivateBrowsing (from nsILoadContext callback)
    1.11 + *  are stored in separate namespaces ("cookie jars")
    1.12 + */ 
    1.13 +
    1.14 +XPCOMUtils.defineLazyGetter(this, "URL", function() {
    1.15 +  return "http://localhost:" + httpserver.identity.primaryPort;
    1.16 +});
    1.17 +
    1.18 +Cu.import("resource://testing-common/httpd.js");
    1.19 +Cu.import("resource://gre/modules/Services.jsm");
    1.20 +var httpserver = new HttpServer();
    1.21 +
    1.22 +var cookieSetPath = "/setcookie";
    1.23 +var cookieCheckPath = "/checkcookie";
    1.24 +
    1.25 +function inChildProcess() {
    1.26 +  return Cc["@mozilla.org/xre/app-info;1"]
    1.27 +           .getService(Ci.nsIXULRuntime)
    1.28 +           .processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
    1.29 +}
    1.30 +
    1.31 +// Test array:
    1.32 +//  - element 0: name for cookie, used both to set and later to check 
    1.33 +//  - element 1: loadContext (determines cookie namespace)
    1.34 +//
    1.35 +// TODO: bug 722850: make private browsing work per-app, and add tests.  For now
    1.36 +// all values are 'false' for PB.
    1.37 +
    1.38 +var tests = [
    1.39 +  { cookieName: 'LCC_App0_BrowF_PrivF', 
    1.40 +    loadContext: new LoadContextCallback(0, false, false, 1) }, 
    1.41 +  { cookieName: 'LCC_App0_BrowT_PrivF', 
    1.42 +    loadContext: new LoadContextCallback(0, true,  false, 1) }, 
    1.43 +  { cookieName: 'LCC_App1_BrowF_PrivF', 
    1.44 +    loadContext: new LoadContextCallback(1, false, false, 1) }, 
    1.45 +  { cookieName: 'LCC_App1_BrowT_PrivF', 
    1.46 +    loadContext: new LoadContextCallback(1, true,  false, 1) }, 
    1.47 +];
    1.48 +
    1.49 +// test number: index into 'tests' array
    1.50 +var i = 0;
    1.51 +
    1.52 +function setupChannel(path)
    1.53 +{
    1.54 +  var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
    1.55 +  var chan = ios.newChannel(URL + path, "", null);
    1.56 +  chan.notificationCallbacks = tests[i].loadContext;
    1.57 +  chan.QueryInterface(Ci.nsIHttpChannel);
    1.58 +  return chan;
    1.59 +}
    1.60 +
    1.61 +function setCookie() {
    1.62 +  var channel = setupChannel(cookieSetPath);
    1.63 +  channel.setRequestHeader("foo-set-cookie", tests[i].cookieName, false);
    1.64 +  channel.asyncOpen(new ChannelListener(setNextCookie, null), null);
    1.65 +}
    1.66 +
    1.67 +function setNextCookie(request, data, context) 
    1.68 +{
    1.69 +  if (++i == tests.length) {
    1.70 +    // all cookies set: switch to checking them
    1.71 +    i = 0;
    1.72 +    checkCookie();
    1.73 +  } else {
    1.74 +    do_print("setNextCookie:i=" + i);
    1.75 +    setCookie();
    1.76 +  }
    1.77 +}
    1.78 +
    1.79 +// Open channel that should send one and only one correct Cookie: header to
    1.80 +// server, corresponding to it's namespace
    1.81 +function checkCookie()
    1.82 +{
    1.83 +  var channel = setupChannel(cookieCheckPath);
    1.84 +  channel.asyncOpen(new ChannelListener(completeCheckCookie, null), null);
    1.85 +}
    1.86 +
    1.87 +function completeCheckCookie(request, data, context) {
    1.88 +  // Look for all cookies in what the server saw: fail if we see any besides the
    1.89 +  // one expected cookie for each namespace;
    1.90 +  var expectedCookie = tests[i].cookieName;
    1.91 +  request.QueryInterface(Ci.nsIHttpChannel);
    1.92 +  var cookiesSeen = request.getResponseHeader("foo-saw-cookies");
    1.93 +
    1.94 +  var j;
    1.95 +  for (j = 0; j < tests.length; j++) {
    1.96 +    var cookieToCheck = tests[j].cookieName;
    1.97 +    found = (cookiesSeen.indexOf(cookieToCheck) != -1);
    1.98 +    if (found && expectedCookie != cookieToCheck) {
    1.99 +      do_throw("test index " + i + ": found unexpected cookie '" 
   1.100 +          + cookieToCheck + "': in '" + cookiesSeen + "'");
   1.101 +    } else if (!found && expectedCookie == cookieToCheck) {
   1.102 +      do_throw("test index " + i + ": missing expected cookie '" 
   1.103 +          + expectedCookie + "': in '" + cookiesSeen + "'");
   1.104 +    }
   1.105 +  }
   1.106 +  // If we get here we're good.
   1.107 +  do_print("Saw only correct cookie '" + expectedCookie + "'");
   1.108 +  do_check_true(true);
   1.109 +
   1.110 +
   1.111 +  if (++i == tests.length) {
   1.112 +    // end of tests
   1.113 +    httpserver.stop(do_test_finished);
   1.114 +  } else {
   1.115 +    checkCookie();
   1.116 +  }
   1.117 +}
   1.118 +
   1.119 +function run_test()
   1.120 +{
   1.121 +  // Allow all cookies if the pref service is available in this process.
   1.122 +  if (!inChildProcess())
   1.123 +    Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
   1.124 +
   1.125 +  httpserver.registerPathHandler(cookieSetPath, cookieSetHandler);
   1.126 +  httpserver.registerPathHandler(cookieCheckPath, cookieCheckHandler);
   1.127 +  httpserver.start(-1);
   1.128 +
   1.129 +  setCookie();
   1.130 +  do_test_pending();
   1.131 +}
   1.132 +
   1.133 +function cookieSetHandler(metadata, response)
   1.134 +{
   1.135 +  var cookieName = metadata.getHeader("foo-set-cookie");
   1.136 +
   1.137 +  response.setStatusLine(metadata.httpVersion, 200, "Ok");
   1.138 +  response.setHeader("Set-Cookie", cookieName + "=1; Path=/", false);
   1.139 +  response.setHeader("Content-Type", "text/plain");
   1.140 +  response.bodyOutputStream.write("Ok", "Ok".length);
   1.141 +}
   1.142 +
   1.143 +function cookieCheckHandler(metadata, response)
   1.144 +{
   1.145 +  var cookies = metadata.getHeader("Cookie");
   1.146 +
   1.147 +  response.setStatusLine(metadata.httpVersion, 200, "Ok");
   1.148 +  response.setHeader("foo-saw-cookies", cookies, false);
   1.149 +  response.setHeader("Content-Type", "text/plain");
   1.150 +  response.bodyOutputStream.write("Ok", "Ok".length);
   1.151 +}
   1.152 +

mercurial