15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Audio latency performance test. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Benchmark measuring how fast we can continuously repeat a short sound clip. In 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the ideal scenario we'd have zero latency processing script, seeking back to the 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)beginning of the clip, and resuming audio playback. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Performance is recorded as the average latency of N playbacks. I.e., if we play 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)a clip 50 times and the ideal duration of all playbacks is 1000ms and the total 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)duration is 1500ms, the recorded result is (1500ms - 1000ms) / 50 == 10ms. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_media 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_utils 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# HTML test path; relative to src/chrome/test/data. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_TEST_HTML_PATH = os.path.join('media', 'html', 'audio_latency_perf.html') 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioLatencyPerfTest(pyauto.PyUITest): 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """PyAuto test container. See file doc string for more information.""" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testAudioLatency(self): 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Launches HTML test which runs the audio latency test.""" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.NavigateToURL(self.GetFileURLForDataPath(_TEST_HTML_PATH)) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Block until the test finishes and notifies us. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(self.ExecuteJavascript('startTest();')) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) latency = float(self.GetDOMValue('averageLatency')) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pyauto_utils.PrintPerfResult('audio_latency', 'latency', latency, 'ms') 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__': 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pyauto_media.Main() 42