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

promise_test(async t => {
  const offerPc = new RTCPeerConnection();
  const answerPcFirst = new RTCPeerConnection();
  const answerPcSecond = new RTCPeerConnection();
  t.add_cleanup(() => {
    offerPc.close();
    answerPcFirst.close();
    answerPcSecond.close();
  });
  const offerDatachannel1 = offerPc.createDataChannel('initial');
  exchangeIceCandidates(offerPc, answerPcFirst);

  // Negotiate connection with PC 1
  const offer1 = await offerPc.createOffer();
  await offerPc.setLocalDescription(offer1);
  await answerPcFirst.setRemoteDescription(offer1);
  const answer1 = await answerPcFirst.createAnswer();
  await offerPc.setRemoteDescription(answer1);
  await answerPcFirst.setLocalDescription(answer1);
  const datachannelAtAnswerPcFirst = await new Promise(
    r => answerPcFirst.ondatachannel = ({channel}) => r(channel));
  const iceTransport = offerPc.sctp.transport;
  // Check that messages get through.
  datachannelAtAnswerPcFirst.send('hello');
  const message1 = await awaitMessage(offerDatachannel1);
  assert_equals(message1, 'hello');

  // Renegotiate with PC 2
  // Note - ICE candidates will also be sent to answerPc1, but that shouldn't matter.
  exchangeIceCandidates(offerPc, answerPcSecond);
  const offer2 = await offerPc.createOffer();
  await offerPc.setLocalDescription(offer2);
  await answerPcSecond.setRemoteDescription(offer2);
  const answer2 = await answerPcSecond.createAnswer();
  await offerPc.setRemoteDescription(answer2);
  await answerPcSecond.setLocalDescription(answer2);

  // Kill the first PC. This should not affect anything, but leaving it may cause untoward events.
  answerPcFirst.close();

  const answerDataChannel2 = answerPcSecond.createDataChannel('second back');

  const datachannelAtOfferPcSecond = await new Promise(r => offerPc.ondatachannel = ({channel}) => r(channel));

  await new Promise(r => datachannelAtOfferPcSecond.onopen = r);

  datachannelAtOfferPcSecond.send('hello again');
  const message2 = await awaitMessage(answerDataChannel2);
  assert_equals(message2, 'hello again');
}, 'Handover with datachannel reinitiated from new callee completes');

</script>
