<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let suite = InspectorTest.createSyncSuite("Page.getCookie");

    suite.addTestCase({
        name: "MatchCookiesAgainstResourceDomains",
        description: "Test that Inspector properly detects whether a cookie matches a resource's domain or not.",
        test(resolve, reject) {
            let testcasesByCookieDomain = {
                ".example.com": [
                    // Unrelated top-level domain.
                    {
                        "input": "www.other.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.other.com",
                        "output": false,
                    },
                    {
                        "input": "bad.stuff.other.com",
                        "output": false,
                    },

                    // Same top-level domain, with 0+ subdomains.
                    {
                        "input": "www.example.com",
                        "output": true,
                    },
                    {
                        "input": "stuff.example.com",
                        "output": true,
                    },
                    {
                        "input": "good.stuff.example.com",
                        "output": true,
                    },
                ],
                "stuff.example.com": [
                    // Unrelated top-level domain.
                    {
                        "input": "www.other.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.other.com",
                        "output": false,
                    },
                    {
                        "input": "bad.stuff.other.com",
                        "output": false,
                    },

                    // Same top-level domain, with 0+ subdomains.
                    {
                        "input": "www.example.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.example.com",
                        "output": true,
                    },
                    {
                        "input": "good.stuff.example.com",
                        "output": false,
                    },
                ],

                ".stuff.example.com": [
                    // Unrelated top-level domain.
                    {
                        "input": "www.other.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.other.com",
                        "output": false,
                    },
                    {
                        "input": "bad.stuff.other.com",
                        "output": false,
                    },

                    // Same top-level domain, with 0+ subdomains.
                    {
                        "input": "www.example.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.example.com",
                        "output": true,
                    },
                    {
                        "input": "good.stuff.example.com",
                        "output": true,
                    },
                ],

                "good.stuff.example.com": [
                    // Unrelated top-level domain.
                    {
                        "input": "www.other.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.other.com",
                        "output": false,
                    },
                    {
                        "input": "bad.stuff.other.com",
                        "output": false,
                    },

                    // Same top-level domain, with 0+ subdomains.
                    {
                        "input": "www.example.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.example.com",
                        "output": false,
                    },
                    {
                        "input": "good.stuff.example.com",
                        "output": true,
                    },
                ],

                ".good.stuff.example.com": [
                    // Unrelated top-level domain.
                    {
                        "input": "www.other.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.other.com",
                        "output": false,
                    },
                    {
                        "input": "bad.stuff.other.com",
                        "output": false,
                    },

                    // Same top-level domain, with 0+ subdomains.
                    {
                        "input": "www.example.com",
                        "output": false,
                    },
                    {
                        "input": "stuff.example.com",
                        "output": false,
                    },
                    {
                        "input": "good.stuff.example.com",
                        "output": true,
                    },
                ]
            };

            for (let cookieDomain in testcasesByCookieDomain) {
                for (let expected of testcasesByCookieDomain[cookieDomain]) {
                    let output = WI.CookieStorageObject.cookieDomainMatchesResourceDomain(cookieDomain, expected.input);
                    let verdictText = expected.output ? "should match" : "should not match";
                    InspectorTest.expectThat(output === expected.output, `${cookieDomain} ${verdictText} ${expected.input}`);
                }
            }

            return true;
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for model code related to the Page.getCookie command.</p>
</body>
</html>
