blob: 3d88fd572fdc072ed6bf862b44053220491f41b0 [file] [log] [blame]
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
'''Utility functions for audio scripts.'''
import copy
import logging
import subprocess
import threading
AUTOTEST_GS_URL_FORMAT = 'gs://chromeos-autotest-results/%s/%s'
_popen_lock = threading.Lock()
class TestObject(object):
'''Object for holding test data.'''
def __init__(self, tag):
self.tag = tag
self.hostname = tag.split('/')[1]
self.test_name = ''
self.platform = ''
self.release = ''
self.build = ''
self.perf_dict = {}
@classmethod
def parse(cls, line):
'''Parse string of comma-separated fields into TestObject.
The string to be parsed should be in comma-separated format:
tag, platform, test_name, hostname, release, build, perf_dict
Example:
11932127-chromeos-test/chromeos4-row2-rack10-host6, link,
audio_CrasLoopback, chromeos4-row2-rack10-host6, 37, 5914.0.0,
rms_value: 0.668121
'''
values = [x.strip() for x in line.split(',')]
test = cls(values[0])
(test.platform, test.test_name, test.hostname, test.release,
test.build) = values[1:6]
test.perf_dict = dict(x.split(': ', 1) for x in values[6:])
return test
def __str__(self):
return ', '.join(str(x) for x in (
[self.tag, self.platform, self.test_name, self.hostname, self.release,
self.build] +
['%s: %s' % item for item in self.perf_dict.iteritems()]))
def __repr__(self):
return str(self)
def clone(self):
return copy.copy(self)
def run_in_pool(functions, pool_size=8):
lock = threading.Lock()
def next_task():
try:
with lock:
return next(functions)
except StopIteration:
return None
def work():
task = next_task()
while task:
task()
task = next_task()
threads = [threading.Thread(target=work) for _ in xrange(pool_size)]
for t in threads:
t.start()
for t in threads:
t.join()
def execute(args):
with _popen_lock:
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
return out, err, p.wait()
def autotest_cat(job_tag, file_path):
gs_url = AUTOTEST_GS_URL_FORMAT % (job_tag, file_path)
out, err, ret = execute(['gsutil', 'cat', gs_url])
if ret != 0:
if 'InvalidUriError' in err:
raise IOError(err)
else:
logging.error('command failed, return code: %d', ret)
raise RuntimeError(err)
return out