<!DOCTYPE html>
<meta charset="utf-8">
<title>DBSC session ended with Clear-Site-Data</title>
<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, 401);
    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, 401);
    assert_false(documentHasCookie(expectedCookieAndValue));
  }, "A session ended with Clear-Site-Data: 'storage' does not refresh cookies")
</script>
