<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.setRemoteDescription pranswer</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-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 RTCPeerConnection-helper.js:
  //   generateAnswer
  //   assert_session_desc_similar

  /*
    4.3.2.  Interface Definition
      [Constructor(optional RTCConfiguration configuration)]
      interface RTCPeerConnection : EventTarget {
        Promise<void>                      setLocalDescription(
            RTCSessionDescriptionInit description);

        readonly attribute RTCSessionDescription? localDescription;
        readonly attribute RTCSessionDescription? currentLocalDescription;
        readonly attribute RTCSessionDescription? pendingLocalDescription;

        Promise<void>                      setRemoteDescription(
            RTCSessionDescriptionInit description);

        readonly attribute RTCSessionDescription? remoteDescription;
        readonly attribute RTCSessionDescription? currentRemoteDescription;
        readonly attribute RTCSessionDescription? pendingRemoteDescription;
        ...
      };

    4.6.2.  RTCSessionDescription Class
      dictionary RTCSessionDescriptionInit {
        required RTCSdpType type;
                 DOMString  sdp = "";
      };

    4.6.1.  RTCSdpType
      enum RTCSdpType {
        "offer",
        "pranswer",
        "answer",
        "rollback"
      };
   */

  /*
    4.3.1.6.  Set the RTCSessionSessionDescription
      2.1.3.  If the description's type is invalid for the current signaling state of
              connection, then reject p with a newly created InvalidStateError and abort
              these steps.

    [JSEP]
      5.6.  If the type is "pranswer" or "answer", the PeerConnection state MUST be either
            "have-local-offer" or "have-remote-pranswer".
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();

    t.add_cleanup(() => pc.close());

    return pc.createOffer()
    .then(offer =>
      promise_rejects(t, 'InvalidStateError',
        pc.setRemoteDescription({ type: 'pranswer', sdp: offer.sdp })));
  }, 'setRemoteDescription(pranswer) from stable state should reject with InvalidStateError');

  /*
    4.3.1.6.  Set the RTCSessionSessionDescription
      2.2.3.  Otherwise, if description is set as a remote description, then run one
              of the following steps:
        - If description is of type "pranswer", then set
          connection.pendingRemoteDescription to description and signaling state
          to have-remote-pranswer.
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());

    const states = [];
    pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));

    return generateVideoReceiveOnlyOffer(pc)
    .then(offer =>
      pc.setLocalDescription(offer)
      .then(() => generateAnswer(offer))
      .then(answer => {
        const pranswer = { type: 'pranswer', sdp: answer.sdp };

        return pc.setRemoteDescription(pranswer)
        .then(() => {
          assert_equals(pc.signalingState, 'have-remote-pranswer');

          assert_session_desc_similar(pc.localDescription, offer);
          assert_session_desc_similar(pc.pendingLocalDescription, offer);
          assert_equals(pc.currentLocalDescription, null);

          assert_session_desc_similar(pc.remoteDescription, pranswer);
          assert_session_desc_similar(pc.pendingRemoteDescription, pranswer);
          assert_equals(pc.currentRemoteDescription, null);

          assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer']);
        });
      }));
  }, 'setRemoteDescription(pranswer) from have-local-offer state should succeed');

  promise_test(t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());

    const states = [];
    pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));

    return generateVideoReceiveOnlyOffer(pc)
    .then(offer =>
      pc.setLocalDescription(offer)
      .then(() => generateAnswer(offer))
      .then(answer => {
        const pranswer = { type: 'pranswer', sdp: answer.sdp };

        return pc.setRemoteDescription(pranswer)
        .then(() => pc.setRemoteDescription(pranswer))
        .then(() => {
          assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer']);
        });
      }));
  }, 'setRemoteDescription(pranswer) multiple times should succeed');

  promise_test(t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());

    const states = [];
    pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));

    return generateVideoReceiveOnlyOffer(pc)
    .then(offer =>
      pc.setLocalDescription(offer)
      .then(() => generateAnswer(offer))
      .then(answer => {
        const pranswer = { type: 'pranswer', sdp: answer.sdp };

        return pc.setRemoteDescription(pranswer)
        .then(() => pc.setRemoteDescription(answer))
        .then(() => {
          assert_equals(pc.signalingState, 'stable');

          assert_session_desc_similar(pc.localDescription, offer);
          assert_session_desc_similar(pc.currentLocalDescription, offer);
          assert_equals(pc.pendingLocalDescription, null);

          assert_session_desc_similar(pc.remoteDescription, answer);
          assert_session_desc_similar(pc.currentRemoteDescription, answer);
          assert_equals(pc.pendingRemoteDescription, null);

          assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer', 'stable']);
        });
      }));
  }, 'setRemoteDescription(answer) from have-remote-pranswer state should succeed');

</script>
