"use strict";

const {HttpServer} = ChromeUtils.import("resource://testing-common/httpd.js");
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");


const TEST_DOMAIN = "www.example.com";
XPCOMUtils.defineLazyGetter(this, "URL", function() {
  return "http://" + TEST_DOMAIN +":" + httpserv.identity.primaryPort + "/path";
});

const responseBody1 = "response";
function requestHandler(metadata, response)
{
  response.setHeader("Content-Type", "text/plain");
  response.setHeader("Set-Cookie", "tom=cool; Max-Age=10", true);
  response.bodyOutputStream.write(responseBody1, responseBody1.length);
}

let httpserv = null;

function run_test() {
  httpserv = new HttpServer();
  httpserv.registerPathHandler("/path", requestHandler);
  httpserv.start(-1);
  httpserv.identity.add("http", TEST_DOMAIN, httpserv.identity.primaryPort);

  registerCleanupFunction(() => {
    Services.cookies.removeCookiesWithOriginAttributes("{}", TEST_DOMAIN);
    Services.prefs.clearUserPref("network.dns.localDomains");
    Services.prefs.clearUserPref("network.cookie.cookieBehavior");
    Services.prefs.clearUserPref("network.cookieSettings.unblocked_for_testing");

    httpserv.stop();
    httpserv = null;
  });

  Services.prefs.setBoolPref("network.cookieSettings.unblocked_for_testing", true);
  Services.prefs.setCharPref("network.dns.localDomains", TEST_DOMAIN);
  Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
  Services.cookies.removeCookiesWithOriginAttributes("{}", TEST_DOMAIN);

  // Sends back the URL to the child script
  do_await_remote_message("start-test").then(() => {
    do_send_remote_message("start-test-done", URL);
  });

  // Sends back the cookie count for the domain
  // Should only be one - from Set-Cookie
  do_await_remote_message("check-cookie-count").then(() => {
    do_send_remote_message("check-cookie-count-done", Services.cookies.countCookiesFromHost(TEST_DOMAIN));
  });

  // Sends back the cookie count for the domain
  // There should be 2 cookies. One from the Set-Cookie header, the other set
  // manually.
  do_await_remote_message("second-check-cookie-count").then(() => {
    do_send_remote_message("second-check-cookie-count-done", Services.cookies.countCookiesFromHost(TEST_DOMAIN));
  });

  // Sets a cookie for the test domain
  do_await_remote_message("set-cookie").then(() => {
    const expiry = Date.now() + 24 * 60 * 60;
    Services.cookies.add(TEST_DOMAIN, "/", "cookieName", "cookieValue", false, false, false, expiry, {}, Ci.nsICookie.SAMESITE_NONE);
    do_send_remote_message("set-cookie-done");
  });

  // Run the actual test logic
  run_test_in_child("child_cookie_header.js");
}
