tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

RTCRtpSender-transport.https.html (7658B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <meta name="timeout" content="long">
      4 <title>RTCRtpSender.transport</title>
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src="dictionary-helper.js"></script>
      8 <script src="RTCPeerConnection-helper.js"></script>
      9 <script>
     10  'use strict';
     11 
     12  // Spec link: http://w3c.github.io/webrtc-pc/#dom-rtcrtpsender-transport
     13  promise_test(async t => {
     14    const caller = new RTCPeerConnection();
     15    t.add_cleanup(() => caller.close());
     16    const stream = await getNoiseStream({audio: true});
     17    t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
     18    const [track] = stream.getTracks();
     19    const sender = caller.addTrack(track);
     20    assert_equals(sender.transport, null);
     21  }, 'RTCRtpSender.transport is null when unconnected');
     22 
     23  // Test for the simple/happy path of connecting a single track
     24  promise_test(async t => {
     25    const caller = new RTCPeerConnection();
     26    t.add_cleanup(() => caller.close());
     27    const stream = await getNoiseStream({audio: true});
     28    t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
     29    const [track] = stream.getTracks();
     30    const sender = caller.addTrack(track);
     31    const callee = new RTCPeerConnection();
     32    t.add_cleanup(() => callee.close());
     33    exchangeIceCandidates(caller, callee);
     34    await exchangeOfferAndListenToOntrack(t, caller, callee);
     35    assert_not_equals(sender.transport, null);
     36    const [transceiver] = caller.getTransceivers();
     37    assert_equals(transceiver.sender.transport,
     38                  transceiver.receiver.transport);
     39    assert_not_equals(sender.transport.iceTransport, null);
     40  }, 'RTCRtpSender/receiver.transport has a value when connected');
     41 
     42  // Test with multiple tracks, and checking details of when things show up
     43  // for different bundle policies.
     44  for (let bundle_policy of ['balanced', 'max-bundle', 'max-compat']) {
     45    promise_test(async t => {
     46        const caller = new RTCPeerConnection({bundlePolicy: bundle_policy});
     47      t.add_cleanup(() => caller.close());
     48      const stream = await getNoiseStream(
     49          {audio: true, video:true});
     50      t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
     51      const [track1, track2] = stream.getTracks();
     52      const sender1 = caller.addTrack(track1);
     53      const sender2 = caller.addTrack(track2);
     54      const callee = new RTCPeerConnection();
     55      t.add_cleanup(() => callee.close());
     56      exchangeIceCandidates(caller, callee);
     57      const offer = await caller.createOffer();
     58      assert_equals(sender1.transport, null);
     59      assert_equals(sender2.transport, null);
     60      await caller.setLocalDescription(offer);
     61      assert_not_equals(sender1.transport, null);
     62      assert_not_equals(sender2.transport, null);
     63      const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers();
     64      assert_equals(sender1.transport, caller_transceiver1.sender.transport);
     65      if (bundle_policy == 'max-bundle') {
     66        assert_equals(caller_transceiver1.sender.transport,
     67                      caller_transceiver2.sender.transport);
     68      } else {
     69        assert_not_equals(caller_transceiver1.sender.transport,
     70                          caller_transceiver2.sender.transport);
     71      }
     72      await callee.setRemoteDescription(offer);
     73      const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers();
     74      // According to spec, setRemoteDescription only updates the transports
     75      // if the remote description is an answer.
     76      assert_equals(callee_transceiver1.receiver.transport, null);
     77      assert_equals(callee_transceiver2.receiver.transport, null);
     78      const answer = await callee.createAnswer();
     79      await callee.setLocalDescription(answer);
     80      assert_not_equals(callee_transceiver1.receiver.transport, null);
     81      assert_not_equals(callee_transceiver2.receiver.transport, null);
     82      // At this point, bundle should have kicked in.
     83      assert_equals(callee_transceiver1.receiver.transport,
     84                    callee_transceiver2.receiver.transport);
     85      await caller.setRemoteDescription(answer);
     86      assert_equals(caller_transceiver1.receiver.transport,
     87                    caller_transceiver2.receiver.transport);
     88    }, 'RTCRtpSender/receiver.transport at the right time, with bundle policy ' + bundle_policy);
     89 
     90    // Do the same test again, with DataChannel in the mix.
     91    promise_test(async t => {
     92        const caller = new RTCPeerConnection({bundlePolicy: bundle_policy});
     93      t.add_cleanup(() => caller.close());
     94      const stream = await getNoiseStream(
     95          {audio: true, video:true});
     96      t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
     97      const [track1, track2] = stream.getTracks();
     98      const sender1 = caller.addTrack(track1);
     99      const sender2 = caller.addTrack(track2);
    100      caller.createDataChannel('datachannel');
    101      const callee = new RTCPeerConnection();
    102      t.add_cleanup(() => callee.close());
    103      exchangeIceCandidates(caller, callee);
    104      const offer = await caller.createOffer();
    105      assert_equals(sender1.transport, null);
    106      assert_equals(sender2.transport, null);
    107      if (caller.sctp) {
    108        assert_equals(caller.sctp.transport, null);
    109      }
    110      await caller.setLocalDescription(offer);
    111      assert_not_equals(sender1.transport, null);
    112      assert_not_equals(sender2.transport, null);
    113      assert_not_equals(caller.sctp.transport, null);
    114      const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers();
    115      assert_equals(sender1.transport, caller_transceiver1.sender.transport);
    116      if (bundle_policy == 'max-bundle') {
    117        assert_equals(caller_transceiver1.sender.transport,
    118                      caller_transceiver2.sender.transport);
    119        assert_equals(caller_transceiver1.sender.transport,
    120                      caller.sctp.transport);
    121      } else {
    122        assert_not_equals(caller_transceiver1.sender.transport,
    123                          caller_transceiver2.sender.transport);
    124        assert_not_equals(caller_transceiver1.sender.transport,
    125                      caller.sctp.transport);
    126      }
    127      await callee.setRemoteDescription(offer);
    128      const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers();
    129      // According to spec, setRemoteDescription only updates the transports
    130      // if the remote description is an answer.
    131      assert_equals(callee_transceiver1.receiver.transport, null);
    132      assert_equals(callee_transceiver2.receiver.transport, null);
    133      const answer = await callee.createAnswer();
    134      await callee.setLocalDescription(answer);
    135      assert_not_equals(callee_transceiver1.receiver.transport, null);
    136      assert_not_equals(callee_transceiver2.receiver.transport, null);
    137      assert_not_equals(callee.sctp.transport, null);
    138      // At this point, bundle should have kicked in.
    139      assert_equals(callee_transceiver1.receiver.transport,
    140                    callee_transceiver2.receiver.transport);
    141      assert_equals(callee_transceiver1.receiver.transport,
    142                    callee.sctp.transport,
    143                    'Callee SCTP transport does not match:');
    144      await caller.setRemoteDescription(answer);
    145      assert_equals(caller_transceiver1.receiver.transport,
    146                    caller_transceiver2.receiver.transport);
    147      assert_equals(caller_transceiver1.receiver.transport,
    148                    caller.sctp.transport,
    149                    'Caller SCTP transport does not match:');
    150    }, 'RTCRtpSender/receiver/SCTP transport at the right time, with bundle policy ' + bundle_policy);
    151  }
    152 </script>