<!doctype html>
<html>
<head>
<title>getUserMedia({audio:true}) creates a stream with at least an audio track</title>
<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-NavigatorUserMedia-getUserMedia-void-MediaStreamConstraints-constraints-NavigatorUserMediaSuccessCallback-successCallback-NavigatorUserMediaErrorCallback-errorCallback">
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStreamTrack-kind">
</head>
<body>
<p class="instructions">When prompted, accept to share your audio stream.</p>
<h1 class="instructions">Description</h1>
<p class="instructions">This test checks that the MediaStream object returned by
the success callback in getUserMedia has exactly one audio track.</p>

<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
var astream;
var t = async_test("Tests that a MediaStream with exactly one audio track is returned", {timeout: 10000});
t.step(function() {
  navigator.mediaDevices.getUserMedia({audio:true}).then(t.step_func(function (stream) {
    astream = stream;
    assert_true(stream instanceof MediaStream, "getUserMedia success callback comes with a MediaStream object");
    assert_equals(stream.getAudioTracks().length, 1, "the media stream has exactly one audio track");
    assert_equals(stream.getAudioTracks()[0].kind, "audio", "getAudioTracks() returns a sequence of tracks whose kind is 'audio'");
    assert_equals(stream.getVideoTracks().length, 0, "the media stream has zero video track");
    t.done();
  }),
  function(error) {});
});
</script>
</body>
</html>
