<!doctype html>
<meta charset="utf-8">
<title>RTCDtlsTransport.prototype.getRemoteCertificates</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
  'use strict';

  // The following helper functions are called from RTCPeerConnection-helper.js:
  //   exchangeIceCandidates
  //   doSignalingHandshake

  /*
    5.5.  RTCDtlsTransport Interface
      interface RTCDtlsTransport : EventTarget {
        readonly attribute RTCDtlsTransportState state;
        sequence<ArrayBuffer> getRemoteCertificates();
                 attribute EventHandler          onstatechange;
                 attribute EventHandler          onerror;
        ...
      };

      enum RTCDtlsTransportState {
        "new",
        "connecting",
        "connected",
        "closed",
        "failed"
      };

      getRemoteCertificates
        Returns the certificate chain in use by the remote side, with each certificate
        encoded in binary Distinguished Encoding Rules (DER) [X690].
        getRemoteCertificates() will return an empty list prior to selection of the
        remote certificate, which will be completed by the time RTCDtlsTransportState
        transitions to "connected".
   */
  async_test(t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();
    t.add_cleanup(() => pc2.close());

    pc1.createDataChannel('test');
    exchangeIceCandidates(pc1, pc2);

    doSignalingHandshake(pc1, pc2)
    .then(t.step_func(() => {
      // pc.sctp is set when set*Description(answer) is called
      const sctpTransport1 = pc1.sctp;
      const sctpTransport2 = pc2.sctp;

      assert_true(sctpTransport1 instanceof RTCSctpTransport,
        'Expect pc.sctp to be set to valid RTCSctpTransport');

      assert_true(sctpTransport2 instanceof RTCSctpTransport,
        'Expect pc.sctp to be set to valid RTCSctpTransport');

      const dtlsTransport1 = sctpTransport1.transport;
      const dtlsTransport2 = sctpTransport2.transport;

      const testedTransports = new Set();

      // Callback function that test the respective DTLS transports
      // when they become connected.
      const onConnected = t.step_func(dtlsTransport => {
        const certs = dtlsTransport.getRemoteCertificates();

        assert_greater_than(certs.length, 0,
          'Expect DTLS transport to have at least one remote certificate when connected');

        for(const cert of certs) {
          assert_true(cert instanceof ArrayBuffer,
            'Expect certificate elements be instance of ArrayBuffer');
        }

        testedTransports.add(dtlsTransport);

        // End the test if both dtlsTransports are tested.
        if(testedTransports.has(dtlsTransport1) && testedTransports.has(dtlsTransport2)) {
          t.done();
        }
      })

      for(const dtlsTransport of [dtlsTransport1, dtlsTransport2]) {
        if(dtlsTransport.state === 'connected') {
          onConnected(dtlsTransport);
        } else {
          assert_array_equals(dtlsTransport.getCertificates(), [],
            'Expect DTLS certificates be initially empty until become connected');

          dtlsTransport.addEventListener('statechange', t.step_func(() => {
            if(dtlsTransport.state === 'connected') {
              onConnected(dtlsTransport);
            }
          }));

          dtlsTransport.addEventListener('error', t.step_func(err => {
            assert_unreached(`Unexpected error during DTLS handshake: ${err}`);
          }));
        }
      }
    }));
  });

</script>
