# Copyright (c) 2020 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.

"""These are convenience functions that ideally are never run, but in case of
problems collect additional information about some part of the system (both
DUT and test-driving host.

Given this sporadic nature, this is not wrapped in a class but merely a
collection of functions that get the necessary inputs at the time when they're
called and need them.

The functions return a (multi-line) string that can be attached to test errors
and similar places that end up in the logs."""


def collect_usb_state(servo):
    """Collect status on USB ports and attached devices, USB mass storage in
    particular.

    _servo is a server.cros.servo object that can call into the DUT and query
    elements.

    collects the DUT-side output of :
     - `lsusb` and `lsusb -t` output to learn about the topology;
     - `ls -lv /dev/sd*` to learn which storage devices are known to the OS and
       what partition scheme is assumed by the kernel (-v to sort numerically);
     - `fdisk -l` for the partitioning as reported in GPT/MBR

    Note that the return value begins with a newline.
    """
    lines = []
    for cmd in [
            'lsusb',
            'lsusb -t',
            'ls -lv /dev/sd*',
            'fdisk -l'
    ]:
        output = servo.system_output(cmd, ignore_status=True)
        lines.append('')
        lines.append('%s:' % cmd)
        lines.extend('    %s' % line for line in output.splitlines())
    return '\n'.join(lines)

# Add more collect functions here as necessary
