# Copyright 2018 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 errno import logging import os from autotest_lib.client.common_lib import file_utils from autotest_lib.client.cros import chrome_binary_test from autotest_lib.client.cros.video import device_capability from autotest_lib.client.cros.video import helper_logger DOWNLOAD_BASE = ('http://commondatastorage.googleapis.com/' 'chromiumos-test-assets-public/') TEST_LOG = 'test_log' REPEAT_TIMES = 100 TIME_UNIT = 'millisecond' HW_ENCODE_LABEL = 'hw_encode_time' SW_ENCODE_LABEL = 'sw_encode_time' LATENCY_50_SUFFIX = '.encode_latency.50_percentile' LATENCY_75_SUFFIX = '.encode_latency.75_percentile' LATENCY_95_SUFFIX = '.encode_latency.95_percentile' HW_PREFIX = 'hw_' SW_PREFIX = 'sw_' class video_JEAPerf(chrome_binary_test.ChromeBinaryTest): """ This test monitors performance metrics reported by Chrome test binary, jpeg_encode_accelerator_unittest. """ version = 1 binary = 'jpeg_encode_accelerator_unittest' def report_perf_results(self, test_name, output_path): hw_times = [] sw_times = [] with open(output_path, 'r') as f: lines = f.readlines() lines = [line.strip() for line in lines] for line in lines: key_value = line.split(':') if len(key_value) != 2: continue (key, value) = (key_value[0].strip(), key_value[1].strip()) if key == HW_ENCODE_LABEL: hw_times.append(int(value)) if key == SW_ENCODE_LABEL: sw_times.append(int(value)) hw_times.sort() sw_times.sort() if len(hw_times) > 0: percentile_50 = len(hw_times) / 2 percentile_75 = len(hw_times) * 3 / 4 percentile_95 = len(hw_times) * 95 / 100 test_title = HW_PREFIX + test_name self.output_perf_value(description=(test_title + LATENCY_50_SUFFIX), value=hw_times[percentile_50], units=TIME_UNIT, higher_is_better=False) self.output_perf_value(description=(test_title + LATENCY_75_SUFFIX), value=hw_times[percentile_75], units=TIME_UNIT, higher_is_better=False) self.output_perf_value(description=(test_title + LATENCY_95_SUFFIX), value=hw_times[percentile_95], units=TIME_UNIT, higher_is_better=False) if len(sw_times) > 0: percentile_50 = len(sw_times) / 2 percentile_75 = len(sw_times) * 3 / 4 percentile_95 = len(sw_times) * 95 / 100 test_title = SW_PREFIX + test_name self.output_perf_value(description=(test_title + LATENCY_50_SUFFIX), value=sw_times[percentile_50], units=TIME_UNIT, higher_is_better=False) self.output_perf_value(description=(test_title + LATENCY_75_SUFFIX), value=sw_times[percentile_75], units=TIME_UNIT, higher_is_better=False) self.output_perf_value(description=(test_title + LATENCY_95_SUFFIX), value=sw_times[percentile_95], units=TIME_UNIT, higher_is_better=False) def remove_if_exists(self, file_path): try: os.remove(file_path) except OSError as e: if e.errno != errno.ENOENT: # no such file raise @helper_logger.video_log_wrapper @chrome_binary_test.nuke_chrome def run_once(self, test_cases, capability): """ Runs JpegEncodeAcceleratorTest.SimpleEncode on the device and reports latency values for HW and SW. @param capability: Capability required for executing this test. """ device_capability.DeviceCapability().ensure_capability(capability) for (image_path, width, height) in test_cases: url = DOWNLOAD_BASE + image_path file_name = os.path.basename(image_path) input_path = os.path.join(self.bindir, file_name) file_utils.download_file(url, input_path) test_name = ('%s_%dx%d' % (file_name, width, height)) output_path = os.path.join(self.tmpdir, TEST_LOG) cmd_line_list = [helper_logger.chrome_vmodule_flag()] + [ '--gtest_filter=JpegEncodeAcceleratorTest.SimpleEncode', ('--output_log=%s' % output_path), ('--repeat=%d' % REPEAT_TIMES), ('--yuv_filenames="%s:%dx%d"' % (input_path, width, height)) ] cmd_line = ' '.join(cmd_line_list) try: self.run_chrome_test_binary(self.binary, cmd_line) self.report_perf_results(test_name, output_path) except Exception as last_error: # Log the error and continue to the next test case. logging.exception(last_error) finally: self.remove_if_exists(input_path) self.remove_if_exists(output_path)