<!doctype html>
<meta charset=utf-8>
<title>RTCRtpReceiver</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
  'use strict';

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    assert_equals(transceiver.receiver.transport, null);
  }, 'RTCRtpReceiver should have a null transport initially');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    await pc1.setLocalDescription();
    assert_true(transceiver.receiver.transport instanceof RTCDtlsTransport);
  }, 'RTCRtpReceiver should have a transport after sLD(offer)');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    await pc1.setLocalDescription();
    await pc1.setLocalDescription({type: 'rollback', sdp: ''});
    assert_equals(transceiver.receiver.transport, null);
  }, 'RTCRtpReceiver should have a null transport after rollback of sLD(offer)');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();
    t.add_cleanup(() => pc2.close());
    const receiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    await pc2.setRemoteDescription(await pc1.createOffer());
    const transceiver = pc2.getTransceivers()[0];
    assert_equals(transceiver.receiver.transport, null);
  }, 'RTCRtpReceiver should have a null transport after sRD(offer)');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    await pc1.setLocalDescription();
    assert_true(transceiver.sender.transport instanceof RTCDtlsTransport);
    assert_true(transceiver.receiver.transport instanceof RTCDtlsTransport);
    assert_equals(transceiver.receiver.transport, transceiver.sender.transport);
  }, 'RTCRtpReceiver should have the same transport object as its corresponding RTCRtpSender');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection({bundlePolicy: 'max-bundle'});
    t.add_cleanup(() => pc1.close());
    const audioTransceiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    const videoTransceiver = pc1.addTransceiver('video', { direction: 'recvonly' });
    await pc1.setLocalDescription();
    assert_equals(videoTransceiver.receiver.transport, audioTransceiver.receiver.transport);
  }, 'RTCRtpReceivers that share a bundle transport should have the same transport object');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection({bundlePolicy: 'max-compat'});
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();
    t.add_cleanup(() => pc2.close());
    const audioTransceiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    const videoTransceiver = pc1.addTransceiver('video', { direction: 'recvonly' });
    await pc1.setLocalDescription();
    assert_not_equals(videoTransceiver.receiver.transport, audioTransceiver.receiver.transport);
    await pc2.setRemoteDescription(pc1.localDescription);
    await pc1.setRemoteDescription(await pc2.createAnswer());
    // pc2 will accept the bundle, so these should be the same now
    assert_equals(videoTransceiver.receiver.transport, audioTransceiver.receiver.transport);
  }, 'RTCRtpReceivers that do not necessarily share a bundle transport should not have the same transport object');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();
    t.add_cleanup(() => pc2.close());

    const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' });
    await pc1.setLocalDescription();
    const transportBefore = transceiver.receiver.transport;

    await pc2.setRemoteDescription(pc1.localDescription);
    await pc1.setRemoteDescription(await pc2.createAnswer());
    await pc1.setLocalDescription(await pc1.createOffer({iceRestart: true}));

    const transportAfter = transceiver.receiver.transport;
    assert_equals(transportAfter, transportBefore);
  }, 'RTCRtpReceiver should have the same transport object after an ICE restart');

</script>
