<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
    <script src="resources/util.js"></script>
    <title>Tests for Capped Cache Max-Age</title>
</head>
<body>
<script>
    description("Tests that cache max-age is capped for prevalent resources.");
    jsTestIsAsync = true;

    var loadedUrl;
    function firstFetch() {
        // This should create a capped cache entry.
        fetch("http://localhost:8000/resourceLoadStatistics/resources/cached-permanent-redirect.php",
            {
                cache: "reload",
                headers: {
                    "X-WebKit": "1234",
                }
            }
        ).then(function(response) {
            loadedUrl = response.url;
            shouldBeEqualToString("loadedUrl", "http://localhost:8000/resourceLoadStatistics/resources/echo-query.php?value=1234");
            secondFetch();
        }).catch(function(error) {
            testFailed(error.message);
            setEnableFeature(false, finishJSTest);
        });
    }

    function secondFetch() {
        // This should not trigger a successful cache hit and instead create another capped cache entry.
        fetch("http://localhost:8000/resourceLoadStatistics/resources/cached-permanent-redirect.php",
            {
                cache: "force-cache",
                headers: {
                    "X-WebKit": "4321",
                }
            }
        ).then(function(response) {
            loadedUrl = response.url;
            shouldBeEqualToString("loadedUrl", "http://localhost:8000/resourceLoadStatistics/resources/echo-query.php?value=4321");
            thirdFetch();
        }).catch(function(error) {
            testFailed(error.message);
            setEnableFeature(false, finishJSTest);
        });
    }

    function thirdFetch() {
        // This should not trigger a successful cache hit and instead create another capped cache entry.
        fetch("http://localhost:8000/resourceLoadStatistics/resources/cached-permanent-redirect.php",
            {
                cache: "force-cache",
            }
        ).then(function(response) {
            loadedUrl = response.url;
            shouldBeEqualToString("loadedUrl", "http://localhost:8000/resourceLoadStatistics/resources/echo-query.php?value=");
            fourthFetch();
        }).catch(function(error) {
            testFailed(error.message);
            setEnableFeature(false, finishJSTest);
        });
    }

    function fourthFetch() {
        // This should not trigger a successful cache hit but clear capping.
        fetch("http://localhost:8000/resourceLoadStatistics/resources/cached-permanent-redirect.php",
            {
                cache: "force-cache",
            }
        ).then(function(response) {
            loadedUrl = response.url;
            shouldBeEqualToString("loadedUrl", "http://localhost:8000/resourceLoadStatistics/resources/echo-query.php?value=");
            fifthFetch();
        }).catch(function(error) {
            testFailed(error.message);
            setEnableFeature(false, finishJSTest);
        });
    }

    function fifthFetch() {
        // This should trigger a regular, successful cache hit.
        fetch("http://localhost:8000/resourceLoadStatistics/resources/cached-permanent-redirect.php",
            {
                headers: {
                    "X-WebKit": "1234",
                }
            }
        ).then(function(response) {
            loadedUrl = response.url;
            shouldBeEqualToString("loadedUrl", "http://localhost:8000/resourceLoadStatistics/resources/echo-query.php?value=");
            setEnableFeature(false, finishJSTest);
        }).catch(function(error) {
            testFailed(error.message);
            setEnableFeature(false, finishJSTest);
        });
    }
    testRunner.setUseITPDatabase(true);
    setEnableFeature(true, function() {
        if (testRunner.isStatisticsPrevalentResource("http://localhost"))
            testFailed("Localhost was classified as prevalent resource before the test started.");

        testRunner.setStatisticsCacheMaxAgeCap(0);
        testRunner.setStatisticsPrevalentResource("http://localhost", true, function() {
            testRunner.statisticsUpdateCookieBlocking(firstFetch);
        });
    });
</script>
</body>
</html>
