<!doctype html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>RTCPeerConnection getStats test related to outbound-rtp stats</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../webrtc/RTCPeerConnection-helper.js"></script>
<script>
function extractOutboundRtpStats(stats) {
  const wantedStats = [];
  stats.forEach(report => {
    if (report.type === 'outbound-rtp') {
     wantedStats.push(report);
    }
  });
  return wantedStats;
}

promise_test(async (test) => {
  const pc1 = new RTCPeerConnection();
  test.add_cleanup(() => pc1.close());
  const pc2 = new RTCPeerConnection();
  test.add_cleanup(() => pc2.close());

  const stream = await getNoiseStream({audio: true, video: true});
  stream.getTracks().forEach(t => pc1.addTrack(t, stream));
  exchangeIceCandidates(pc1, pc2);
  exchangeOfferAnswer(pc1, pc2);
  const {track} = await new Promise(r => pc2.ontrack = r);
  await new Promise(r => track.onunmute = r);
  let outboundStats = extractOutboundRtpStats(await pc1.getStats());
  assert_equals(outboundStats.length, 2);
  assert_true(outboundStats[0].active);
  assert_true(outboundStats[1].active);

  pc1.getSenders().forEach(async sender => {
    const parameters = sender.getParameters();
    parameters.encodings[0].active = false;
    await sender.setParameters(parameters);
  });
  // Avoid any stats caching.
  await (new Promise(r => test.step_timeout(r, 100)));

  outboundStats = extractOutboundRtpStats(await pc1.getStats());
  assert_equals(outboundStats.length, 2);
  assert_false(outboundStats[0].active);
  assert_false(outboundStats[1].active);
}, 'setting an encoding to false is reflected in outbound-rtp stats');
</script>
