• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2010 The Chromium OS 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 logging, os, re
6
7from autotest_lib.client.bin import test
8from autotest_lib.client.bin import utils as bin_utils
9from autotest_lib.client.common_lib import error, utils
10
11class platform_AesThroughput(test.test):
12    version = 1
13
14
15    def setup(self):
16        self.results = {'bytes_per_sec_ideal_min' : 20 * 1024 * 1024}
17
18
19    def run_once(self):
20        num_cpus = bin_utils.count_cpus()
21        logging.debug('Running using all cpus: %d' % num_cpus)
22        results = self.openssl_speed('aes-256-cbc', '-multi %d' % num_cpus)
23        parsed = self.parse_results(results)
24        self.update_stats(parsed)
25        self.export_stats()
26
27
28    def openssl_speed(self, cipher, options=''):
29        cmd = 'openssl speed %s -mr %s' % (cipher, options)
30        return utils.system_output(cmd, retain_output=True)
31
32
33    def parse_results(self, results, name=''):
34        # Split the results into lines.
35        # We really only want the final line for our purposes.
36        type, times = results.split("\n")[-1].split(' ')
37        # +F:num:aes-256 cbc -> aes_256_cbc
38        type = re.sub('[- ]', '_', type.split(':')[-1])
39        # cbc:time:time:time:... -> time, time, ...
40        times = times.split(':')[1:]
41
42        # Build the key names
43        if len(name) > 0:
44          name = name + '_'
45        key_prefix = 'bytes_per_sec_' + name + type + '_blocksz_'
46        keys = ['16_bytes', '64_bytes', '256_bytes', '1024_bytes', '8192_bytes']
47        keys = [key_prefix+k for k in keys]
48
49        if len(times) > len(keys):
50            logging.debug(results)
51            raise error.TestFail('openssl output format parsing failed')
52        return dict(zip(keys, times))
53
54
55    def update_stats(self, keyvals):
56        self.results.update(keyvals)
57
58
59    def export_stats(self):
60        self.write_perf_keyval(self.results)
61