<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.setLocalDescription</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.2.  If description is set as a local description, then run one of the following
              steps:

        - If description is of type "answer", then this completes an offer answer
          negotiation.

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

          Set both pendingRemoteDescription and pendingLocalDescription to null.

          Finally set connection'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.setRemoteDescription(offer)
      .then(() => pc.createAnswer())
      .then(answer =>
        pc.setLocalDescription(answer)
        .then(() => {
          assert_equals(pc.signalingState, 'stable');
          assert_session_desc_similar(pc.localDescription, answer);
          assert_session_desc_similar(pc.remoteDescription, offer);

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

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

          assert_array_equals(states, ['have-remote-offer', 'stable']);
        })));
  }, 'setLocalDescription() with valid answer should succeed');

  /*
    4.3.2.  setLocalDescription
      3.  Let lastAnswer be the result returned by the last call to createAnswer.
      4.  If description.sdp is null and description.type is answer, set description.sdp
          to lastAnswer.
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();

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

    return generateVideoReceiveOnlyOffer(pc)
    .then(offer =>
      pc.setRemoteDescription(offer)
      .then(() => pc.createAnswer())
      .then(answer =>
        pc.setLocalDescription({ type: 'answer' })
        .then(() => {
          assert_equals(pc.signalingState, 'stable');
          assert_session_desc_similar(pc.localDescription, answer);
          assert_session_desc_similar(pc.remoteDescription, offer);

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

          assert_equals(pc.pendingLocalDescription, null);
          assert_equals(pc.pendingRemoteDescription, null);
        })));
  }, 'setLocalDescription() with type answer and null sdp should use lastAnswer generated from createAnswer');

  /*
    4.3.2.  setLocalDescription
      3.  Let lastAnswer be the result returned by the last call to createAnswer.
      7.  If description.type is answer and description.sdp does not match lastAnswer,
          reject the promise with a newly created InvalidModificationError and abort these
          steps.
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();

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

    return generateVideoReceiveOnlyOffer(pc)
    .then(offer =>
      pc.setRemoteDescription(offer)
      .then(() => generateAnswer(offer))
      .then(answer => pc.setLocalDescription(answer))
      .then(() => t.unreached_func("setLocalDescription should have rejected"),
            (error) => assert_equals(error.name, 'InvalidModificationError')));
  }, 'setLocalDescription() with answer not created by own createAnswer() should reject with InvalidModificationError');

  /*
    4.3.1.6.  Set the RTCSessionSessionDescription
      2.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.5. If the type is "pranswer" or "answer", the PeerConnection
           state MUST be either "have-remote-offer" or "have-local-pranswer".
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();

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

    return pc.createOffer()
    .then(offer =>
      promise_rejects_dom(t, 'InvalidModificationError',
        pc.setLocalDescription({ type: 'answer', sdp: offer.sdp })));
  }, 'Calling setLocalDescription(answer) from stable state should reject with InvalidModificationError');

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

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

    return pc.createOffer()
    .then(offer =>
      pc.setLocalDescription(offer)
      .then(() => generateAnswer(offer)))
    .then(answer =>
      promise_rejects_dom(t, 'InvalidModificationError',
        pc.setLocalDescription(answer)));
  }, 'Calling setLocalDescription(answer) from have-local-offer state should reject with InvalidModificationError');

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();
    t.add_cleanup(() => pc2.close());

    pc1.addTransceiver('audio', { direction: 'recvonly' });
    const offer = await pc1.createOffer();
    await pc2.setRemoteDescription(offer);
    const answer = await pc2.createAnswer(); // [[LastAnswer]] slot set
    await pc2.setRemoteDescription({type: "rollback"});
    pc2.addTransceiver('video', { direction: 'recvonly' });
    await pc2.createOffer(); // [[LastOffer]] slot set
    await pc2.setRemoteDescription(offer);
    await pc2.setLocalDescription(answer); // Should check against [[LastAnswer]], not [[LastOffer]]
  }, "Setting previously generated answer after a call to createOffer should work");

  promise_test(async t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();
    t.add_cleanup(() => pc2.close());

    pc1.addTransceiver('audio', { direction: 'recvonly' });
    await pc2.setRemoteDescription(await pc1.createOffer());
    const answer = await pc2.createAnswer();
    const sldPromise = pc2.setLocalDescription(answer);

    assert_equals(pc2.signalingState, "have-remote-offer", "signalingState should not be set synchronously after a call to sLD");

    assert_equals(pc2.pendingLocalDescription, null, "pendingLocalDescription should never be set due to sLD(answer)");
    assert_not_equals(pc2.pendingRemoteDescription, null, "pendingRemoteDescription should not be set synchronously after a call to sLD");
    assert_equals(pc2.pendingRemoteDescription.type, "offer");
    assert_equals(pc2.remoteDescription.sdp, pc2.pendingRemoteDescription.sdp);
    assert_equals(pc2.currentLocalDescription, null, "currentLocalDescription should not be set synchronously after a call to sLD");
    assert_equals(pc2.currentRemoteDescription, null, "currentRemoteDescription should not be set synchronously after a call to sLD");

    const stablePromise = new Promise(resolve => {
      pc2.onsignalingstatechange = () => {
        resolve(pc2.signalingState);
      }
    });
    const raceValue = await Promise.race([stablePromise, sldPromise]);
    assert_equals(raceValue, "stable", "signalingstatechange event should fire before sLD resolves");
    assert_equals(pc2.pendingLocalDescription, null, "pendingLocalDescription should never be set due to sLD(answer)");
    assert_equals(pc2.pendingRemoteDescription, null, "pendingRemoteDescription should be updated before the signalingstatechange event");
    assert_not_equals(pc2.currentLocalDescription, null, "currentLocalDescription should be updated before the signalingstatechange event");
    assert_equals(pc2.currentLocalDescription.type, "answer");
    assert_equals(pc2.currentLocalDescription.sdp, pc2.localDescription.sdp);
    assert_not_equals(pc2.currentRemoteDescription, null, "currentRemoteDescription should be updated before the signalingstatechange event");
    assert_equals(pc2.currentRemoteDescription.type, "offer");
    assert_equals(pc2.currentRemoteDescription.sdp, pc2.remoteDescription.sdp);

    await sldPromise;
  }, "setLocalDescription(answer) should update internal state with a queued task, in the right order");

</script>
