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