<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
    <script src="/cookies/resources/cookie-utilities.js"></script>
</head>
<body>
<script>
    description("Check that cookies created by JavaScript with max-age or expiry longer than a week get capped to a week.");
    jsTestIsAsync = true;

    if (internals)
        internals.setTrackingPreventionEnabled(true);

    let passedTests = 0;
    function checkThatCookieDoesNotExpireAfter(cookieData, maxAgeInSeconds) {
        let now = new Date();
        let maxExpiryDateInMilliseconds = now.getTime() + (maxAgeInSeconds * 1000);

        if (maxExpiryDateInMilliseconds > cookieData["expires"])
            ++passedTests;
        else
            testFailed("Cookie named " + cookieData["name"] + " expires in more than " + maxAgeInSeconds + " seconds.");
    }

    const twoDaysInSeconds = 2 * 24 * 60 * 60;
    const shortLivedCookieMaxAge = { name : "shortLivedCookieMaxAge", lifetime : "Max-Age=" + twoDaysInSeconds + ";" };
    document.cookie = shortLivedCookieMaxAge.name + "=foobar; " + shortLivedCookieMaxAge.lifetime + " path=/";

    const twoDaysAsExpiresDate = createExpiresDateFromMaxAge(twoDaysInSeconds);
    const shortLivedCookieExpires = { name : "shortLivedCookieExpires", lifetime : "Expires=" + twoDaysAsExpiresDate + ";" };
    document.cookie = shortLivedCookieExpires.name + "=foobar; " + shortLivedCookieExpires.lifetime + " path=/";

    const oneWeekInSeconds = 7 * 24 * 60 * 60;
    const twoWeeksInSeconds = 2 * oneWeekInSeconds;
    const longLivedCookieMaxAge = { name : "longLivedCookieMaxAge", lifetime : "Max-Age=" + twoWeeksInSeconds + ";" };
    document.cookie = longLivedCookieMaxAge.name + "=foobar; " + longLivedCookieMaxAge.lifetime + " path=/";

    const twoWeeksAsExpiresDate = createExpiresDateFromMaxAge(twoWeeksInSeconds);
    const longLivedCookieExpires = { name : "longLivedCookieExpires", lifetime : "Expires=" + twoWeeksAsExpiresDate + ";" };
    document.cookie = longLivedCookieExpires.name + "=foobar; " + longLivedCookieExpires.lifetime + " path=/";

    const overTwoDaysInSeconds = twoDaysInSeconds + 30;
    const overTwoWeeksInSeconds = twoWeeksInSeconds + 30;
    if (internals) {
        let cookies = internals.getCookies();
        if (!cookies.length)
            testFailed("No cookies found.");
        for (let cookie of cookies) {
            switch (cookie.name) {
                case shortLivedCookieMaxAge.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overTwoDaysInSeconds);
                    break;
                case shortLivedCookieExpires.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overTwoDaysInSeconds);
                    break;
                case longLivedCookieMaxAge.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overTwoWeeksInSeconds);
                    break;
                case longLivedCookieExpires.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overTwoWeeksInSeconds);
                    break;
            }
        }

        resetCookiesForCurrentOrigin();

        if (passedTests === 4) {
            testPassed("The two short-lived cookies don't expire after more than " + overTwoDaysInSeconds + " seconds.");
            testPassed("The two long-lived cookies don't expire after more than " + overTwoWeeksInSeconds + " seconds.");
        } else
            testFailed("At least one cookie's expiry attribute was beyond the test thresholds.");
    } else
        testFailed("No internals object.");

    if (internals)
        internals.setTrackingPreventionEnabled(false);

    finishJSTest();
</script>
</body>
</html>
