<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Testing web audio on peer connection audio tracks</title>
    <script src="../resources/testharness.js"></script>
    <script src="../resources/testharnessreport.js"></script>
</head>
<body>
    <script src ="routines.js"></script>
    <script>
    var context = new webkitAudioContext();
    promise_test((test) => {
        var localTrack;
        return navigator.mediaDevices.getUserMedia({audio: true}).then((localStream) => {
            localTrack = localStream.getAudioTracks()[0];
            var remoteStream;
            return new Promise((resolve, reject) => {
                createConnections((firstConnection) => {
                    firstConnection.addTrack(localTrack);
                }, (secondConnection) => {
                    secondConnection.ontrack = (trackEvent) => {
                        remoteStream = trackEvent.streams[0];
                        resolve();
                    };
                });
            }).then(() => {
                return doHumAnalysis(remoteStream, true);
            }).then((value) => {
                assert_true(value, "heard hum from remote enabled track");
            }).then(() => {
                localTrack.enabled = false;
                return doHumAnalysis(remoteStream, false);
            }).then((value) => {
                assert_true(value, "not heard hum from remote disabled track");
            }).then(() => {
                localTrack.enabled = true;
                return doHumAnalysis(remoteStream, true);
            }).then((value) => {
                assert_true(value, "heard hum from remote reenabled track");
            }).then(() => {
                return context.close();
            });
        });
    }, "Muting and unmuting a local audio track");
    </script>
</body>
</html>
