| Index: third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveTrack.html
|
| diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveTrack.html b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveTrack.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2f4d0f7fcfdb44842758a91f67fce56ed57f6101
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveTrack.html
|
| @@ -0,0 +1,149 @@
|
| +<!DOCTYPE html>
|
| +<html>
|
| +<head>
|
| +<title>RTCPeerConnection.getSenders</title>
|
| +<script src="../../resources/testharness.js"></script>
|
| +<script src="../../resources/testharnessreport.js"></script>
|
| +</head>
|
| +<body>
|
| +<script>
|
| +promise_test(function() {
|
| + let pc = new RTCPeerConnection();
|
| + return createStreams({audio:true, video:false}, 1)
|
| + .then(function(streams) {
|
| + let stream = streams[0];
|
| + let track = stream.getAudioTracks()[0];
|
| + let sender = pc.addTrack(track);
|
| + assert_equals(sender.track, track);
|
| + assert_array_equals(pc.getLocalStreams(), []);
|
| + });
|
| +}, 'addTrack() for a single track.');
|
| +
|
| +promise_test(function() {
|
| + let pc = new RTCPeerConnection();
|
| + return createStreams({audio:true, video:false}, 1)
|
| + .then(function(streams) {
|
| + let stream = streams[0];
|
| + let track = stream.getAudioTracks()[0];
|
| + let sender = pc.addTrack(track, stream);
|
| + assert_equals(sender.track, track);
|
| + // TODO(hbos): |addTrack| does not add to the set of local streams. When
|
| + // |getLocalStreams| is updated to return the streams of all senders this
|
| + // would have an observable effect here. https://crbug.com/738918
|
| + assert_array_equals(pc.getLocalStreams(), []);
|
| + });
|
| +}, 'addTrack() for a single track and its stream.');
|
| +
|
| +promise_test(function() {
|
| + let pc = new RTCPeerConnection();
|
| + return createStreams({audio:true, video:false}, 2)
|
| + .then(function(streams) {
|
| + let streamA = streams[0];
|
| + let trackA = streamA.getAudioTracks()[0];
|
| + let streamB = streams[1];
|
| + let sender = pc.addTrack(trackA, streamB);
|
| + assert_equals(sender.track, trackA);
|
| + // TODO(hbos): |addTrack| does not add to the set of local streams. When
|
| + // |getLocalStreams| is updated to return the streams of all senders this
|
| + // would have an observable effect here. https://crbug.com/738918
|
| + assert_array_equals(pc.getLocalStreams(), []);
|
| + });
|
| +}, 'addTrack() for a single track and a different stream.');
|
| +
|
| +promise_test(function() {
|
| + let pc = new RTCPeerConnection();
|
| + return createStreams({audio:true, video:false}, 2)
|
| + .then(function(streams) {
|
| + let streamA = streams[0];
|
| + let streamB = streams[1];
|
| + let track = streamA.getAudioTracks()[0];
|
| + let exception = null;
|
| + try {
|
| + pc.addTrack(track, streamA, streamB);
|
| + } catch (e) {
|
| + exception = e;
|
| + }
|
| + // The spec supports multiple streams per track but our implementation
|
| + // doesn't. Fix test when resolving https://crbug.com/webrtc/7932.
|
| + assert_true(exception != null);
|
| + assert_equals('NotSupportedError', exception.name);
|
| + });
|
| +}, 'addTrack() for a single track and two streams throws NotSupportedError.');
|
| +
|
| +promise_test(function() {
|
| + let pc = new RTCPeerConnection();
|
| + return createStreams({audio:true, video:false}, 1)
|
| + .then(function(streams) {
|
| + let stream = streams[0];
|
| + let track = stream.getAudioTracks()[0];
|
| + let sender = pc.addTrack(track);
|
| + assert_equals(sender.track, track);
|
| + let exception = null;
|
| + try {
|
| + pc.addTrack(track);
|
| + } catch (e) {
|
| + exception = e;
|
| + }
|
| + assert_equals('InvalidAccessError', exception.name);
|
| + });
|
| +}, 'addTrack() when already added throws InvalidAccessError.');
|
| +
|
| +promise_test(function() {
|
| + let pc = new RTCPeerConnection();
|
| + return createStreams({audio:true, video:false}, 1)
|
| + .then(function(streams) {
|
| + let stream = streams[0];
|
| + let track = stream.getAudioTracks()[0];
|
| + pc.addStream(stream);
|
| + let exception = null;
|
| + try {
|
| + // The interaction between |addStream| and |addTrack| is not
|
| + // standardized (|addStream| is non-standard). Because |addStream|
|
| + // creates a sender for the track and |addTrack| throws if there already
|
| + // exists a sender for the track.
|
| + pc.addTrack(track);
|
| + } catch (e) {
|
| + exception = e;
|
| + }
|
| + assert_true(exception != null);
|
| + assert_equals('InvalidAccessError', exception.name);
|
| + });
|
| +}, 'addTrack() after addStream() throws InvalidAccessError.');
|
| +
|
| +promise_test(function() {
|
| + let pc = new RTCPeerConnection();
|
| + return createStreams({audio:true, video:false}, 1)
|
| + .then(function(streams) {
|
| + let stream = streams[0];
|
| + let track = stream.getAudioTracks()[0];
|
| + let sender = pc.addTrack(track);
|
| + assert_equals(sender.track, track);
|
| + assert_array_equals(pc.getSenders(), [ sender ]);
|
| + assert_array_equals(pc.getLocalStreams(), []);
|
| + pc.addStream(stream);
|
| + assert_array_equals(pc.getLocalStreams(), [ stream ]);
|
| + // The interaction between |addStream| and |addTrack| is not standardized
|
| + // (|addStream| is non-standard). In our implementation, the existing
|
| + // sender is reused by |addStream|.
|
| + assert_array_equals(pc.getSenders(), [ sender ]);
|
| + });
|
| +}, 'addTrack() before addStream() works.');
|
| +
|
| +/**
|
| + * Helper functions.
|
| + */
|
| +
|
| +function createStreams(constraints, numStreams, streamsSoFar = []) {
|
| + if (numStreams == 0) {
|
| + return Promise.resolve(streamsSoFar);;
|
| + }
|
| + return navigator.mediaDevices.getUserMedia(constraints)
|
| + .then(function(stream) {
|
| + return createStreams(constraints,
|
| + numStreams - 1,
|
| + streamsSoFar.concat([stream]));
|
| + });
|
| +}
|
| +</script>
|
| +</body>
|
| +</html>
|
|
|