<!DOCTYPE html>

<head>
  <title>Test cookies between sessions.</title>
  <style>
    h1 {
      color: #c50000;
      font-size: 6em;
    }
  </style>
  <script src='black_box_js_test_utils.js'></script>
</head>

<body>
  <h1>
    <span>Test cookies between sessions.</span>
  </h1>
  <script>
    document.body.style.backgroundColor = "green";
    const persistent_cookie = "persistent_cookie_status=exists";

    // Set the cookie expiration date 2 days in the future.
    var cookie_date = new Date();
    cookie_date.setDate(cookie_date.getDate() + 2 /*days*/);
    const persistent_cookie_expire_time = "; expires=" + cookie_date;

    const very_old_date = "; expires=Fri, 18 Dec 2003 12:00:00 UTC";

    function firstRun() {
      console.log(
          "First run, verifying basic functionalities and write persistent cookie");
      // If the previous run failed, persistent cookie might not be deleted.
      // Clear it to avoid affecting this test run.
      document.cookie = persistent_cookie + very_old_date;
      // Verify basic cookie functionalities work before testing persistent cookie.
      const cookie_1 = "test_content=exist";
      const cookie_2 = "second_test_content=still_exist";
      const cookie_1_change = "test_content=changed";

      document.cookie = cookie_1;
      assertEqual(cookie_1, document.cookie);
      document.cookie = cookie_2;
      assertEqual(cookie_1 + '; ' + cookie_2, document.cookie);
      document.cookie = cookie_1_change;
      assertEqual(cookie_2 + '; ' + cookie_1_change, document.cookie);
      document.cookie = cookie_1 + very_old_date;
      assertEqual(cookie_2, document.cookie);
      // End of basic functionality tests.

      // Add persistent cookie that's supposed to last till next opening.
      document.cookie = persistent_cookie + persistent_cookie_expire_time;
      assertEqual(cookie_2 + '; ' + persistent_cookie, document.cookie);
    }

    function secondRun() {
      console.log("Second run: Verifying persistent cookie is written.");
      assertEqual(persistent_cookie, document.cookie);
      document.cookie = persistent_cookie + very_old_date;
      assertEqual('', document.cookie);
    }

    function thirdRun() {
      console.log("Third run: verifying persistent cookie is wiped.");
      assertEqual('', document.cookie);
    }

    window.onkeydown = function(event) {
      if (event.keyCode === 97) {
        firstRun();
      } else if (event.keyCode === 98) {
        secondRun();
      } else if (event.keyCode === 99) {
        thirdRun();
      }
      onEndTest();
    }
    setupFinished();
  </script>
</body>
