<!DOCTYPE html>
<title>Web Authentication API: PublicKeyCredential's [[get]] failure cases.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/util.js"></script>
<script>
    (async function() {
        const userhandleBase64 = generateUserhandleBase64();
        const privateKeyBase64 = await generatePrivateKeyBase64();
        const credentialID = await calculateCredentialID(privateKeyBase64);
        // Default mock configuration. Tests need to override if they need different configuration.
        if (window.internals)
            internals.setMockWebAuthenticationConfiguration({ local: { acceptAuthentication: false, acceptAttestation: false, preferredUserhandleBase64: userhandleBase64 } });

        promise_test(t => {
            const options = {
                publicKey: {
                    challenge: asciiToUint8Array("123456"),
                    allowCredentials: [
                        { type: "public-key", id: credentialID, transports: ["usb"] },
                        { type: "public-key", id: credentialID, transports: ["nfc"] },
                        { type: "public-key", id: credentialID, transports: ["ble"] },
                        { type: "public-key", id: credentialID, transports: ["internal"] }
                    ]
                }
            };

            return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "No matched credentials are found in the platform attached authenticator.");
        }, "PublicKeyCredential's [[get]] with no matched credentials in a mock local authenticator.");

        promise_test(t => {
            const options = {
                publicKey: {
                    challenge: asciiToUint8Array("123456"),
                    allowCredentials: [
                        { type: "public-key", id: Base64URL.parse(userhandleBase64) }
                    ]
                }
            };

            if (window.testRunner)
                testRunner.addTestKeyToKeychain(privateKeyBase64, testRpId, userhandleBase64);
            return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "No matched credentials are found in the platform attached authenticator.").then(() => {
                if (window.testRunner)
                    testRunner.cleanUpKeychain(testRpId, userhandleBase64);
            });
        }, "PublicKeyCredential's [[get]] with no matched credentials in a mock local authenticator. 2nd");

        promise_test(t => {
            const options = {
                publicKey: {
                    challenge: asciiToUint8Array("123456")
                }
            };

            if (window.testRunner)
                testRunner.addTestKeyToKeychain(privateKeyBase64, testRpId, userhandleBase64);
            return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Couldn't get user consent.").then(() => {
                if (window.testRunner)
                    testRunner.cleanUpKeychain(testRpId, userhandleBase64);
            });
        }, "PublicKeyCredential's [[get]] without user consent in a mock local authenticator.");

        promise_test(t => {
            const options = {
                publicKey: {
                    challenge: asciiToUint8Array("123456"),
                    allowCredentials: [
                        { type: "public-key", id: credentialID, transports: ["usb"] },
                        { type: "public-key", id: credentialID, transports: ["nfc"] },
                        { type: "public-key", id: credentialID, transports: ["ble"] }
                    ],
                    timeout: 10
                }
            };

            return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out.");
        }, "PublicKeyCredential's [[get]] with timeout in a mock local authenticator.");
    })();
</script>
