summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc/RTCRtpSender-transport.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webrtc/RTCRtpSender-transport.https.html')
-rw-r--r--testing/web-platform/tests/webrtc/RTCRtpSender-transport.https.html152
1 files changed, 152 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCRtpSender-transport.https.html b/testing/web-platform/tests/webrtc/RTCRtpSender-transport.https.html
new file mode 100644
index 0000000000..cd419ebc18
--- /dev/null
+++ b/testing/web-platform/tests/webrtc/RTCRtpSender-transport.https.html
@@ -0,0 +1,152 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>RTCRtpSender.transport</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Spec link: http://w3c.github.io/webrtc-pc/#dom-rtcrtpsender-transport
+ promise_test(async t => {
+ const caller = new RTCPeerConnection();
+ t.add_cleanup(() => caller.close());
+ const stream = await getNoiseStream({audio: true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+ const [track] = stream.getTracks();
+ const sender = caller.addTrack(track);
+ assert_equals(sender.transport, null);
+ }, 'RTCRtpSender.transport is null when unconnected');
+
+ // Test for the simple/happy path of connecting a single track
+ promise_test(async t => {
+ const caller = new RTCPeerConnection();
+ t.add_cleanup(() => caller.close());
+ const stream = await getNoiseStream({audio: true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+ const [track] = stream.getTracks();
+ const sender = caller.addTrack(track);
+ const callee = new RTCPeerConnection();
+ t.add_cleanup(() => callee.close());
+ exchangeIceCandidates(caller, callee);
+ await exchangeOfferAndListenToOntrack(t, caller, callee);
+ assert_not_equals(sender.transport, null);
+ const [transceiver] = caller.getTransceivers();
+ assert_equals(transceiver.sender.transport,
+ transceiver.receiver.transport);
+ assert_not_equals(sender.transport.iceTransport, null);
+ }, 'RTCRtpSender/receiver.transport has a value when connected');
+
+ // Test with multiple tracks, and checking details of when things show up
+ // for different bundle policies.
+ for (let bundle_policy of ['balanced', 'max-bundle', 'max-compat']) {
+ promise_test(async t => {
+ const caller = new RTCPeerConnection({bundlePolicy: bundle_policy});
+ t.add_cleanup(() => caller.close());
+ const stream = await getNoiseStream(
+ {audio: true, video:true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+ const [track1, track2] = stream.getTracks();
+ const sender1 = caller.addTrack(track1);
+ const sender2 = caller.addTrack(track2);
+ const callee = new RTCPeerConnection();
+ t.add_cleanup(() => callee.close());
+ exchangeIceCandidates(caller, callee);
+ const offer = await caller.createOffer();
+ assert_equals(sender1.transport, null);
+ assert_equals(sender2.transport, null);
+ await caller.setLocalDescription(offer);
+ assert_not_equals(sender1.transport, null);
+ assert_not_equals(sender2.transport, null);
+ const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers();
+ assert_equals(sender1.transport, caller_transceiver1.sender.transport);
+ if (bundle_policy == 'max-bundle') {
+ assert_equals(caller_transceiver1.sender.transport,
+ caller_transceiver2.sender.transport);
+ } else {
+ assert_not_equals(caller_transceiver1.sender.transport,
+ caller_transceiver2.sender.transport);
+ }
+ await callee.setRemoteDescription(offer);
+ const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers();
+ // According to spec, setRemoteDescription only updates the transports
+ // if the remote description is an answer.
+ assert_equals(callee_transceiver1.receiver.transport, null);
+ assert_equals(callee_transceiver2.receiver.transport, null);
+ const answer = await callee.createAnswer();
+ await callee.setLocalDescription(answer);
+ assert_not_equals(callee_transceiver1.receiver.transport, null);
+ assert_not_equals(callee_transceiver2.receiver.transport, null);
+ // At this point, bundle should have kicked in.
+ assert_equals(callee_transceiver1.receiver.transport,
+ callee_transceiver2.receiver.transport);
+ await caller.setRemoteDescription(answer);
+ assert_equals(caller_transceiver1.receiver.transport,
+ caller_transceiver2.receiver.transport);
+ }, 'RTCRtpSender/receiver.transport at the right time, with bundle policy ' + bundle_policy);
+
+ // Do the same test again, with DataChannel in the mix.
+ promise_test(async t => {
+ const caller = new RTCPeerConnection({bundlePolicy: bundle_policy});
+ t.add_cleanup(() => caller.close());
+ const stream = await getNoiseStream(
+ {audio: true, video:true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+ const [track1, track2] = stream.getTracks();
+ const sender1 = caller.addTrack(track1);
+ const sender2 = caller.addTrack(track2);
+ caller.createDataChannel('datachannel');
+ const callee = new RTCPeerConnection();
+ t.add_cleanup(() => callee.close());
+ exchangeIceCandidates(caller, callee);
+ const offer = await caller.createOffer();
+ assert_equals(sender1.transport, null);
+ assert_equals(sender2.transport, null);
+ if (caller.sctp) {
+ assert_equals(caller.sctp.transport, null);
+ }
+ await caller.setLocalDescription(offer);
+ assert_not_equals(sender1.transport, null);
+ assert_not_equals(sender2.transport, null);
+ assert_not_equals(caller.sctp.transport, null);
+ const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers();
+ assert_equals(sender1.transport, caller_transceiver1.sender.transport);
+ if (bundle_policy == 'max-bundle') {
+ assert_equals(caller_transceiver1.sender.transport,
+ caller_transceiver2.sender.transport);
+ assert_equals(caller_transceiver1.sender.transport,
+ caller.sctp.transport);
+ } else {
+ assert_not_equals(caller_transceiver1.sender.transport,
+ caller_transceiver2.sender.transport);
+ assert_not_equals(caller_transceiver1.sender.transport,
+ caller.sctp.transport);
+ }
+ await callee.setRemoteDescription(offer);
+ const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers();
+ // According to spec, setRemoteDescription only updates the transports
+ // if the remote description is an answer.
+ assert_equals(callee_transceiver1.receiver.transport, null);
+ assert_equals(callee_transceiver2.receiver.transport, null);
+ const answer = await callee.createAnswer();
+ await callee.setLocalDescription(answer);
+ assert_not_equals(callee_transceiver1.receiver.transport, null);
+ assert_not_equals(callee_transceiver2.receiver.transport, null);
+ assert_not_equals(callee.sctp.transport, null);
+ // At this point, bundle should have kicked in.
+ assert_equals(callee_transceiver1.receiver.transport,
+ callee_transceiver2.receiver.transport);
+ assert_equals(callee_transceiver1.receiver.transport,
+ callee.sctp.transport,
+ 'Callee SCTP transport does not match:');
+ await caller.setRemoteDescription(answer);
+ assert_equals(caller_transceiver1.receiver.transport,
+ caller_transceiver2.receiver.transport);
+ assert_equals(caller_transceiver1.receiver.transport,
+ caller.sctp.transport,
+ 'Caller SCTP transport does not match:');
+ }, 'RTCRtpSender/receiver/SCTP transport at the right time, with bundle policy ' + bundle_policy);
+ }
+ </script>