# Copyright (c) 2014 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 time
from autotest_lib.server import autotest
from autotest_lib.server import hosts
from autotest_lib.server import test


class hardware_StorageQualBase(test.test):
    """Tests run at the beginning over the disk qual test.

    This code runs simple tests to ensure the device meet basic critera.
    """

    version = 1

    FIO_ARGV = {'constraints': [
        '_seq_read_read_bw >= 50 * 1024',
        '_seq_write_write_bw >= 15 * 1024',
        '_16k_write_write_iops >= 10'],
        'requirements': [
            ('seq_write', []),
            ('seq_read', []),
            ('4k_write', []),
            ('4k_read', []),
            ('16k_write', []),
            ('16k_read', [])],
    }


    CLIENT_FUNCTIONAL_TESTS = [
        ('hardware_DiskSize', {'constraints': ['gb_main_disk_size >= 8']}),
        ('hardware_SsdDetection', {
            'constraints': ['mb_ssd_device_size >= 8000']}),
        ('hardware_StorageFio', FIO_ARGV)
    ]

    CRYPTO_RUNTIME = 5 * 60  # seconds.

    CRYPTO_TESTS = [
        'surfing',
        'boot',
        'login',
        'seq_write',
        'seq_read',
        '16k_write',
        '16k_read',
        '8k_write',
        '8k_read',
        '4k_write',
        '4k_read',
    ]


    def run_once(self, client_ip, client_tag='', crypto_runtime=CRYPTO_RUNTIME,
                 cq=False, nonroot=False):
        """
        Runs simple tests to ensure the device meets basic criteria.

        @param client_ip: ip address of the client machine
        @param client_tag: client tag for keyval label
        @param crypto_runtime: runtime for platform.CryptohomeFio tests
        @param cq: part of a cq run

        """

        # in a cq run, do not execute the test, just output
        # the order that the test would have run in
        if cq:
            self.write_test_keyval(
                {'storage_qual_cq': ('%f hardware_StorageQualBase_%s'
                    % (time.time(), client_tag))})
            return

        client = hosts.create_host(client_ip)
        client_at = autotest.Autotest(client)

        if nonroot:
            client_at.run_test("hardware_StorageFioOther", disable_sysinfo=True,
                               tag=client_tag, **self.FIO_ARGV)
        else:
            for test_name, argv in self.CLIENT_FUNCTIONAL_TESTS:
                client_at.run_test(test_name, disable_sysinfo=True,
                                   tag=client_tag, **argv)

            # Test real life performance
            for script in self.CRYPTO_TESTS:
                client_at.run_test('platform_CryptohomeFio',
                    disable_sysinfo=True,
                    from_internal_disk_only=True,
                    script=script,
                    tag='_'.join([client_tag, script]),
                    runtime=crypto_runtime,
                    disk_configs=['crypto', 'plain'])
