<!doctype html>
<meta charset=utf-8>
<!-- This file contains two tests that wait for 10 seconds each. -->
<meta name="timeout" content="long">
<title>RTCRtpReceiver.prototype.getSynchronizationSources</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';

async function initiateSingleTrackCallAndReturnReceiver(t, kind) {
  const pc1 = new RTCPeerConnection();
  t.add_cleanup(() => pc1.close());
  const pc2 = new RTCPeerConnection();
  t.add_cleanup(() => pc2.close());

  const stream = await navigator.mediaDevices.getUserMedia({[kind]:true});
  const [track] = stream.getTracks();
  t.add_cleanup(() => track.stop());
  pc1.addTrack(track, stream);

  exchangeIceCandidates(pc1, pc2);
  const trackEvent = await exchangeOfferAndListenToOntrack(t, pc1, pc2);
  await exchangeAnswer(pc1, pc2);
  return trackEvent.receiver;
}

for (const kind of ['audio', 'video']) {
  promise_test(async t => {
    const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
    await listenForSSRCs(t, receiver);
  }, '[' + kind + '] getSynchronizationSources() eventually returns a ' +
     'non-empty list');

  promise_test(async t => {
    const startTime = performance.now();
    const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
    const [ssrc] = await listenForSSRCs(t, receiver);
    assert_equals(typeof ssrc.timestamp, 'number');
    assert_true(ssrc.timestamp >= startTime);
  }, '[' + kind + '] RTCRtpSynchronizationSource.timestamp is a number');

  promise_test(async t => {
    const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
    // Wait for packets to start flowing.
    await listenForSSRCs(t, receiver);
    // Wait for 10 seconds.
    await new Promise(resolve => t.step_timeout(resolve, 10000));
    let earliestTimestamp = undefined;
    let latestTimestamp = undefined;
    for (const ssrc of await listenForSSRCs(t, receiver)) {
      if (earliestTimestamp == undefined || earliestTimestamp > ssrc.timestamp)
        earliestTimestamp = ssrc.timestamp;
      if (latestTimestamp == undefined || latestTimestamp < ssrc.timestamp)
        latestTimestamp = ssrc.timestamp;
    }
    assert_true(latestTimestamp - earliestTimestamp <= 10000);
  }, '[' + kind + '] getSynchronizationSources() does not contain SSRCs ' +
     'older than 10 seconds');

  promise_test(async t => {
    const startTime = performance.timeOrigin + performance.now();
    const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
    const [ssrc] = await listenForSSRCs(t, receiver);
    const endTime = performance.timeOrigin + performance.now();
    assert_true(startTime <= ssrc.timestamp && ssrc.timestamp <= endTime);
  }, '[' + kind + '] RTCRtpSynchronizationSource.timestamp is comparable to ' +
     'performance.timeOrigin + performance.now()');

  promise_test(async t => {
    const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
    const [ssrc] = await listenForSSRCs(t, receiver);
    assert_equals(typeof ssrc.source, 'number');
  }, '[' + kind + '] RTCRtpSynchronizationSource.source is a number');
}

promise_test(async t => {
  const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio');
  const [ssrc] = await listenForSSRCs(t, receiver);
  assert_equals(typeof ssrc.audioLevel, 'number');
  assert_greater_than_equal(ssrc.audioLevel, 0);
  assert_less_than_equal(ssrc.audioLevel, 1);
}, '[audio-only] RTCRtpSynchronizationSource.audioLevel is a number [0, 1]');

// This test only passes if the implementation is sending the RFC 6464 extension
// header and the "vad" extension attribute is not "off", otherwise
// voiceActivityFlag is absent. TODO: Consider moving this test to an
// optional-to-implement subfolder?
promise_test(async t => {
  const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio');
  const [ssrc] = await listenForSSRCs(t, receiver);
  assert_equals(typeof ssrc.voiceActivityFlag, 'boolean');
}, '[audio-only] RTCRtpSynchronizationSource.voiceActivityFlag is a boolean');

</script>
