<!DOCTYPE html>
<title>Web Authentication API: CTAP HID failure cases with a mock hid authenticator.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/util.js"></script>
<script>
    const defaultOptions = {
        publicKey: {
            rp: {
                name: "example.com"
            },
            user: {
                name: "John Appleseed",
                id: asciiToUint8Array("123456"),
                displayName: "John",
            },
            challenge: asciiToUint8Array("123456"),
            pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            timeout: 10
        }
    };

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "data-not-sent" } });
        return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out.");
    }, "CTAP HID with init sub stage data not sent error in a mock hid authenticator.");

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "empty-report" } });
        return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out.");
    }, "CTAP HID with init sub stage empty report error in a mock hid authenticator.");

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-channel-id" } });
        return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out.");
    }, "CTAP HID with init sub stage wrong channel id error in a mock hid authenticator.");

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-nonce" } });
        return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out.");
    }, "CTAP HID with init sub stage wrong nonce error in a mock hid authenticator.");

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "msg", error: "data-not-sent" } });
        return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out.");
    }, "CTAP HID with msg sub stage data not sent error in a mock hid authenticator.");

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "msg", error: "empty-report" } });
        return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out.");
    }, "CTAP HID with msg sub stage empty report error in a mock hid authenticator.");

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "msg", error: "wrong-channel-id" } });
        return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out.");
    }, "CTAP HID with msg sub stage wrong channel id error in a mock hid authenticator.");

    promise_test(function(t) {
        if (window.testRunner)
            testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "wrong-channel-id", payloadBase64:[testDummyMessagePayloadBase64] } });
        return promiseRejects(t, "UnknownError", navigator.credentials.create(defaultOptions), "Unknown internal error. Error code: 18");
    }, "CTAP HID with request::msg stage wrong channel id error in a mock hid authenticator.");
</script>
