# 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.
TIME='MEDIUM'
AUTHOR = 'The Chromium OS Authors'
DOC = """
External storage test suite.

Tests external storage (USB flash drive / card reader with SD-card inserted)
performance using several benchmark tools.
"""
NAME = 'hardware_ExternalDrives'
PURPOSE = 'Benchmark external storage devices.'
CRITERIA = 'This test is a benchmark.'
TEST_CLASS = 'hardware'
TEST_CATEGORY = 'Performance'
TEST_TYPE = 'client'
VERSION = '1'

import os, re

from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cros_ui

def find_root_dev():
    rootdev = utils.system_output('rootdev -s -d')
    return os.path.basename(rootdev)


def find_all_storage_dev():
    lssys = utils.run('ls -d /sys/block/sd*')
    devices = lssys.stdout.rsplit('\n')
    new_devices = [os.path.basename(d.rstrip()) for d in devices if d]
    return new_devices


num_retry = 3
dialog = cros_ui.Dialog(question=("Please insert a USB flash drive and "
    "a SD-card. Then press the RETRY button."), choices=['RETRY'])


while num_retry:
    # Find all block devices in the system.
    devices = find_all_storage_dev()
    devices.remove(find_root_dev())

    if len(devices) >= 2:
        # For each device, run the whole test suite.
        for device in devices:
            devpath = '/dev/' + device
            if os.path.exists(devpath):
                job.run_test('hardware_StorageFio', dev=devpath, tag=device)
        break
    else:
        result = dialog.get_result()
        num_retry -= 1;

else:
    raise error.TestError('Unable to find a USB flash drive and a SD-card')

