<!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 } from "./helper.js";

  promise_test(async t => {
    const testId = await setupShardedServerState();
    const expectedCookieAndValue = "auth_cookie=abcdef0123";
    const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${location.hostname};Path=/device-bound-session-credentials`;
    addCookieAndSessionCleanup(t);

    // 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);

    // The server ends the session.
    const endSessionResponse = await fetch('end_session_via_clear_site_data.py');
    assert_equals(endSessionResponse.status, 200);
    // Need to set up the state again because all cookies were cleared.
    await setupShardedServerState({testId});

    // Expire the cookie, and confirm it does not get refreshed.
    expireCookie(expectedCookieAndAttributes);
    assert_false(documentHasCookie(expectedCookieAndValue));
    const authResponse = await fetch('verify_authenticated.py');
    assert_equals(authResponse.status, 403);
    assert_false(documentHasCookie(expectedCookieAndValue));
  }, "A session ended with Clear-Site-Data: 'cookies' does not refresh cookies");

  promise_test(async t => {
    const testId = await setupShardedServerState();
    const expectedCookieAndValue = "auth_cookie=abcdef0123";
    const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${location.hostname};Path=/device-bound-session-credentials`;
    addCookieAndSessionCleanup(t);

    // 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);

    // The server ends the session.
    const endSessionResponse = await fetch('end_session_via_clear_site_data.py', {method: 'POST', body: '"storage"'});
    assert_equals(endSessionResponse.status, 200);
    // Need to set up the state again because all cookies were cleared.
    await setupShardedServerState({testId});

    // Expire the cookie, and confirm it does not get refreshed.
    expireCookie(expectedCookieAndAttributes);
    assert_false(documentHasCookie(expectedCookieAndValue));
    const authResponse = await fetch('verify_authenticated.py');
    assert_equals(authResponse.status, 403);
    assert_false(documentHasCookie(expectedCookieAndValue));
  }, "A session ended with Clear-Site-Data: 'storage' does not refresh cookies")
</script>
