Chromium Code Reviews| Index: chrome/test/data/webrtc/peerconnection_getstats.js |
| diff --git a/chrome/test/data/webrtc/peerconnection_getstats.js b/chrome/test/data/webrtc/peerconnection_getstats.js |
| index 9258a3656f768a57bb8905d10787190ccaa162a8..6062daa4970f9d1a724aa572a71b4c1e3b0caf71 100644 |
| --- a/chrome/test/data/webrtc/peerconnection_getstats.js |
| +++ b/chrome/test/data/webrtc/peerconnection_getstats.js |
| @@ -4,14 +4,34 @@ |
| * found in the LICENSE file. |
| */ |
| +var kExpectedStats = [ |
|
hta - Chromium
2016/11/24 15:45:00
Naming nits: I'd call this "kMustHaveStats" (could
|
| + 'certificate', |
| + 'codec', |
| + 'candidate-pair', |
| + 'local-candidate', |
| + 'remote-candidate', |
| + 'stream', |
| + 'track', |
| + 'peer-connection', |
| + 'inbound-rtp', |
| + 'outbound-rtp', |
| + 'transport', |
| +]; |
| +// TODO(hbos): Update browser test to include data channels and make this |
| +// mandatory. crbug.com/627816 |
| +var kOptionalStats = [ |
| + 'data-channel', |
| +]; |
| + |
| // 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. |
| /** |
| - * Verifies that the promise-based |RTCPeerConnection.getStats| returns stats. |
| + * Verifies that the promise-based |RTCPeerConnection.getStats| returns all |
| + * expected stats and no unexpected stats. |
| * |
| - * Returns ok-got-stats on success. |
| + * Returns ok-expected-stats on success. |
| */ |
| function verifyStatsGeneratedPromise() { |
| peerConnection_().getStats() |
| @@ -19,26 +39,47 @@ function verifyStatsGeneratedPromise() { |
| if (report == null || report.size == 0) |
| throw new failTest('report is null or empty.'); |
| // Sanity check that applies to all stats. |
| - var ids = new Set(); |
| - report.forEach(function(stats) { |
| + let ids = new Set(); |
| + let expected = new Set(kExpectedStats); |
| + let optional = new Set(kOptionalStats); |
| + let missing_expected = new Set(kExpectedStats); |
| + let unexpected = new Set(); |
| + for (let stats of report.values()) { |
| if (typeof(stats.id) !== 'string') |
| throw failTest('stats.id is not a string.'); |
| if (ids.has(stats.id)) |
| throw failTest('stats.id is not a unique identifier.'); |
| ids.add(stats.id); |
| - if (typeof(stats.timestamp) !== 'number' || stats.timestamp <= 0) |
| - throw failTest('stats.timestamp is not a positive number.'); |
| + if (typeof(stats.timestamp) !== 'number' || |
| + !isFinite(stats.timestamp) || stats.timestamp <= 0) { |
| + throw failTest('stats.timestamp is not a positive finite number.'); |
| + } |
| if (typeof(stats.type) !== 'string') |
| throw failTest('stats.type is not a string.'); |
| - }); |
| - // TODO(hbos): When the new stats collection API is more mature (and |
| - // certainly before unflagging the new stats API) add a whitelist of |
| - // allowed stats to prevent accidentally exposing stats to the web that |
| - // are not in the spec and that verifies type information. Status at |
| - // crbug.com/627816. Stats collection is tested in the WebRTC repo and |
| - // automatically surfaced to Blink, but there should be a process of |
| - // having to land a Blink CL in order to expose a new RTCStats dictionary. |
| - returnToTest('ok-got-stats'); |
| + |
| + if (expected.has(stats.type)) { |
| + missing_expected.delete(stats.type); |
| + } else if (!optional.has(stats.type)) { |
| + unexpected.add(stats.type); |
| + } |
| + } |
| + if (missing_expected.size > 0 || unexpected.size > 0) { |
| + // Log all stats before throwing exception. |
| + var all_stats = []; |
| + for (let stats of report.values()) { |
| + all_stats.push(stats); |
| + } |
| + console.log('RTCStatsReport: ' + JSON.stringify(all_stats, null, ' ')); |
| + if (missing_expected.size > 0) { |
| + throw new failTest('Missing stats of type: ' + |
| + Array.from(missing_expected.values())); |
| + } |
| + if (unexpected.size > 0) { |
| + throw new failTest('Unexpected stats of type: ' + |
| + Array.from(unexpected.values())); |
| + } |
| + } |
| + returnToTest('ok-expected-stats'); |
| }, |
| function(e) { |
| throw failTest('Promise was rejected: ' + e); |