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

function getLines(sdp, startsWith) {
  const lines = sdp.split("\r\n").filter(l => l.startsWith(startsWith));
  assert_true(lines.length > 0, `One or more ${startsWith} in sdp`);
  return lines;
}

const getUfrags = ({sdp}) => getLines(sdp, "a=ice-ufrag:");
const getPwds = ({sdp}) => getLines(sdp, "a=ice-pwd:");

async function exchangeOfferAnswerEndOnFirst(pc1, pc2) {
  await pc1.setLocalDescription(await pc1.createOffer());
  await pc2.setRemoteDescription(pc1.localDescription);
  await pc2.setLocalDescription(await pc2.createAnswer());
  await pc1.setRemoteDescription(pc2.localDescription); // End on pc1. No race
}

async function exchangeOfferAnswerEndOnSecond(pc1, pc2) {
  await pc1.setLocalDescription(await pc1.createOffer());
  await pc2.setRemoteDescription(pc1.localDescription);
  await pc1.setRemoteDescription(await pc2.createAnswer());
  await pc2.setLocalDescription(pc1.remoteDescription); // End on pc2. No race
}

async function assertNoNegotiationNeeded(t, pc) {
  assert_equals(pc.signalingState, "stable", "In stable state");
  const event = await Promise.race([
    new Promise(r => pc.onnegotiationneeded = r),
    new Promise(r => t.step_timeout(r, 10))
  ]);
  assert_equals(event, undefined, "No negotiationneeded event");
}

// In Chromium, assert_equals() produces test expectations with the values
// compared. Because ufrags are different on each run, this would make Chromium
// test expectations different on each run on tests that failed when comparing
// ufrags. To work around this problem, assert_ufrags_equals() and
// assert_ufrags_not_equals() should be preferred over assert_equals() and
// assert_not_equals().
function assert_ufrags_equals(x, y, description) {
  assert_true(x === y, description);
}
function assert_ufrags_not_equals(x, y, description) {
  assert_false(x === y, description);
}

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

  pc1.restartIce();
  await assertNoNegotiationNeeded(t, pc1);
  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() does not trigger negotiation ahead of initial negotiation");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  pc1.restartIce();
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() has no effect on initial negotiation");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  pc1.restartIce();
  await new Promise(r => pc1.onnegotiationneeded = r);
}, "restartIce() fires negotiationneeded after initial negotiation");

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

  pc1.addTransceiver("audio");
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  assert_ufrags_equals(getUfrags(pc1.localDescription)[0], oldUfrag1, "control 1");
  assert_ufrags_equals(getUfrags(pc2.localDescription)[0], oldUfrag2, "control 2");

  pc1.restartIce();
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag1, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);

  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  assert_ufrags_equals(getUfrags(pc1.localDescription)[0], newUfrag1, "Unchanged 1");
  assert_ufrags_equals(getUfrags(pc2.localDescription)[0], newUfrag2, "Unchanged 2");
}, "restartIce() causes fresh ufrags");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);

  await pc1.setLocalDescription(await pc1.createOffer());
  pc1.restartIce();
  await pc2.setRemoteDescription(pc1.localDescription);
  await pc2.setLocalDescription(await pc2.createAnswer());
  // Several tests in this file initializes the onnegotiationneeded listener
  // before the setLocalDescription() or setRemoteDescription() that we expect
  // to trigger negotiation needed. This allows Chrome to exercise these tests
  // without timing out due to a bug that causes onnegotiationneeded to fire too
  // early.
  // TODO(https://crbug.com/985797): Once Chrome does not fire ONN too early,
  // simply do "await new Promise(...)" instead of
  // "await negotiationNeededPromise" here and in other tests in this file.
  const negotiationNeededPromise =
      new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setRemoteDescription(pc2.localDescription);
  assert_ufrags_equals(getUfrags(pc1.localDescription)[0], oldUfrag1, "Unchanged 1");
  assert_ufrags_equals(getUfrags(pc2.localDescription)[0], oldUfrag2, "Unchanged 2");
  await negotiationNeededPromise;
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag1, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() works in have-local-offer");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setLocalDescription(await pc1.createOffer());
  pc1.restartIce();
  await pc2.setRemoteDescription(pc1.localDescription);
  await pc2.setLocalDescription(await pc2.createAnswer());
  const negotiationNeededPromise =
      new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setRemoteDescription(pc2.localDescription);
  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);
  await negotiationNeededPromise;
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag1, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() works in initial have-local-offer");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);

  await pc2.setLocalDescription(await pc2.createOffer());
  await pc1.setRemoteDescription(pc2.localDescription);
  pc1.restartIce();
  await pc2.setRemoteDescription(await pc1.createAnswer());
  const negotiationNeededPromise =
      new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setLocalDescription(pc2.remoteDescription); // End on pc1. No race
  assert_ufrags_equals(getUfrags(pc1.localDescription)[0], oldUfrag1, "Unchanged 1");
  assert_ufrags_equals(getUfrags(pc2.localDescription)[0], oldUfrag2, "Unchanged 2");
  await negotiationNeededPromise;
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag1, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() works in have-remote-offer");

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

  pc2.addTransceiver("audio");
  await pc2.setLocalDescription(await pc2.createOffer());
  await pc1.setRemoteDescription(pc2.localDescription);
  pc1.restartIce();
  await pc2.setRemoteDescription(await pc1.createAnswer());
  await pc1.setLocalDescription(pc2.remoteDescription); // End on pc1. No race
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() does nothing in initial have-remote-offer");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);

  pc1.restartIce();
  await new Promise(r => pc1.onnegotiationneeded = r);
  const negotiationNeededPromise =
      new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnSecond(pc2, pc1);
  assert_ufrags_equals(getUfrags(pc1.localDescription)[0], oldUfrag1, "nothing yet 1");
  assert_ufrags_equals(getUfrags(pc2.localDescription)[0], oldUfrag2, "nothing yet 2");
  await negotiationNeededPromise;
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag2, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() survives remote offer");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);

  pc1.restartIce();
  pc2.restartIce();
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnSecond(pc2, pc1);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag1, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);

  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  assert_ufrags_equals(getUfrags(pc1.localDescription)[0], newUfrag1, "Unchanged 1");
  assert_ufrags_equals(getUfrags(pc2.localDescription)[0], newUfrag2, "Unchanged 2");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() is satisfied by remote ICE restart");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);

  pc1.restartIce();
  await new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setLocalDescription(await pc1.createOffer({iceRestart: false}));
  await pc2.setRemoteDescription(pc1.localDescription);
  await pc2.setLocalDescription(await pc2.createAnswer());
  await pc1.setRemoteDescription(pc2.localDescription);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag1, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() trumps {iceRestart: false}");

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

  pc1.addTransceiver("audio");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const [oldUfrag1] = getUfrags(pc1.localDescription);
  const [oldUfrag2] = getUfrags(pc2.localDescription);

  pc1.restartIce();
  await new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setLocalDescription(await pc1.createOffer());
  const negotiationNeededPromise =
      new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setLocalDescription({type: "rollback"});
  await negotiationNeededPromise;
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);
  const [newUfrag1] = getUfrags(pc1.localDescription);
  const [newUfrag2] = getUfrags(pc2.localDescription);
  assert_ufrags_not_equals(newUfrag1, oldUfrag1, "ufrag 1 changed");
  assert_ufrags_not_equals(newUfrag1, oldUfrag2, "ufrag 2 changed");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() survives rollback");

promise_test(async t => {
  const pc1 = new RTCPeerConnection({bundlePolicy: "max-compat"});
  const pc2 = new RTCPeerConnection({bundlePolicy: "max-compat"});
  t.add_cleanup(() => pc1.close());
  t.add_cleanup(() => pc2.close());

  pc1.addTransceiver("audio");
  pc1.addTransceiver("video");
  await new Promise(r => pc1.onnegotiationneeded = r);
  await exchangeOfferAnswerEndOnFirst(pc1, pc2);

  const oldUfrags1 = getUfrags(pc1.localDescription);
  const oldUfrags2 = getUfrags(pc2.localDescription);
  const oldPwds2 = getPwds(pc2.localDescription);

  pc1.restartIce();
  await new Promise(r => pc1.onnegotiationneeded = r);

  // Engineer a partial ICE restart from pc2
  pc2.restartIce();
  await pc2.setLocalDescription(await pc2.createOffer());
  {
    let {type, sdp} = pc2.localDescription;
    // Restore both old ice-ufrag and old ice-pwd to trigger a partial restart
    sdp = sdp.replace(getUfrags({sdp})[0], oldUfrags2[0]);
    sdp = sdp.replace(getPwds({sdp})[0], oldPwds2[0]);
    const newUfrags2 = getUfrags({sdp});
    const newPwds2 = getPwds({sdp});
    assert_ufrags_equals(newUfrags2[0], oldUfrags2[0], "control ufrag match");
    assert_ufrags_equals(newPwds2[0], oldPwds2[0], "control pwd match");
    assert_ufrags_not_equals(newUfrags2[1], oldUfrags2[1], "control ufrag non-match");
    assert_ufrags_not_equals(newPwds2[1], oldPwds2[1], "control pwd non-match");
    await pc1.setRemoteDescription({type, sdp});
  }
  const negotiationNeededPromise =
      new Promise(r => pc1.onnegotiationneeded = r);
  await pc1.setLocalDescription(await pc1.createAnswer());
  const newUfrags1 = getUfrags(pc1.localDescription);
  assert_ufrags_equals(newUfrags1[0], oldUfrags1[0], "Unchanged 1");
  assert_ufrags_not_equals(newUfrags1[1], oldUfrags1[1], "Restarted 2");
  await negotiationNeededPromise;
  await pc1.setLocalDescription(await pc1.createOffer());
  const newestUfrags1 = getUfrags(pc1.localDescription);
  assert_ufrags_not_equals(newestUfrags1[0], oldUfrags1[0], "Restarted 1");
  assert_ufrags_not_equals(newestUfrags1[1], oldUfrags1[1], "Restarted 2");
  await assertNoNegotiationNeeded(t, pc1);
}, "restartIce() survives remote offer containing partial restart");

</script>
