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

  // Test is based on the following editor draft:
  // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html

  // The following helper functions are called from RTCRtpParameters-helper.js:
  //   validateReceiverRtpParameters

  /*
    Validates the RTCRtpParameters returned from RTCRtpReceiver.prototype.getParameters

    5.3.  RTCRtpReceiver Interface
      getParameters
        When getParameters is called, the RTCRtpParameters dictionary is constructed
        as follows:

        - The headerExtensions sequence is populated based on the header extensions that
          the receiver is currently prepared to receive.

        - The codecs sequence is populated based on the codecs that the receiver is currently
          prepared to receive.

        - rtcp.reducedSize is set to true if the receiver is currently prepared to receive
          reduced-size RTCP packets, and false otherwise. rtcp.cname is left undefined.
  */
  promise_test(async t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());
    pc.addTransceiver('audio');
    const callee = await doOfferAnswerExchange(t, pc);
    const param = callee.getTransceivers()[0].receiver.getParameters();
    validateReceiverRtpParameters(param);

    assert_greater_than(param.headerExtensions.length, 0);
    assert_greater_than(param.codecs.length, 0);
  }, 'getParameters() with audio receiver');

  promise_test(async t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());
    pc.addTransceiver('video');
    const callee = await doOfferAnswerExchange(t, pc);
    const param = callee.getTransceivers()[0].receiver.getParameters();
    validateReceiverRtpParameters(param);

    assert_greater_than(param.headerExtensions.length, 0);
    assert_greater_than(param.codecs.length, 0);
  }, 'getParameters() with video receiver');

  promise_test(async t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());
    pc.addTransceiver('video', {
      sendEncodings: [
        { rid: "rid1" },
        { rid: "rid2" }
      ]
    });
    const callee = await doOfferAnswerExchange(t, pc);
    const param = callee.getTransceivers()[0].receiver.getParameters();
    validateReceiverRtpParameters(param);
    assert_greater_than(param.headerExtensions.length, 0);
    assert_greater_than(param.codecs.length, 0);
  }, 'getParameters() with simulcast video receiver');
</script>
