blob: 9b5c2bbf34d4bc4d71fee58f7e5b8558fe30a27e [file] [log] [blame]
# Copyright 2013 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.
import unittest
from metrics import webrtc_stats
from telemetry.unittest import simple_mock
SAMPLE_JSON = '''
[[
[
{
"googFrameHeightInput":"480",
"googFrameWidthInput":"640",
"googFrameRateSent": "23",
"packetsLost":"-1",
"googRtt":"-1",
"packetsSent":"1",
"bytesSent":"0"
},
{
"audioInputLevel":"2048",
"googRtt":"-1",
"googCodecName":"opus",
"packetsSent":"4",
"bytesSent":"0"
}
],
[
{
"googFrameHeightInput":"480",
"googFrameWidthInput":"640",
"googFrameRateSent": "21",
"packetsLost":"-1",
"googRtt":"-1",
"packetsSent":"8",
"bytesSent":"6291"
},
{
"audioInputLevel":"1878",
"googRtt":"-1",
"googCodecName":"opus",
"packetsSent":"16",
"bytesSent":"634"
}
]
],
[
[
{
"googFrameRateReceived": "23",
"googDecodeMs":"0",
"packetsReceived":"8",
"googRenderDelayMs":"10",
"googMaxDecodeMs":"0"
}
],
[
{
"googFrameRateReceived": "23",
"googDecodeMs":"14",
"packetsReceived":"1234",
"googRenderDelayMs":"102",
"googMaxDecodeMs":"150"
}
]
]]
'''
class FakeResults:
def __init__(self, current_page):
self._received_values = []
self._current_page = current_page
@property
def received_values(self):
return self._received_values
@property
def current_page(self):
return self._current_page
def AddValue(self, value):
self._received_values.append(value)
class WebRtcStatsUnittest(unittest.TestCase):
def _RunMetricOnJson(self, json_to_return):
stats_metric = webrtc_stats.WebRtcStatisticsMetric()
tab = simple_mock.MockObject()
page = simple_mock.MockObject()
stats_metric.Start(page, tab)
tab.ExpectCall('EvaluateJavaScript',
simple_mock.DONT_CARE).WillReturn(json_to_return)
stats_metric.Stop(page, tab)
page.url = simple_mock.MockObject()
results = FakeResults(page)
stats_metric.AddResults(tab, results)
return results
def testExtractsValuesAsTimeSeries(self):
results = self._RunMetricOnJson(SAMPLE_JSON)
self.assertTrue(results.received_values,
'Expected values for googDecodeMs and others, got none.')
# This also ensures we're clever enough to tell video packetsSent from audio
# packetsSent.
self.assertEqual(results.received_values[0].values,
[4.0, 16.0])
self.assertEqual(results.received_values[1].values,
[1.0, 8.0])
def testExtractsInterestingMetricsOnly(self):
results = self._RunMetricOnJson(SAMPLE_JSON)
self.assertEqual(len(results.received_values), 5)
self.assertEqual(results.received_values[0].name,
'peer_connection_0_audio_packets_sent',
'The result should be a ListOfScalarValues instance with '
'a name <peer connection id>_<statistic>.')
self.assertEqual(results.received_values[1].name,
'peer_connection_0_video_packets_sent')
self.assertEqual(results.received_values[2].name,
'peer_connection_1_video_goog_max_decode_ms')
self.assertEqual(results.received_values[3].name,
'peer_connection_1_video_packets_received')
self.assertEqual(results.received_values[4].name,
'peer_connection_1_video_goog_decode_ms')
def testReturnsIfJsonIsEmpty(self):
results = self._RunMetricOnJson('[]')
self.assertFalse(results.received_values)