<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="/js-test-resources/js-test.js"></script>
    <script src="/cookies/resources/cookie-utilities.js"></script>
    <script src="resources/util.js"></script>
</head>
<body onload="runTest()">
<script>
    description("Test for CNAME Cloaking: Cookie expiry capping if the top frame has an alternate CNAME and the sub resource has a different alternate CNAME.");
    jsTestIsAsync = true;

    function finishTest() {
        resetCookiesForCurrentOrigin();
        setEnableFeature(false, function() {
            finishJSTest();
        });
    }

    const oneWeekInSeconds = 7 * 24 * 60 * 60;
    const overOneWeekInSeconds = oneWeekInSeconds + 600;
    const underOneWeekInSeconds = oneWeekInSeconds - 600;

    function checkCookieExpiry(cookieData, seconds, shouldBeLessThan) {
        let now = new Date();
        let expiryDateInMilliseconds = now.getTime() + (seconds * 1000);

        if ((cookieData["expires"] < expiryDateInMilliseconds) === shouldBeLessThan) {
            let underOneWeekExpiryDateInMilliseconds = now.getTime() + (underOneWeekInSeconds * 1000);
            if (cookieData["expires"] < underOneWeekExpiryDateInMilliseconds)
                testFailed("Cookie named " + cookieData["name"] + " was capped too low.");
            else
                testPassed("Cookie named " + cookieData["name"] + " expires in " + (shouldBeLessThan ? "less" : "more") + " than " + seconds + " seconds.");
        } else
            testFailed("Cookie named " + cookieData["name"] + " expires in " + (shouldBeLessThan ? "more" : "less") + " than " + seconds + " seconds.");
    }

    const cookieName = "cnameTestCookie";
    const subPathToSetFirstPartyCookie = "resources/set-cookie.php?name=" + cookieName + "&value=value&dummy=" + Math.random();

    function setAndCheckCookie() {
        fetch(subPathToSetFirstPartyCookie).then(function() {
            if (internals) {
                let cookies = internals.getCookies();
                if (!cookies.length)
                    testFailed("No cookies found.");
                for (let cookie of cookies) {
                    if (cookie.name === cookieName) {
                        checkCookieExpiry(cookie, overOneWeekInSeconds, true);
                    } else {
                        testFailed("Unknown cookie " + cookie.name + " found.");
                    }
                }
                finishTest();
            }
        });
    }

    const firstParty = "http://127.0.0.1:8000";
    const firstPartyCNAMEForTesting = "http://testwebkit.org";
    const thirdPartyCNAMEForTesting = "http://3rdpartytestwebkit.org";

    function runTest() {
        setEnableFeature(true, function() {
            testRunner.statisticsSetFirstPartyHostCNAMEDomain(firstParty, firstPartyCNAMEForTesting, function() {
                testRunner.statisticsSetThirdPartyCNAMEDomain(thirdPartyCNAMEForTesting, function() {
                    setAndCheckCookie();
                });
            });
        });
    }
</script>
</body>
