<!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.

        - transactionId and degradationPreference are 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.getReceivers()[0].getParameters();
    validateReceiverRtpParameters(param);

    assert_greater_than(param.headerExtensions.length, 0);
    assert_greater_than(param.codecs.length, 0);
    assert_equals(param.encodings.length, 1);
  }, '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.getReceivers()[0].getParameters();
    validateReceiverRtpParameters(param);

    assert_greater_than(param.headerExtensions.length, 0);
    assert_greater_than(param.codecs.length, 0);
    assert_equals(param.encodings.length, 1);
  }, '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.getReceivers()[0].getParameters();
    validateReceiverRtpParameters(param);

    assert_greater_than(param.headerExtensions.length, 0);
    assert_greater_than(param.codecs.length, 0);
    assert_equals(param.encodings.length, 2, 'layer count must match');
    assert_equals(param.encodings[0].rid, "rid1",
      'simulcast rids must match');
    assert_equals(param.encodings[1].rid, "rid2",
      'simulcast rids must match');
  }, 'getParameters() with simulcast video receiver');
</script>
