mirror of https://github.com/F-Stack/f-stack.git
108 lines
3.8 KiB
Python
108 lines
3.8 KiB
Python
|
# SPDX-License-Identifier: BSD-3-Clause
|
||
|
# Copyright(c) 2023 University of New Hampshire
|
||
|
|
||
|
import re
|
||
|
|
||
|
from framework.config import PortConfig
|
||
|
from framework.remote_session import TestPmdShell
|
||
|
from framework.settings import SETTINGS
|
||
|
from framework.test_suite import TestSuite
|
||
|
from framework.utils import REGEX_FOR_PCI_ADDRESS
|
||
|
|
||
|
|
||
|
class SmokeTests(TestSuite):
|
||
|
is_blocking = True
|
||
|
# dicts in this list are expected to have two keys:
|
||
|
# "pci_address" and "current_driver"
|
||
|
nics_in_node: list[PortConfig] = []
|
||
|
|
||
|
def set_up_suite(self) -> None:
|
||
|
"""
|
||
|
Setup:
|
||
|
Set the build directory path and generate a list of NICs in the SUT node.
|
||
|
"""
|
||
|
self.dpdk_build_dir_path = self.sut_node.remote_dpdk_build_dir
|
||
|
self.nics_in_node = self.sut_node.config.ports
|
||
|
|
||
|
def test_unit_tests(self) -> None:
|
||
|
"""
|
||
|
Test:
|
||
|
Run the fast-test unit-test suite through meson.
|
||
|
"""
|
||
|
self.sut_node.main_session.send_command(
|
||
|
f"meson test -C {self.dpdk_build_dir_path} --suite fast-tests -t 60",
|
||
|
480,
|
||
|
verify=True,
|
||
|
privileged=True,
|
||
|
)
|
||
|
|
||
|
def test_driver_tests(self) -> None:
|
||
|
"""
|
||
|
Test:
|
||
|
Run the driver-test unit-test suite through meson.
|
||
|
"""
|
||
|
vdev_args = ""
|
||
|
for dev in self.sut_node.virtual_devices:
|
||
|
vdev_args += f"--vdev {dev} "
|
||
|
vdev_args = vdev_args[:-1]
|
||
|
driver_tests_command = f"meson test -C {self.dpdk_build_dir_path} --suite driver-tests"
|
||
|
if vdev_args:
|
||
|
self._logger.info(
|
||
|
f"Running driver tests with the following virtual devices: {vdev_args}"
|
||
|
)
|
||
|
driver_tests_command += f' --test-args "{vdev_args}"'
|
||
|
|
||
|
self.sut_node.main_session.send_command(
|
||
|
driver_tests_command,
|
||
|
300,
|
||
|
verify=True,
|
||
|
privileged=True,
|
||
|
)
|
||
|
|
||
|
def test_devices_listed_in_testpmd(self) -> None:
|
||
|
"""
|
||
|
Test:
|
||
|
Uses testpmd driver to verify that devices have been found by testpmd.
|
||
|
"""
|
||
|
testpmd_driver = self.sut_node.create_interactive_shell(TestPmdShell, privileged=True)
|
||
|
dev_list = [str(x) for x in testpmd_driver.get_devices()]
|
||
|
for nic in self.nics_in_node:
|
||
|
self.verify(
|
||
|
nic.pci in dev_list,
|
||
|
f"Device {nic.pci} was not listed in testpmd's available devices, "
|
||
|
"please check your configuration",
|
||
|
)
|
||
|
|
||
|
def test_device_bound_to_driver(self) -> None:
|
||
|
"""
|
||
|
Test:
|
||
|
Ensure that all drivers listed in the config are bound to the correct
|
||
|
driver.
|
||
|
"""
|
||
|
path_to_devbind = self.sut_node.path_to_devbind_script
|
||
|
|
||
|
all_nics_in_dpdk_devbind = self.sut_node.main_session.send_command(
|
||
|
f"{path_to_devbind} --status | awk '{REGEX_FOR_PCI_ADDRESS}'",
|
||
|
SETTINGS.timeout,
|
||
|
).stdout
|
||
|
|
||
|
for nic in self.nics_in_node:
|
||
|
# This regular expression finds the line in the above string that starts
|
||
|
# with the address for the nic we are on in the loop and then captures the
|
||
|
# name of the driver in a group
|
||
|
devbind_info_for_nic = re.search(
|
||
|
f"{nic.pci}[^\\n]*drv=([\\d\\w-]*) [^\\n]*",
|
||
|
all_nics_in_dpdk_devbind,
|
||
|
)
|
||
|
self.verify(
|
||
|
devbind_info_for_nic is not None,
|
||
|
f"Failed to find configured device ({nic.pci}) using dpdk-devbind.py",
|
||
|
)
|
||
|
# We know this isn't None, but mypy doesn't
|
||
|
assert devbind_info_for_nic is not None
|
||
|
self.verify(
|
||
|
devbind_info_for_nic.group(1) == nic.os_driver_for_dpdk,
|
||
|
f"Driver for device {nic.pci} does not match driver listed in "
|
||
|
f"configuration (bound to {devbind_info_for_nic.group(1)})",
|
||
|
)
|