• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2018 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import errno
6import logging
7import os
8from autotest_lib.client.common_lib import file_utils
9from autotest_lib.client.cros import chrome_binary_test
10from autotest_lib.client.cros.video import device_capability
11from autotest_lib.client.cros.video import helper_logger
12
13DOWNLOAD_BASE = ('http://commondatastorage.googleapis.com/'
14                 'chromiumos-test-assets-public/')
15TEST_LOG = 'test_log'
16REPEAT_TIMES = 100
17TIME_UNIT = 'millisecond'
18HW_ENCODE_LABEL = 'hw_encode_time'
19SW_ENCODE_LABEL = 'sw_encode_time'
20LATENCY_50_SUFFIX = '.encode_latency.50_percentile'
21LATENCY_75_SUFFIX = '.encode_latency.75_percentile'
22LATENCY_95_SUFFIX = '.encode_latency.95_percentile'
23HW_PREFIX = 'hw_'
24SW_PREFIX = 'sw_'
25
26class video_JEAPerf(chrome_binary_test.ChromeBinaryTest):
27    """
28    This test monitors performance metrics reported by Chrome test binary,
29    jpeg_encode_accelerator_unittest.
30    """
31
32    version = 1
33    binary = 'jpeg_encode_accelerator_unittest'
34
35    def report_perf_results(self, test_name, output_path):
36        hw_times = []
37        sw_times = []
38        with open(output_path, 'r') as f:
39            lines = f.readlines()
40            lines = [line.strip() for line in lines]
41            for line in lines:
42                key_value = line.split(':')
43                if len(key_value) != 2:
44                    continue
45                (key, value) = (key_value[0].strip(), key_value[1].strip())
46                if key == HW_ENCODE_LABEL:
47                    hw_times.append(int(value))
48                if key == SW_ENCODE_LABEL:
49                    sw_times.append(int(value))
50        hw_times.sort()
51        sw_times.sort()
52
53        if len(hw_times) > 0:
54            percentile_50 = len(hw_times) / 2
55            percentile_75 = len(hw_times) * 3 / 4
56            percentile_95 = len(hw_times) * 95 / 100
57            test_title = HW_PREFIX + test_name
58            self.output_perf_value(description=(test_title + LATENCY_50_SUFFIX),
59                value=hw_times[percentile_50],
60                units=TIME_UNIT, higher_is_better=False)
61            self.output_perf_value(description=(test_title + LATENCY_75_SUFFIX),
62                value=hw_times[percentile_75],
63                units=TIME_UNIT, higher_is_better=False)
64            self.output_perf_value(description=(test_title + LATENCY_95_SUFFIX),
65                value=hw_times[percentile_95],
66                units=TIME_UNIT, higher_is_better=False)
67
68        if len(sw_times) > 0:
69            percentile_50 = len(sw_times) / 2
70            percentile_75 = len(sw_times) * 3 / 4
71            percentile_95 = len(sw_times) * 95 / 100
72            test_title = SW_PREFIX + test_name
73            self.output_perf_value(description=(test_title + LATENCY_50_SUFFIX),
74                value=sw_times[percentile_50],
75                units=TIME_UNIT, higher_is_better=False)
76            self.output_perf_value(description=(test_title + LATENCY_75_SUFFIX),
77                value=sw_times[percentile_75],
78                units=TIME_UNIT, higher_is_better=False)
79            self.output_perf_value(description=(test_title + LATENCY_95_SUFFIX),
80                value=sw_times[percentile_95],
81                units=TIME_UNIT, higher_is_better=False)
82
83    def remove_if_exists(self, file_path):
84        try:
85            os.remove(file_path)
86        except OSError as e:
87            if e.errno != errno.ENOENT:  # no such file
88                raise
89
90    @helper_logger.video_log_wrapper
91    @chrome_binary_test.nuke_chrome
92    def run_once(self, test_cases, capability):
93        """
94        Runs JpegEncodeAcceleratorTest.SimpleEncode on the device and reports
95        latency values for HW and SW.
96
97        @param capability: Capability required for executing this test.
98        """
99        device_capability.DeviceCapability().ensure_capability(capability)
100
101        for (image_path, width, height) in test_cases:
102            url = DOWNLOAD_BASE + image_path
103            file_name = os.path.basename(image_path)
104            input_path = os.path.join(self.bindir, file_name)
105            file_utils.download_file(url, input_path)
106            test_name = ('%s_%dx%d' % (file_name, width, height))
107            output_path = os.path.join(self.tmpdir, TEST_LOG)
108
109            cmd_line_list = [helper_logger.chrome_vmodule_flag()] + [
110                '--gtest_filter=JpegEncodeAcceleratorTest.SimpleEncode',
111                ('--output_log=%s' % output_path),
112                ('--repeat=%d' % REPEAT_TIMES),
113                ('--yuv_filenames="%s:%dx%d"' % (input_path, width, height))
114            ]
115            cmd_line = ' '.join(cmd_line_list)
116            try:
117                self.run_chrome_test_binary(self.binary, cmd_line)
118                self.report_perf_results(test_name, output_path)
119            except Exception as last_error:
120                # Log the error and continue to the next test case.
121                logging.exception(last_error)
122            finally:
123                self.remove_if_exists(input_path)
124                self.remove_if_exists(output_path)
125