blob: 830aca127bf1efd3b58ea6f62fc35aac7ad51601 [file] [log] [blame]
# Copyright 2024 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A test to check PDC firmware information.
Description
-----------
This test checks the PDC firmware version, name, and driver against expected
values or minimum versions.
Test Procedure
--------------
This is an automated test without user interaction.
1. Retrieve the PDC firmware information using `ectool pdchipinfo usbpdid`.
2. Compare the retrieved information with the expected values (if provided).
3. Compare the retrieved version information with the minimum versions (if
provided).
Dependency
----------
- ``ectool``
Examples
--------
To check if the PDC firmware version is "0.0.0.0.0.0.27.1"::
{
"pytest_name": "check_pdc_firmware",
"args": {
"expected_fw_version_dec": "0.0.0.0.0.0.27.1",
"expected_fw_name_str": "GOOG0000",
"expected_driver_name": "realtek_rts54_pdc",
"usb_pd_id": 0
}
}
To check if the PDC firmware version is at least "0.0.0.0.0.0.27.0"::
{
"pytest_name": "check_pdc_firmware",
"args": {
"min_fw_version_dec": "0.0.0.0.0.0.27.0",
"usb_pd_id": 0
}
}
"""
import logging
import re
from typing import Dict
from packaging import version
from cros.factory.device import device_utils
from cros.factory.test import test_case
from cros.factory.utils.arg_utils import Arg
class CheckPDCFirmwareArgs:
expected_fw_version_dec: str
min_fw_version_dec: str
expected_fw_name_str: str
expected_driver_name: str
usb_pd_id: int
class CheckPDCFirmwareTest(test_case.TestCase):
"""Check the PDC firmware information."""
related_components = tuple()
ARGS = [
Arg('expected_fw_version_dec', str, 'Expected PDC firmware version.',
default=None),
Arg('min_fw_version_dec', str, 'Minimum PDC firmware version.',
default=None),
Arg('expected_fw_name_str', str, 'Expected PDC firmware name string.',
default=None),
Arg('expected_driver_name', str, 'Expected PDC driver name.',
default=None),
Arg('usb_pd_id', int, 'USB PD ID of the PDC chip.', default=0),
]
args: CheckPDCFirmwareArgs
def setUp(self):
self.dut = device_utils.CreateDUTInterface()
self.expected_fw_version_dec = self.args.expected_fw_version_dec
self.min_fw_version_dec = self.args.min_fw_version_dec
self.expected_fw_name_str = self.args.expected_fw_name_str
self.expected_driver_name = self.args.expected_driver_name
self.usb_pd_id = self.args.usb_pd_id
def runTest(self):
"""Retrieves and verifies the PDC firmware information."""
fw_info = self._GetPDCFirmwareInfo()
logging.info('DUT PDC firmware information: %s', fw_info)
if self.expected_fw_version_dec:
if self.min_fw_version_dec:
self.FailTask(
'If expected_fw_version_dec is set, min_fw_version_dec should not '
'be set.')
expected_version = version.parse(self.expected_fw_version_dec)
if fw_info['fw_version_dec'] != expected_version:
self.FailTask(
f'DUT PDC firmware version is {fw_info["fw_version_dec"]}, '
f'expected {expected_version}')
elif self.min_fw_version_dec:
min_version = version.parse(self.min_fw_version_dec)
if version.parse(fw_info['fw_version_dec']) < min_version:
self.FailTask(
f'DUT PDC firmware version is {fw_info["fw_version_dec"]}, '
f'should be at least {min_version}')
if self.expected_fw_name_str and fw_info[
'fw_name_str'] != self.expected_fw_name_str:
self.FailTask(
f'DUT PDC firmware name string is {fw_info["fw_name_str"]}, '
f'expected {self.expected_fw_name_str}')
if self.expected_driver_name and fw_info[
'driver_name'] != self.expected_driver_name:
self.FailTask(f'DUT PDC driver name is {fw_info["driver_name"]}, '
f'expected {self.expected_driver_name}')
def _GetPDCFirmwareInfo(self) -> Dict[str, str]:
"""Retrieves and formats the PDC firmware information.
Returns:
dict: The formatted PDC firmware information.
"""
output = self.dut.CheckOutput(['ectool', 'pdchipinfo', str(self.usb_pd_id)])
fw_info: Dict[str, str] = {}
match = re.search(r'fw_version_dec: (\S+)', output)
if not match:
raise ValueError(f"Couldn't find fw_version_dec in output: {output}")
fw_info['fw_version_dec'] = match.group(1)
match = re.search(r"fw_name_str: '(\S+)'", output)
if not match:
raise ValueError(f"Couldn't find fw_name_str in output: {output}")
fw_info['fw_name_str'] = match.group(1)
match = re.search(r"driver_name: '(\S+)'", output)
if not match:
raise ValueError(f"Couldn't find driver_name in output: {output}")
fw_info['driver_name'] = match.group(1)
return fw_info