blob: bcffc37e4477b330025187e97a1eed497e0e4d37 [file] [log] [blame]
<!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(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return createStreams({audio:true}, 1)
.then(function(streams) {
for (let i = 0; i < streams.length; ++i) {
pc.addStream(streams[i]);
}
verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, false);
verifyLocalStreamTracksHaveSenders(pc);
// Make sure object identities are preserved between calls.
assert_array_equals(pc.getSenders(), pc.getSenders());
});
}, 'getSenders() for a stream with a single audio track.');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return createStreams({video:true}, 1)
.then(function(streams) {
for (let i = 0; i < streams.length; ++i) {
pc.addStream(streams[i]);
}
verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, false, true);
verifyLocalStreamTracksHaveSenders(pc);
// Make sure object identities are preserved between calls.
assert_array_equals(pc.getSenders(), pc.getSenders());
});
}, 'getSenders() for a stream with a single video track.');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return createStreams({audio:true, video:true}, 1)
.then(function(streams) {
for (let i = 0; i < streams.length; ++i) {
pc.addStream(streams[i]);
}
verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, true);
verifyLocalStreamTracksHaveSenders(pc);
// Make sure object identities are preserved between calls.
assert_array_equals(pc.getSenders(), pc.getSenders());
});
}, 'getSenders() for a stream with an audio and video track.');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return createStreams({audio:true, video:true}, 2)
.then(function(streams) {
for (let i = 0; i < streams.length; ++i) {
pc.addStream(streams[i]);
}
verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true);
verifyLocalStreamTracksHaveSenders(pc);
// Make sure object identities are preserved between calls.
assert_array_equals(pc.getSenders(), pc.getSenders());
});
}, 'getSenders() for a multiple audio-video streams.');
promise_test(async t => {
const pc = new RTCPeerConnection({sdpSemantics:'plan-b'});
t.add_cleanup(() => pc.close());
let senders = new Set();
return createStreams({audio:true, video:true}, 2)
.then(function(streams) {
for (let i = 0; i < streams.length; ++i) {
pc.addStream(streams[i]);
}
verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true);
verifyLocalStreamTracksHaveSenders(pc);
// Make sure object identities are preserved between calls.
assert_array_equals(pc.getSenders(), pc.getSenders());
for (let i = 0; i < pc.getSenders().length; ++i)
senders.add(pc.getSenders()[i]);
// 2 senders per stream, one for audio and one for video
assert_equals(senders.size, 4);
pc.removeStream(pc.getLocalStreams()[0]);
verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, true);
verifyLocalStreamTracksHaveSenders(pc);
// Make sure object identities are preserved between calls.
assert_array_equals(pc.getSenders(), pc.getSenders());
for (let i = 0; i < pc.getSenders().length; ++i)
assert_true(senders.has(pc.getSenders()[i]));
return createStreams({audio:true, video:true}, 1);
})
.then(function(streams) {
for (let i = 0; i < streams.length; ++i) {
pc.addStream(streams[i]);
}
verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true);
verifyLocalStreamTracksHaveSenders(pc);
// Make sure object identities are preserved between calls.
assert_array_equals(pc.getSenders(), pc.getSenders());
// |senders| contains all senders so far (4), including the ones for
// the removed streams. The set does not contain duplicates, so adding all
// senders here should only increase the size for the new stream (2 new
// senders).
for (let i = 0; i < pc.getSenders().length; ++i)
senders.add(pc.getSenders()[i]);
assert_equals(senders.size, 6);
while (pc.getLocalStreams().length > 0) {
pc.removeStream(pc.getLocalStreams()[0]);
}
assert_equals(pc.getLocalStreams().length, 0);
assert_equals(pc.getSenders().length, 0);
});
}, 'getSenders() for streams being added and removed.');
promise_test(async t => {
const pc = new RTCPeerConnection({sdpSemantics:'plan-b'});
t.add_cleanup(() => pc.close());
return createStreams({audio:true, video:false}, 1)
.then(function(streams) {
let track = streams[0].getAudioTracks()[0];
let sender = pc.addTrack(track);
verifyTracksHaveSenders(pc, new Set([ track ]));
assert_equals(pc.getSenders()[0], sender);
pc.removeTrack(sender);
assert_equals(pc.getSenders().length, 0);
});
}, 'getSenders() for addTrack() and removeTrack().');
/**
* Helper functions to tests.
*/
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]));
});
}
function verifyStreamAndTrackCounts(streams, streamCount, audio, video) {
assert_equals(streams.length, streamCount);
for (let i = 0; i < streams.length; ++i) {
assert_equals(streams[i].getAudioTracks().length, audio ? 1 : 0);
assert_equals(streams[i].getVideoTracks().length, video ? 1 : 0);
}
}
function verifyLocalStreamTracksHaveSenders(pc) {
let localTracks = new Set();
let localStreams = pc.getLocalStreams();
for (let i = 0; i < localStreams.length; ++i) {
let localStreamTracks = localStreams[i].getTracks();
for (let j = 0; j < localStreamTracks.length; ++j) {
localTracks.add(localStreamTracks[j]);
}
}
return verifyTracksHaveSenders(pc, localTracks);
}
function verifyTracksHaveSenders(pc, tracks) {
let senderTracks = new Set();
let senders = pc.getSenders();
for (let i = 0; i < senders.length; ++i) {
assert_true(senders[i] != null);
assert_true(senders[i].track != null);
assert_true(tracks.has(senders[i].track));
assert_false(senderTracks.has(senders[i].track));
senderTracks.add(senders[i].track);
}
assert_equals(senderTracks.size, tracks.size);
}
</script>
</body>
</html>