<!DOCTYPE html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="helper.js" type="module"></script>

<script type="module">
  import { expireCookie, documentHasCookie, waitForCookie, addCookieAndSessionCleanup, setupShardedServerState, configureServer, pullServerState} from "./helper.js";

  const futureDate = new Date();
  futureDate.setFullYear(futureDate.getFullYear() + 1);

  async function runTest(t, sessionCookieAttributes, requestCookieAttributes, expectCallRefresh) {
    await setupShardedServerState();
    const expectedCookieAndValue = "auth_cookie=abcdef0123";
    const expectedAttributes = sessionCookieAttributes;
    const expectedCookieAndAttributes = `${expectedCookieAndValue};${expectedAttributes}`;
    addCookieAndSessionCleanup(t);

    // Configure server to set the session credentials and the associated Set-Cookie header.
    await configureServer({ cookieDetails: [{ attributes: expectedAttributes }] });

    // Prompt starting a session, and wait until registration completes.
    const loginResponse = await fetch('login.py');
    assert_equals(loginResponse.status, 200);
    await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);

    // Confirm that a request has the cookie set.
    const authResponse = await fetch('verify_authenticated.py');
    assert_equals(authResponse.status, 200);

    // Delete the cookie, and replace it with a similar cookie with custom attributes.
    expireCookie(expectedCookieAndAttributes);
    assert_false(documentHasCookie(expectedCookieAndValue));
    await fetch('set_cookie.py', {
      method: 'POST',
      body: `${expectedCookieAndValue};${requestCookieAttributes}`,
    });

    // Send a request. Then, confirm refresh was or was not sent.
    const authResponseAfterExpiry = await fetch('verify_authenticated.py');
    assert_equals(authResponseAfterExpiry.status, 200);
    assert_true(documentHasCookie(expectedCookieAndValue));
    const serverState = await pullServerState();
    assert_equals(serverState.hasCalledRefresh, expectCallRefresh);
  }

  promise_test(async t => {
    const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`;
    const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Expires=${futureDate.toUTCString()}`;
    await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/false);
  }, "Expires attribute in credentials doesn't affect matching");

  promise_test(async t => {
    const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`;
    const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Max-Age=86400`;
    await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/false);
  }, "Max-Age attribute in credentials doesn't affect matching");

  promise_test(async t => {
    const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`;
    const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;HttpOnly`;
    await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
  }, "HttpOnly attribute in credentials affects matching");

  promise_test(async t => {
    const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`;
    const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;SameSite=Strict`;
    await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
  }, "SameSite attribute in credentials affects matching");

  promise_test(async t => {
    const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`;
    const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Secure`;
    await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
  }, "Secure attribute in credentials affects matching");

  promise_test(async t => {
    const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`;
    const requestCookieAttributes = `Domain=${location.hostname};Path=/`;
    await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
  }, "Path attribute in credentials affects matching");

  promise_test(async t => {
    const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Secure`;
    const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Partitioned;Secure`;
    await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
  }, "Partition attribute in credentials affects matching");
</script>