| Index: webrtc/audio/test/low_bandwidth_audio_test.py
|
| diff --git a/webrtc/audio/test/low_bandwidth_audio_test.py b/webrtc/audio/test/low_bandwidth_audio_test.py
|
| index 58243b1c9804402849ceb89738943178e4b9a9be..8f4068199be7342e521eeb2e27f5bbe1b4083610 100755
|
| --- a/webrtc/audio/test/low_bandwidth_audio_test.py
|
| +++ b/webrtc/audio/test/low_bandwidth_audio_test.py
|
| @@ -68,16 +68,42 @@ def _DownloadTools():
|
| return pesq_path
|
|
|
|
|
| -def _GetFile(file_path, out_dir, android=False, adb_path=None):
|
| +def ExtractTestRuns(lines, echo=False):
|
| + """Extracts information about tests from the output of a test runner.
|
| +
|
| + Produces tuples (android_device, test_name, reference_file, degraded_file).
|
| + """
|
| + for line in lines:
|
| + if echo:
|
| + sys.stdout.write(line)
|
| +
|
| + # Output from Android has a prefix with the device name.
|
| + android_prefix_re = r'(?:I\b.+\brun_tests_on_device\((.+?)\)\s*)?'
|
| + test_re = r'^' + android_prefix_re + r'TEST (\w+) ([^ ]+?) ([^ ]+?)\s*$'
|
| +
|
| + match = re.search(test_re, line)
|
| + if match:
|
| + yield match.groups()
|
| +
|
| +
|
| +def _GetFile(file_path, out_dir, move=False,
|
| + android=False, adb_prefix=('adb',)):
|
| out_file_name = os.path.basename(file_path)
|
| out_file_path = os.path.join(out_dir, out_file_name)
|
|
|
| if android:
|
| - # Pull the file from the connected Android device
|
| - adb_command = [adb_path, 'pull', file_path, out_dir]
|
| + # Pull the file from the connected Android device.
|
| + adb_command = adb_prefix + ('pull', file_path, out_dir)
|
| subprocess.check_call(_LogCommand(adb_command))
|
| + if move:
|
| + # Remove that file.
|
| + adb_command = adb_prefix + ('shell', 'rm', file_path)
|
| + subprocess.check_call(_LogCommand(adb_command))
|
| elif os.path.abspath(file_path) != os.path.abspath(out_file_path):
|
| - shutil.copy(file_path, out_file_path)
|
| + if move:
|
| + shutil.move(file_path, out_file_path)
|
| + else:
|
| + shutil.copy(file_path, out_file_path)
|
|
|
| return out_file_path
|
|
|
| @@ -101,46 +127,47 @@ def main():
|
| test_process = subprocess.Popen(_LogCommand(test_command),
|
| stdout=subprocess.PIPE)
|
|
|
| - for line in iter(test_process.stdout.readline, ''):
|
| - # Echo the output to screen.
|
| - sys.stdout.write(line)
|
| -
|
| - # Extract specific lines that contain information about produced files.
|
| - # Output from Android has a prefix, need to skip it.
|
| - match = re.search(r'^(?:I\b.+\b)?TEST (\w+) ([^ ]+?) ([^ ]+?)\s*$', line)
|
| - if not match:
|
| - continue
|
| - test_name = match.group(1)
|
| - reference_file = _GetFile(match.group(2), out_dir,
|
| - args.android, args.adb_path)
|
| - degraded_file = _GetFile(match.group(3), out_dir,
|
| - args.android, args.adb_path)
|
| -
|
| - # Analyze audio.
|
| - pesq_command = [pesq_path, '+16000',
|
| - os.path.basename(reference_file),
|
| - os.path.basename(degraded_file)]
|
| - # Need to provide paths in the current directory due to a bug in PESQ:
|
| - # On Mac, for some 'path/to/file.wav', if 'file.wav' is longer than
|
| - # 'path/to', PESQ crashes.
|
| - pesq_output = subprocess.check_output(_LogCommand(pesq_command),
|
| - cwd=out_dir)
|
| -
|
| - # Find the scores in stdout of pesq.
|
| - match = re.search(
|
| - r'Prediction \(Raw MOS, MOS-LQO\):\s+=\s+([\d.]+)\s+([\d.]+)',
|
| - pesq_output)
|
| - if match:
|
| - raw_mos, _ = match.groups()
|
| -
|
| - # Output a result for the perf dashboard.
|
| - print 'RESULT pesq_mos: %s= %s score' % (test_name, raw_mos)
|
| - else:
|
| - logging.error('PESQ: %s', pesq_output.splitlines()[-1])
|
| -
|
| - if args.remove:
|
| - os.remove(reference_file)
|
| - os.remove(degraded_file)
|
| + try:
|
| + lines = iter(test_process.stdout.readline, '')
|
| + for result in ExtractTestRuns(lines, echo=True):
|
| + (android_device, test_name, reference_file, degraded_file) = result
|
| +
|
| + adb_prefix = (args.adb_path,)
|
| + if android_device:
|
| + adb_prefix += ('-s', android_device)
|
| +
|
| + reference_file = _GetFile(reference_file, out_dir,
|
| + android=args.android, adb_prefix=adb_prefix)
|
| + degraded_file = _GetFile(degraded_file, out_dir, move=True,
|
| + android=args.android, adb_prefix=adb_prefix)
|
| +
|
| + # Analyze audio.
|
| + pesq_command = [pesq_path, '+16000',
|
| + os.path.basename(reference_file),
|
| + os.path.basename(degraded_file)]
|
| + # Need to provide paths in the current directory due to a bug in PESQ:
|
| + # On Mac, for some 'path/to/file.wav', if 'file.wav' is longer than
|
| + # 'path/to', PESQ crashes.
|
| + pesq_output = subprocess.check_output(_LogCommand(pesq_command),
|
| + cwd=out_dir)
|
| +
|
| + # Find the scores in stdout of pesq.
|
| + match = re.search(
|
| + r'Prediction \(Raw MOS, MOS-LQO\):\s+=\s+([\d.]+)\s+([\d.]+)',
|
| + pesq_output)
|
| + if match:
|
| + raw_mos, _ = match.groups()
|
| +
|
| + # Output a result for the perf dashboard.
|
| + print 'RESULT pesq_mos: %s= %s score' % (test_name, raw_mos)
|
| + else:
|
| + logging.error('PESQ: %s', pesq_output.splitlines()[-1])
|
| +
|
| + if args.remove:
|
| + os.remove(reference_file)
|
| + os.remove(degraded_file)
|
| + finally:
|
| + test_process.terminate()
|
|
|
| return test_process.wait()
|
|
|
|
|