OLD | NEW |
---|---|
1 /** | 1 /** |
2 * Copyright 2016 The Chromium Authors. All rights reserved. | 2 * Copyright 2016 The Chromium Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 var kExpectedStats = [ | |
hta - Chromium
2016/11/24 15:45:00
Naming nits: I'd call this "kMustHaveStats" (could
| |
8 'certificate', | |
9 'codec', | |
10 'candidate-pair', | |
11 'local-candidate', | |
12 'remote-candidate', | |
13 'stream', | |
14 'track', | |
15 'peer-connection', | |
16 'inbound-rtp', | |
17 'outbound-rtp', | |
18 'transport', | |
19 ]; | |
20 // TODO(hbos): Update browser test to include data channels and make this | |
21 // mandatory. crbug.com/627816 | |
22 var kOptionalStats = [ | |
23 'data-channel', | |
24 ]; | |
25 | |
7 // Public interface to tests. These are expected to be called with | 26 // Public interface to tests. These are expected to be called with |
8 // ExecuteJavascript invocations from the browser tests and will return answers | 27 // ExecuteJavascript invocations from the browser tests and will return answers |
9 // through the DOM automation controller. | 28 // through the DOM automation controller. |
10 | 29 |
11 /** | 30 /** |
12 * Verifies that the promise-based |RTCPeerConnection.getStats| returns stats. | 31 * Verifies that the promise-based |RTCPeerConnection.getStats| returns all |
32 * expected stats and no unexpected stats. | |
13 * | 33 * |
14 * Returns ok-got-stats on success. | 34 * Returns ok-expected-stats on success. |
15 */ | 35 */ |
16 function verifyStatsGeneratedPromise() { | 36 function verifyStatsGeneratedPromise() { |
17 peerConnection_().getStats() | 37 peerConnection_().getStats() |
18 .then(function(report) { | 38 .then(function(report) { |
19 if (report == null || report.size == 0) | 39 if (report == null || report.size == 0) |
20 throw new failTest('report is null or empty.'); | 40 throw new failTest('report is null or empty.'); |
21 // Sanity check that applies to all stats. | 41 // Sanity check that applies to all stats. |
22 var ids = new Set(); | 42 let ids = new Set(); |
23 report.forEach(function(stats) { | 43 let expected = new Set(kExpectedStats); |
44 let optional = new Set(kOptionalStats); | |
45 let missing_expected = new Set(kExpectedStats); | |
46 let unexpected = new Set(); | |
47 for (let stats of report.values()) { | |
24 if (typeof(stats.id) !== 'string') | 48 if (typeof(stats.id) !== 'string') |
25 throw failTest('stats.id is not a string.'); | 49 throw failTest('stats.id is not a string.'); |
26 if (ids.has(stats.id)) | 50 if (ids.has(stats.id)) |
27 throw failTest('stats.id is not a unique identifier.'); | 51 throw failTest('stats.id is not a unique identifier.'); |
28 ids.add(stats.id); | 52 ids.add(stats.id); |
29 if (typeof(stats.timestamp) !== 'number' || stats.timestamp <= 0) | 53 if (typeof(stats.timestamp) !== 'number' || |
30 throw failTest('stats.timestamp is not a positive number.'); | 54 !isFinite(stats.timestamp) || stats.timestamp <= 0) { |
55 throw failTest('stats.timestamp is not a positive finite number.'); | |
56 } | |
31 if (typeof(stats.type) !== 'string') | 57 if (typeof(stats.type) !== 'string') |
32 throw failTest('stats.type is not a string.'); | 58 throw failTest('stats.type is not a string.'); |
33 }); | 59 |
34 // TODO(hbos): When the new stats collection API is more mature (and | 60 if (expected.has(stats.type)) { |
35 // certainly before unflagging the new stats API) add a whitelist of | 61 missing_expected.delete(stats.type); |
36 // allowed stats to prevent accidentally exposing stats to the web that | 62 } else if (!optional.has(stats.type)) { |
37 // are not in the spec and that verifies type information. Status at | 63 unexpected.add(stats.type); |
38 // crbug.com/627816. Stats collection is tested in the WebRTC repo and | 64 } |
39 // automatically surfaced to Blink, but there should be a process of | 65 } |
40 // having to land a Blink CL in order to expose a new RTCStats dictionary. | 66 if (missing_expected.size > 0 || unexpected.size > 0) { |
41 returnToTest('ok-got-stats'); | 67 // Log all stats before throwing exception. |
68 var all_stats = []; | |
69 for (let stats of report.values()) { | |
70 all_stats.push(stats); | |
71 } | |
72 console.log('RTCStatsReport: ' + JSON.stringify(all_stats, null, ' ')); | |
73 if (missing_expected.size > 0) { | |
74 throw new failTest('Missing stats of type: ' + | |
75 Array.from(missing_expected.values())); | |
76 } | |
77 if (unexpected.size > 0) { | |
78 throw new failTest('Unexpected stats of type: ' + | |
79 Array.from(unexpected.values())); | |
80 } | |
81 } | |
82 returnToTest('ok-expected-stats'); | |
42 }, | 83 }, |
43 function(e) { | 84 function(e) { |
44 throw failTest('Promise was rejected: ' + e); | 85 throw failTest('Promise was rejected: ' + e); |
45 }); | 86 }); |
46 } | 87 } |
OLD | NEW |