<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.createAnswer</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/20170515/webrtc.html

  // The following helper functions are called from RTCPeerConnection-helper.js:
  //   generateDataChannelOffer()

  /*
   * 4.3.2. createAnswer()
   */

  /*
   *  4.1.  If connection's remoteDescription is null return a promise rejected with a
   *        newly created InvalidStateError.
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();
    t.add_cleanup(() => pc.close());
    return promise_rejects_dom(t, 'InvalidStateError',
      pc.createAnswer());
  }, 'createAnswer() with null remoteDescription should reject with InvalidStateError');

  /*
   *  Final steps to create an answer
   *  4. Let answer be a newly created RTCSessionDescriptionInit dictionary with its
   *     type member initialized to the string "answer" and its sdp member initialized to sdpString.
   */
  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 => {
      assert_equals(typeof answer, 'object',
        'Expect answer to be plain object dictionary RTCSessionDescriptionInit');

      assert_false(answer instanceof RTCSessionDescription,
        'Expect answer to not be instance of RTCSessionDescription')
    });
  }, 'createAnswer() after setting remote description should succeed');

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

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

    return generateDataChannelOffer(pc)
    .then(offer => pc.setRemoteDescription(offer))
    .then(() => {
      pc.close();
      return promise_rejects_dom(t, 'InvalidStateError',
        pc.createAnswer());
    });
  }, 'createAnswer() when connection is closed reject with InvalidStateError');

  /*
   *  TODO
   *  4.3.2 createAnswer
   *    3.  If connection is configured with an identity provider, and an
   *        identity assertion has not yet been generated using said
   *        identity provider, then begin the identity assertion request
   *        process if it has not already begun.
   *
   *    Steps to create an answer
   *      1.  If the need for an identity assertion was identified when
   *          createAnswer was invoked, wait for the identity assertion
   *          request process to complete.
   *      2.  If the identity provider was unable to produce an identity
   *          assertion, reject p with a newly created NotReadableError
   *          and abort these steps.
   *      3.  If connection was not constructed with a set of certificates,
   *          and one has not yet been generated, wait for it to be generated.
   *
   *    Final steps to create an answer
   *      2.  If connection was modified in such a way that additional
   *          inspection of the system state is necessary, then in
   *          parallel begin the steps to create an answer again, given p,
   *          and abort these steps.
   *
   *  Non-Testable
   *  4.3.2 createAnswer
   *      Steps to create an answer
   *        4.  Inspect the system state to determine the currently
   *            available resources as necessary for generating the answer,
   *            as described in [JSEP] (section 4.1.7.).
   *        5.  If this inspection failed for any reason, reject p with a
   *            newly created OperationError and abort these steps.
   *
   *      Final steps to create an answer
   *        3.  Given the information that was obtained from previous inspection
   *            and the current state of connection and its RTCRtpTransceivers,
   *            generate an SDP answer, sdpString, as described in [JSEP] (section 5.3.).
   */

</script>
