Test handover - reconnect a PeerConnection to another remote

This functionality is being used, but wasn't tested.
This is a skeleton test - just checks that the negotiation
steps succeed.

Bug: none
Change-Id: Ic1b6fa2df77730d42b44f122ed5b29f147505077
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2537630
Reviewed-by: Henrik Boström <hbos@chromium.org>
Commit-Queue: Harald Alvestrand <hta@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827225}
diff --git a/webrtc/protocol/handover.html b/webrtc/protocol/handover.html
new file mode 100644
index 0000000..378d65f
--- /dev/null
+++ b/webrtc/protocol/handover.html
@@ -0,0 +1,74 @@
+<!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>