<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test passing capture device IDs to getUserMedia</title>
    <script src="../../resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script>
    let deviceIds = [];

    if (window.testRunner)
        testRunner.setUserMediaPermission(true);

    promise_test((test) => {
        return navigator.mediaDevices.enumerateDevices()
            .then((devices) => {
                devices.forEach((device) => {
                    let kind = device.kind == "audioinput" ? "audio" : "video";
                    deviceIds.push({ type: kind, id : device.deviceId});
                });
            });
    }, "Collect device IDs");
    
    let constraints = { };

    promise_test((test) => {
        deviceIds.forEach((info) => {
            constraints[info.type] = { deviceId: { exact: info.id } };
        });
    
        var audioTrack, videoTrack;
        return navigator.mediaDevices.getUserMedia(constraints)
            .then((stream) => {
                assert_equals(stream.getAudioTracks().length, 1, "correct number of audio tracks");
                assert_equals(stream.getVideoTracks().length, 1, "correct number of audio tracks");

                videoTrack = stream.getVideoTracks()[0];
                audioTrack = stream.getAudioTracks()[0];
                return navigator.mediaDevices.enumerateDevices();
            }).then(devices => {
                var ids = devices.map(device => device.deviceId);
                assert_true(ids.indexOf(videoTrack.getSettings().deviceId) !== -1 , "deviceId for video track should be respected");
                assert_true(ids.indexOf(audioTrack.getSettings().deviceId) !== -1 , "deviceId for audio track should be respected");
                assert_equals(audioTrack.getSettings().groupId, videoTrack.getSettings().groupId, "groupId should match");
            })

    }, "Pass device IDs as exact constraints");
    
    promise_test((test) => {
        deviceIds.forEach((info) => {
            constraints[info.type] = { deviceId: info.id };
        });
    
        return navigator.mediaDevices.getUserMedia(constraints)
            .then((stream) => {
                assert_equals(stream.getAudioTracks().length, 1, "correct number of audio tracks");
                assert_equals(stream.getVideoTracks().length, 1, "correct number of audio tracks");
            })

    }, "Pass device IDs as optional constraints");

    </script>
</head>
<body>
</body>
</html>
