<!doctype html>
<meta charset=utf-8>
<title>Exposure or remote candidate address on stats</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../webrtc/RTCPeerConnection-helper.js"></script>
<script src="../webrtc/RTCStats-helper.js"></script>
<script>
  'use strict';

promise_test(async (test) => {
    const localPc = new RTCPeerConnection();
    test.add_cleanup(() => localPc.close());
    const remotePc = new RTCPeerConnection();
    test.add_cleanup(() => remotePc.close());

    const promiseDataChannel = new Promise(resolve => {
        remotePc.addEventListener('datachannel', (event) => {
            resolve(event.channel);
        });
    });

    const localDataChannel = localPc.createDataChannel('test');

    localPc.addEventListener('icecandidate', event => {
        if (event.candidate)
            remotePc.addIceCandidate(event.candidate);
    });
    doSignalingHandshake(localPc, remotePc);

    const remoteDataChannel = await promiseDataChannel;

    localDataChannel.send("test");

    await new Promise(resolve => {
        remoteDataChannel.onmessage = resolve;
    });

    const remoteCandidateStats = getRequiredStats(await localPc.getStats(), "remote-candidate");
    assert_equals(remoteCandidateStats.address, null, "address should be null");
}, "Do not expose in stats remote addresses that are not known to be already exposed to JS");


promise_test(async (test) => {
    const localPc = new RTCPeerConnection();
    test.add_cleanup(() => localPc.close());
    const remotePc = new RTCPeerConnection();
    test.add_cleanup(() => remotePc.close());

    const promiseDataChannel = new Promise(resolve => {
        remotePc.addEventListener('datachannel', (event) => {
            resolve(event.channel);
        });
    });

    const localDataChannel = localPc.createDataChannel('test');

    localPc.addEventListener('icecandidate', event => {
        if (event.candidate)
            remotePc.addIceCandidate(event.candidate);
    });
    remotePc.addEventListener('icecandidate', event => {
        if (event.candidate)
            localPc.addIceCandidate(event.candidate);
    });
    doSignalingHandshake(localPc, remotePc);

    const remoteDataChannel = await promiseDataChannel;

    localDataChannel.send("test");

    await new Promise(resolve => {
        remoteDataChannel.onmessage = resolve;
    });

    const remoteCandidateStats = getRequiredStats(await localPc.getStats(), "remote-candidate");
    assert_not_equals(remoteCandidateStats.address, null, "address should not be null");

}, "Expose in stats remote addresses that are already exposed to JS");

</script>
