<!doctype html>
<meta charset=utf-8>
<title>RTCRtpParameters rtcp</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:
  //   validateSenderRtpParameters

  /*
    5.2.  RTCRtpSender Interface
      interface RTCRtpSender {
        Promise<void>           setParameters(optional RTCRtpParameters parameters);
        RTCRtpParameters        getParameters();
      };

      dictionary RTCRtpParameters {
        DOMString                                 transactionId;
        sequence<RTCRtpEncodingParameters>        encodings;
        sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
        RTCRtcpParameters                         rtcp;
        sequence<RTCRtpCodecParameters>           codecs;
        RTCDegradationPreference                  degradationPreference;
      };

      dictionary RTCRtcpParameters {
        [readonly]
        DOMString cname;

        [readonly]
        boolean   reducedSize;
      };

      getParameters
        - rtcp.cname is set to the CNAME of the associated RTCPeerConnection.

          rtcp.reducedSize is set to true if reduced-size RTCP has been negotiated for
          sending, and false otherwise.
   */

  /*
    5.2.  setParameters
      7.  If parameters.encodings.length is different from N, or if any parameter
          in the parameters argument, marked as a Read-only parameter, has a value
          that is different from the corresponding parameter value returned from
          sender.getParameters(), abort these steps and return a promise rejected
          with a newly created InvalidModificationError. Note that this also applies
          to transactionId.
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());
    const { sender } = pc.addTransceiver('audio');

    const param = sender.getParameters();
    validateSenderRtpParameters(param);

    const { rtcp } = param;

    if(rtcp === undefined) {
      param.rtcp = { cname: 'foo' };

    } else if(rtcp.cname === undefined) {
      rtcp.cname = 'foo';

    } else {
      rtcp.cname = `${rtcp.cname}-modified`;
    }

    return promise_rejects(t, 'InvalidModificationError',
      sender.setParameters(param));
  }, `setParameters() with modified rtcp.cname should reject with InvalidModificationError`);

  promise_test(t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());
    const { sender } = pc.addTransceiver('audio');

    const param = sender.getParameters();
    validateSenderRtpParameters(param);

    const { rtcp } = param;

    if(rtcp === undefined) {
      param.rtcp = { reducedSize: true };

    } else if(rtcp.reducedSize === undefined) {
      rtcp.reducedSize = true;

    } else {
      rtcp.reducedSize = !rtcp.reducedSize;
    }

    return promise_rejects(t, 'InvalidModificationError',
      sender.setParameters(param));
  }, `setParameters() with modified rtcp.reducedSize should reject with InvalidModificationError`);

</script>
