blob: 8bd374958d3f730673909d8da7f475d0375c3c6c [file] [log] [blame]
# Copyright (c) 2010 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.
import logging, os, shutil, tempfile
from autotest_lib.client.bin import fio_util, test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cryptohome
CRYPTOHOMESTRESS_START = '/tmp/cryptohomestress_begin'
CRYPTOHOMESTRESS_END = '/tmp/cryptohomestress_end'
TEST_USER = 'test@chromium.org'
TEST_PASSWORD = 'test'
class platform_CryptohomeFio(test.test):
"""Run FIO in the crypto partition."""
version = 2
USE_CRYPTO = 'crypto'
USE_PLAIN = 'plain'
USE_TMPFS = 'tmpfs'
DISK_CONFIG_KEYS = [ USE_CRYPTO, USE_PLAIN, USE_TMPFS ]
def initialize(self, from_internal_disk_only=False):
""" Check that we are running on the fixed device"""
if from_internal_disk_only and not utils.is_booted_from_internal_disk():
raise error.TestNAError('Test only on internal disk')
if os.path.exists(CRYPTOHOMESTRESS_END):
os.unlink(CRYPTOHOMESTRESS_END)
open(CRYPTOHOMESTRESS_START, 'w').close()
def run_once(self, runtime, disk_configs,
script=None, sysctls_list=None):
"""
Create a 300MB file in tmpfs/encrypted/unencrypted location
and run fio tesst.
@param disk_configs: list of keys from DISK_CONFIG_KEYS.
@param script: fio script to run
@param sysctls_list: list of dictionary of sysctls to alter.
"""
if not set(disk_configs).issubset(set(self.DISK_CONFIG_KEYS)):
raise error.TestFail('Unknown keys in disk config')
for config in disk_configs:
for sysctls in sysctls_list or [ {} ]:
graph_descr = ''
for key, val in sysctls.iteritems():
utils.sysctl(key, val)
graph_descr += '-'.join([os.path.basename(key), str(val)])
# Mount a test cryptohome vault.
if config == self.USE_CRYPTO:
cryptohome.mount_vault(TEST_USER, TEST_PASSWORD,
create=True)
tmpdir = cryptohome.user_path(TEST_USER)
elif config == self.USE_TMPFS:
tmpdir = None
else:
tmpdir = self.tmpdir
self.__work_dir = tempfile.mkdtemp(dir=tmpdir)
results = {}
# TODO make these parameters to run_once & check disk for space.
self.__filesize = '300m'
self.__runtime = str(runtime)
env_vars = ' '.join(
['FILENAME=' + os.path.join(self.__work_dir, script),
'FILESIZE=' + self.__filesize,
'RUN_TIME=' + self.__runtime
])
job_file = os.path.join(self.bindir, script)
results.update(fio_util.fio_runner(self, job_file, env_vars,
name_prefix=graph_descr + config))
self.write_perf_keyval(results)
logging.info('Finished with FS stress, cleaning up.')
if config == self.USE_CRYPTO:
cryptohome.unmount_vault(TEST_USER)
cryptohome.remove_vault(TEST_USER)
else:
shutil.rmtree(self.__work_dir)
def cleanup(self):
open(CRYPTOHOMESTRESS_END, 'w').close()
if os.path.exists(CRYPTOHOMESTRESS_START):
os.unlink(CRYPTOHOMESTRESS_START)