<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.setRemoteDescription - answer</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>                      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.2.3.  Otherwise, if description is set as a remote description, then run one of
              the following steps:
        - If description is of type "answer", then this completes an offer answer
          negotiation.

          Set connection's currentRemoteDescription to description and
          currentLocalDescription to the value of pendingLocalDescription.

          Set both pendingRemoteDescription and pendingLocalDescription to null.

          Finally setconnection's signaling state to stable.
   */
  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 =>
        pc.setRemoteDescription(answer)
        .then(() => {
          assert_equals(pc.signalingState, 'stable');

          assert_session_desc_similar(pc.localDescription, offer);
          assert_session_desc_similar(pc.remoteDescription, answer);

          assert_session_desc_similar(pc.currentLocalDescription, offer);
          assert_session_desc_similar(pc.currentRemoteDescription, answer);

          assert_equals(pc.pendingLocalDescription, null);
          assert_equals(pc.pendingRemoteDescription, null);

          assert_array_equals(states, ['have-local-offer', 'stable']);
        })));
  }, 'setRemoteDescription() with valid state and answer should succeed');

  /*
    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 "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: 'answer', sdp: offer.sdp })));
  }, 'Calling setRemoteDescription(answer) from stable state should reject with InvalidStateError');

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

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

    return pc.createOffer()
    .then(offer =>
      pc.setRemoteDescription(offer)
      .then(() => generateAnswer(offer)))
    .then(answer =>
      promise_rejects(t, 'InvalidStateError',
        pc.setRemoteDescription(answer)));
  }, 'Calling setRemoteDescription(answer) from have-remote-offer state should reject with InvalidStateError');

</script>
