<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.iceGatheringState</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:
  // doSignalingHandshake
  // exchangeIceCandidates
  // generateAudioReceiveOnlyOffer

  /*
    4.3.2.  Interface Definition
      interface RTCPeerConnection : EventTarget {
        ...
        readonly  attribute RTCIceGatheringState   iceGatheringState;
                  attribute EventHandler           onicegatheringstatechange;
      };

    4.4.2.  RTCIceGatheringState Enum
      enum RTCIceGatheringState {
        "new",
        "gathering",
        "complete"
      };

    5.6.  RTCIceTransport Interface
      interface RTCIceTransport {
        readonly attribute RTCIceGathererState  gatheringState;
        ...
      };

      enum RTCIceGathererState {
        "new",
        "gathering",
        "complete"
      };
   */

  /*
    4.4.2.  RTCIceGatheringState Enum
      new
        Any of the RTCIceTransport s are in the new gathering state and
        none of the transports are in the gathering state, or there are
        no transports.
   */
  test(t => {
    const pc = new RTCPeerConnection();
    assert_equals(pc.iceGatheringState, 'new');
  }, 'Initial iceGatheringState should be new');

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

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

    const onIceGatheringStateChange = t.step_func(() => {
      const { iceGatheringState } = pc;

      if(iceGatheringState === 'complete') {
        t.done();
      }
    });

    assert_equals(pc.onicegatheringstatechange, null,
      'Expect connection to have icegatheringstatechange event');

    pc.addEventListener('icegatheringstatechange', onIceGatheringStateChange);

    generateAudioReceiveOnlyOffer(pc)
    .then(offer => pc.setLocalDescription(offer))
    .then(err => t.step_func(err =>
      assert_unreached(`Unhandled rejection ${err.name}: ${err.message}`)));
  }, 'iceGatheringState should eventually become complete after setLocalDescription');

  /*
    4.4.2.  RTCIceGatheringState Enum
      gathering
        Any of the RTCIceTransport s are in the gathering state.

      complete
        At least one RTCIceTransport exists, and all RTCIceTransports are
        in the completed gathering state.

    5.6.  RTCIceGathererState
      gathering
        The RTCIceTransport is in the process of gathering candidates.

      complete
        The RTCIceTransport has completed gathering and the end-of-candidates
        indication for this transport has been sent. It will not gather candidates
        again until an ICE restart causes it to restart.
   */
  async_test(t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();

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

    const onIceGatheringStateChange = t.step_func(() => {
      const { iceGatheringState } = pc2;

      if(iceGatheringState === 'gathering') {
        const iceTransport = pc2.sctp.transport.transport;

        assert_equals(iceTransport.gatheringState, 'gathering',
          'Expect ICE transport to be in checking gatheringState when iceGatheringState is checking');

      } else if(iceGatheringState === 'complete') {
        const iceTransport = pc2.sctp.transport.transport;

        assert_equals(iceTransport.gatheringState, 'complete',
          'Expect ICE transport to be in complete gatheringState when iceGatheringState is complete');

        t.done();
      }
    });

    pc1.createDataChannel('test');

    assert_equals(pc2.onicegatheringstatechange, null,
      'Expect connection to have icegatheringstatechange event');

    // Spec bug w3c/webrtc-pc#1382
    // Because sctp is only defined when answer is set, we listen
    // to pc2 so that we can be confident that sctp is defined
    // when icegatheringstatechange event is fired.
    pc2.addEventListener('icegatheringstatechange', onIceGatheringStateChange);

    exchangeIceCandidates(pc1, pc2);
    doSignalingHandshake(pc1, pc2);
  }, 'connection with one data channel should eventually have connected connection state');

  /*
    TODO
    5.6.  RTCIceTransport Interface
      new
        The RTCIceTransport was just created, and has not started gathering
        candidates yet.
   */
</script>
