Provide functional performance method to run performance tests using a user-supplied performance traffic generator. The single core performance test is included, with some basic statistics checks verifying TG packet transmission rates.
Bugzilla ID: 1697 Signed-off-by: Nicholas Pratte <npra...@iol.unh.edu> --- dts/framework/test_suite.py | 27 +++++++++++++++++++++++++ dts/tests/TestSuite_single_core_perf.py | 24 ++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 dts/tests/TestSuite_single_core_perf.py diff --git a/dts/framework/test_suite.py b/dts/framework/test_suite.py index 507df508cb..a89faac2d5 100644 --- a/dts/framework/test_suite.py +++ b/dts/framework/test_suite.py @@ -38,6 +38,10 @@ CapturingTrafficGenerator, PacketFilteringConfig, ) +from framework.testbed_model.traffic_generator.performance_traffic_generator import ( + PerformanceTrafficGenerator, + PerformanceTrafficStats, +) from .exception import ConfigurationError, InternalError, TestCaseVerifyError from .logger import DTSLogger, get_dts_logger @@ -266,6 +270,26 @@ def send_packets_and_capture( duration, ) + def assess_performance_by_packet( + self, packet: Packet, duration: int = 60 + ) -> PerformanceTrafficStats: + """Send a given packet for a given duration and assess basic performance statistics. + + Send `packet` and assess NIC performance for a given duration, corresponding to the test + suite's given topology. + + Args: + packet: The packet to send. + duration: Performance test duration (in seconds) + + Returns: + Performance statistics of the generated test. + """ + assert isinstance( + self._ctx.perf_tg, PerformanceTrafficGenerator + ), "Cannot run performance tests on non-performance traffic generator." + return self._ctx.perf_tg.generate_traffic_and_stats(packet, duration) + def send_packets( self, packets: list[Packet], @@ -275,6 +299,9 @@ def send_packets( Args: packets: Packets to send. """ + assert isinstance( + self._ctx.perf_tg, CapturingTrafficGenerator + ), "Cannot run performance tests on non-capturing traffic generator." packets = self._adjust_addresses(packets) self._ctx.func_tg.send_packets(packets, self._ctx.topology.tg_port_egress) diff --git a/dts/tests/TestSuite_single_core_perf.py b/dts/tests/TestSuite_single_core_perf.py new file mode 100644 index 0000000000..31a8c8608f --- /dev/null +++ b/dts/tests/TestSuite_single_core_perf.py @@ -0,0 +1,24 @@ +"""Single core performance test suite.""" + +from scapy.layers.inet import IP +from scapy.layers.l2 import Ether +from scapy.packet import Raw + +from framework.remote_session.testpmd_shell import TestPmdShell +from framework.test_suite import TestSuite, perf_test + + +class TestSingleCorePerf(TestSuite): + """Single core performance test suite.""" + + @perf_test + def test_perf_test(self) -> None: + """Prototype test case.""" + with TestPmdShell() as testpmd: + packet = Ether() / IP() / Raw(load="x" * 1484) # 1518 byte packet. + + testpmd.start() + stats = self.assess_performance_by_packet(packet, duration=5) + self.verify( + stats.tx_expected_bps == 40, "Expected output does not patch recorded output." + ) -- 2.47.1