<!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();
  });
  offerPc.addTransceiver('audio');
  // 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);
  // Renegotiate with PC 2
  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);
}, 'Negotiation of handover initiated at caller works');

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();
  });
  offerPc.addTransceiver('audio');
  // 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);
  // Renegotiate with PC 2
  // The offer from PC 2 needs to be consistent on at least the following:
  // - Number, type and order of media sections
  // - MID values
  // - Payload type values
  // Do a "fake" offer/answer using the original offer against PC2 to achieve this.
  await answerPcSecond.setRemoteDescription(offer1);
  // Discard the output of this round.
  await answerPcSecond.setLocalDescription(await answerPcSecond.createAnswer());

  // Now we can initiate an offer from the new PC.
  const offer2 = await answerPcSecond.createOffer();
  await answerPcSecond.setLocalDescription(offer2);
  await offerPc.setRemoteDescription(offer2);
  const answer2 = await offerPc.createAnswer();
  await answerPcSecond.setRemoteDescription(answer2);
  await offerPc.setLocalDescription(answer2);
}, 'Negotiation of handover initiated at callee works');

</script>
