| Index: chrome/test/data/webrtc/peerconnection_rtp.js | 
| diff --git a/chrome/test/data/webrtc/peerconnection_rtp.js b/chrome/test/data/webrtc/peerconnection_rtp.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..efffd8cce07203e3a09b86f19a7d17a5cb7dd55d | 
| --- /dev/null | 
| +++ b/chrome/test/data/webrtc/peerconnection_rtp.js | 
| @@ -0,0 +1,106 @@ | 
| +/** | 
| + * Copyright 2017 The Chromium Authors. All rights reserved. | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +// Public interface to tests. These are expected to be called with | 
| +// ExecuteJavascript invocations from the browser tests and will return answers | 
| +// through the DOM automation controller. | 
| + | 
| +/** | 
| + * Adds |count| streams to the peer connection, with one audio and one video | 
| + * track per stream. | 
| + * | 
| + * Returns "ok-streams-created-and-added" on success. | 
| + */ | 
| +function createAndAddStreams(count) { | 
| +  if (count > 0) { | 
| +    getUserMedia({ audio: true, video: true }, | 
| +        function(stream) { | 
| +          peerConnection_().addStream(stream); | 
| +          createAndAddStreams(count - 1); | 
| +        }, | 
| +        function(error) { | 
| +          throw failTest('getUserMedia failed: ' + error); | 
| +        }); | 
| +  } else { | 
| +    returnToTest('ok-streams-created-and-added'); | 
| +  } | 
| +} | 
| + | 
| +/** | 
| + * Verifies that the peer connection's getReceivers() returns one receiver per | 
| + * remote track, that there are no duplicates and that object identity is | 
| + * preserved. | 
| + * | 
| + * Returns "ok-receivers-verified" on success. | 
| + */ | 
| +function verifyRtpReceivers(expectedNumTracks = null) { | 
| +  if (peerConnection_().getReceivers() == null) | 
| +    throw failTest('getReceivers() returns null or undefined.'); | 
| +  if (expectedNumTracks != null && | 
| +      peerConnection_().getReceivers().length != expectedNumTracks) { | 
| +    throw failTest('getReceivers().length != expectedNumTracks'); | 
| +  } | 
| +  if (!arrayEquals_(peerConnection_().getReceivers(), | 
| +                    peerConnection_().getReceivers())) { | 
| +    throw failTest('One getReceivers() call is not equal to the next.'); | 
| +  } | 
| + | 
| +  let remoteTracks = new Set(); | 
| +  peerConnection_().getRemoteStreams().forEach(function(stream) { | 
| +    stream.getTracks().forEach(function(track) { | 
| +      remoteTracks.add(track); | 
| +    }); | 
| +  }); | 
| +  if (peerConnection_().getReceivers().length != remoteTracks.size) | 
| +    throw failTest('The number of receivers and tracks are not the same.'); | 
| + | 
| +  let receivers = new Set(); | 
| +  let receiverTracks = new Set(); | 
| +  peerConnection_().getReceivers().forEach(function(receiver) { | 
| +    if (receiver == null) | 
| +      throw failTest('receiver is null or undefined.'); | 
| +    if (receiver.track == null) | 
| +      throw failTest('receiver.track is null or undefined.'); | 
| +    receivers.add(receiver); | 
| +    receiverTracks.add(receiver.track); | 
| +  }); | 
| +  if (receiverTracks.size != receivers.size) | 
| +    throw failTest('receiverTracks.size != receivers.size'); | 
| + | 
| +  if (!setEquals_(receiverTracks, remoteTracks)) { | 
| +    throw failTest('The set of receiver tracks is not equal to the set of ' + | 
| +                   'stream tracks.'); | 
| +  } | 
| +  returnToTest('ok-receivers-verified'); | 
| +} | 
| + | 
| +// Internals. | 
| + | 
| +/** @private */ | 
| +function arrayEquals_(a, b) { | 
| +  if (a == null) | 
| +    return b == null; | 
| +  if (a.length != b.length) | 
| +    return false; | 
| +  for (let i = 0; i < a.length; ++i) { | 
| +    if (a[i] !== b[i]) | 
| +      return false; | 
| +  } | 
| +  return true; | 
| +} | 
| + | 
| +/** @private */ | 
| +function setEquals_(a, b) { | 
| +  if (a == null) | 
| +    return b == null; | 
| +  if (a.size != b.size) | 
| +    return false; | 
| +  a.forEach(function(value) { | 
| +    if (!b.has(value)) | 
| +      return false; | 
| +  }); | 
| +  return true; | 
| +} | 
|  |