blob: b69eaabea0b7da8cf97cc8321ea775a2e6c63cf6 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>RTCPeerConnection.getRemoteStreams</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<script>
// This is not an external/wpt/webrtc/ test because it tests APIs and behaviors
// that are not in the spec.
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
return navigator.mediaDevices.getUserMedia({audio:true})
.then((stream) => {
caller.addStream(stream);
return createAndSetOffer(caller, callee);
}).then(() => {
assert_stream_array_equals(caller.getLocalStreams(),
callee.getRemoteStreams(),
'Comparing local and remote streams.');
});
}, 'callee.getRemoteStreams() should match caller.getLocalStreams() for ' +
'one stream with one track.');
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
return navigator.mediaDevices.getUserMedia({audio:true, video:true})
.then((stream) => {
caller.addStream(stream);
return createAndSetOffer(caller, callee);
}).then(() => {
assert_stream_array_equals(caller.getLocalStreams(),
callee.getRemoteStreams(),
'Comparing local and remote streams.');
});
}, 'callee.getRemoteStreams() should match caller.getLocalStreams() for ' +
'one stream with two tracks.');
promise_test(async t => {
const caller = new RTCPeerConnection({sdpSemantics:'plan-b'});
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection({sdpSemantics:'plan-b'});
t.add_cleanup(() => callee.close());
let localStreams = null;
return Promise.all([
navigator.mediaDevices.getUserMedia({audio:true, video:true}),
navigator.mediaDevices.getUserMedia({audio:true, video:true})
]).then((streams) => {
localStreams = streams;
caller.addStream(localStreams[0]);
caller.addStream(localStreams[1]);
return createAndSetOffer(caller, callee);
}).then(() => {
assert_stream_array_equals(
caller.getLocalStreams(), callee.getRemoteStreams(),
'Comparing local and remote streams after adding two streams.');
// Remove the first stream.
caller.removeStream(localStreams[0]);
return createAndSetOffer(caller, callee);
}).then(() => {
assert_stream_array_equals(
caller.getLocalStreams(), callee.getRemoteStreams(),
'Comparing local and remote streams after removing the first stream.');
// Re-add the first stream. This should change the stream order.
caller.addStream(localStreams[0]);
assert_array_equals(caller.getLocalStreams(),
[ localStreams[1], localStreams[0] ]);
return createAndSetOffer(caller, callee);
}).then(() => {
assert_stream_array_equals(
caller.getLocalStreams(), callee.getRemoteStreams(),
'Comparing local and remote streams after re-adding the first stream.');
});
}, 'callee.getRemoteStreams() should match caller.getLocalStreams() for ' +
'a stream that is removed and re-added.');
function createAndSetOffer(caller, callee) {
let description = null;
return caller.createOffer()
.then(offer => {
description = offer;
return caller.setLocalDescription(description);
}).then(() => {
return callee.setRemoteDescription(description);
});
}
// The streams are considered equal if their IDs and track IDs match.
function assert_stream_equals(streamA, streamB, description) {
assert_equals(streamA.id, streamB.id,
description + ' The stream IDs don\'t match.');
assert_equals(streamA.getTracks().length, streamB.getTracks().length,
description + ' The number of tracks don\'t match.');
for (let i = 0; i < streamA.getTracks().length; ++i) {
assert_equals(streamA.getTracks()[i].id, streamB.getTracks()[i].id,
description + ' The ' + i + '-th track IDs don\'t match.');
}
}
function assert_stream_array_equals(streamsA, streamsB, description) {
assert_equals(streamsA.length, streamsB.length,
description + ' The number of streams don\'t match.');
for (let i = 0; i < streamsA.length; ++i) {
assert_stream_equals(
streamsA[i], streamsB[i],
description + ' The ' + i + '-th streams don\'t match.');
}
}
</script>
</body>
</html>