/*
 * Bug 1267910 - The regression test case for session cookies.
 */

"use strict";

const TEST_HOST = "www.example.com";
const COOKIE =
{
  name: "test1",
  value: "yes1",
  path: "/browser/browser/components/sessionstore/test/"
};
const SESSION_DATA = JSON.stringify(
{
  version: ["sessionrestore", 1],
  windows: [{
    tabs: [{
      entries: [],
      lastAccessed: 1463893009797,
      hidden: false,
      attributes: {},
      image: null
    }, {
      entries: [{
        url: "http://www.example.com/browser/browser/components/sessionstore/test/browser_1267910_page.html",
        triggeringPrincipal_base64,
        charset: "UTF-8",
        ID: 0,
        docshellID: 2,
        originalURI: "http://www.example.com/browser/browser/components/sessionstore/test/browser_1267910_page.html",
        docIdentifier: 0,
        persist: true
      }],
      lastAccessed: 1463893009321,
      hidden: false,
      attributes: {},
      userContextId: 0,
      index: 1,
      image: "http://www.example.com/favicon.ico"
    }],
    selected: 1,
    _closedTabs: [],
    busy: false,
    width: 1024,
    height: 768,
    screenX: 4,
    screenY: 23,
    sizemode: "normal",
    cookies: [{
      host: "www.example.com",
      value: "yes1",
      path: "/browser/browser/components/sessionstore/test/",
      name: "test1"
    }]
  }],
  selectedWindow: 1,
  _closedWindows: [],
  session: {
    lastUpdate: 1463893009801,
    startTime: 1463893007134,
    recentCrashes: 0
  },
  global: {}
});

const SESSION_DATA_OA = JSON.stringify(
{
  version: ["sessionrestore", 1],
  windows: [{
    tabs: [{
      entries: [],
      lastAccessed: 1463893009797,
      hidden: false,
      attributes: {},
      image: null
    }, {
      entries: [{
        url: "http://www.example.com/browser/browser/components/sessionstore/test/browser_1267910_page.html",
        triggeringPrincipal_base64,
        charset: "UTF-8",
        ID: 0,
        docshellID: 2,
        originalURI: "http://www.example.com/browser/browser/components/sessionstore/test/browser_1267910_page.html",
        docIdentifier: 0,
        persist: true
      }],
      lastAccessed: 1463893009321,
      hidden: false,
      attributes: {},
      userContextId: 0,
      index: 1,
      image: "http://www.example.com/favicon.ico"
    }],
    selected: 1,
    _closedTabs: [],
    busy: false,
    width: 1024,
    height: 768,
    screenX: 4,
    screenY: 23,
    sizemode: "normal",
    cookies: [{
      host: "www.example.com",
      value: "yes1",
      path: "/browser/browser/components/sessionstore/test/",
      name: "test1",
      originAttributes: {
        addonId: "",
        appId: 0,
        inIsolatedMozBrowser: false,
        userContextId: 0
      }
    }]
  }],
  selectedWindow: 1,
  _closedWindows: [],
  session: {
    lastUpdate: 1463893009801,
    startTime: 1463893007134,
    recentCrashes: 0
  },
  global: {}
});

add_task(async function run_test() {
  // Wait until initialization is complete.
  await SessionStore.promiseInitialized;

  // Clear cookies.
  Services.cookies.removeAll();

  // Open a new window.
  let win = await promiseNewWindowLoaded();

  // Restore window with session cookies that have no originAttributes.
  ss.setWindowState(win, SESSION_DATA, true);
  await promiseWindowRestored(win);

  let enumerator = Services.cookies.getCookiesFromHost(TEST_HOST, {});
  let cookie;
  let cookieCount = 0;
  while (enumerator.hasMoreElements()) {
    cookie = enumerator.getNext().QueryInterface(Ci.nsICookie);
    cookieCount++;
  }

  // Check that the cookie is restored successfully.
  is(cookieCount, 1, "expected one cookie");
  is(cookie.name, COOKIE.name, "cookie name successfully restored");
  is(cookie.value, COOKIE.value, "cookie value successfully restored");
  is(cookie.path, COOKIE.path, "cookie path successfully restored");

  // Clear cookies.
  Services.cookies.removeAll();

  // Restore window with session cookies that have originAttributes within.
  ss.setWindowState(win, SESSION_DATA_OA, true);
  await promiseWindowRestored(win);

  enumerator = Services.cookies.getCookiesFromHost(TEST_HOST, {});
  cookieCount = 0;
  while (enumerator.hasMoreElements()) {
    cookie = enumerator.getNext().QueryInterface(Ci.nsICookie);
    cookieCount++;
  }

  // Check that the cookie is restored successfully.
  is(cookieCount, 1, "expected one cookie");
  is(cookie.name, COOKIE.name, "cookie name successfully restored");
  is(cookie.value, COOKIE.value, "cookie value successfully restored");
  is(cookie.path, COOKIE.path, "cookie path successfully restored");

  // Close our window.
  await BrowserTestUtils.closeWindow(win);
});
