From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DBD4330641 for ; Fri, 6 Mar 2026 02:09:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772762966; cv=none; b=B7nsjHxbvUR33p/dMqLHns/4nCIYE+YXiMVWLtvi9hkwIe38hzA3nEcVg8uzgXCHQJ61WSUX2tEsjhsHOrCFamAkgC3Jing6mrpqLAb+oviFh1ka4egw9JgcT08yxFmMXMUu3VdPm5fDErabuFCPwYeBOqIAFD+J2sWnoif9dQM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772762966; c=relaxed/simple; bh=w0CCf3hB6dabePge4l0fCTGlUbFdyWS1bRH8dbrdisA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d2izE2NC8/8rmcQTExaWgo96UNfmQ+MU31XmAL3dOkPBb2MlqoZwEFwPICHyuXWePzRxrZK2XAZ2h5zhUZPeKQahtmfdGPJOMjNiKpWw8MR85n6cVrq/WFtHxxYL6hMANotahc/ObD8DFrd+Q397kj8Oi8p2qwm2pbq7pFdlTSo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l5qmJ2mq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="l5qmJ2mq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 780A7C2BCAF; Fri, 6 Mar 2026 02:09:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772762965; bh=w0CCf3hB6dabePge4l0fCTGlUbFdyWS1bRH8dbrdisA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l5qmJ2mqi5esfj5/8Iql9AQqz/XV4UXVO1dVMBot8y8u5SK0KrnSRbbxfT4RhV2O6 Uws/2AszkTlGFPxlkas+p6S6FjlaGJ7Q+gggNv2vsTGO52mRnh6TLSVzkAYsyzF/zA yhoPB8ypefD7SI5hsLjPbODXI5h6ZlpTzvShEOns26cdHO4fH2TsAgSimWYW6+1WqT 8zqYWxho3RNRQKHSyS9DIdxUbs2yM8fi66SnOECdB3obrO/cawSauuBcsLqAhbsbsP ioF3UoY2TLCHtSoaCX2WJt89iFWRvVZ6jZ0gEvfxfwmkZsxB1Io5lfG9EABJ9Q4Z6r dekP4ylrDPXpA== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, donald.hunter@gmail.com, liuhangbin@gmail.com, matttbe@kernel.org, Jakub Kicinski Subject: [PATCH net-next 08/10] tools: ynl: convert ethtool sample to selftest Date: Thu, 5 Mar 2026 18:08:59 -0800 Message-ID: <20260306020901.524105-9-kuba@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260306020901.524105-1-kuba@kernel.org> References: <20260306020901.524105-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Convert ethtool.c to use kselftest_harness.h with FIXTURE/TEST_F. Move ethtool from BINS to TEST_GEN_FILES and add ethtool.sh wrapper which sets up a netdevsim device before running the test binary. Output: TAP version 13 1..2 # Starting 2 tests from 1 test cases. # RUN ethtool.channels ... # nsim0: combined 1 # OK ethtool.channels ok 1 ethtool.channels # RUN ethtool.rings ... # nsim0: rx 512 tx 512 # OK ethtool.rings ok 2 ethtool.rings # PASSED: 2 / 2 tests passed. # Totals: pass:2 fail:0 xfail:0 xpass:0 skip:0 error:0 Signed-off-by: Jakub Kicinski --- tools/net/ynl/tests/Makefile | 3 +- tools/net/ynl/tests/ethtool.c | 83 ++++++++++++++++++++++------------ tools/net/ynl/tests/ethtool.sh | 5 ++ 3 files changed, 62 insertions(+), 29 deletions(-) create mode 100755 tools/net/ynl/tests/ethtool.sh diff --git a/tools/net/ynl/tests/Makefile b/tools/net/ynl/tests/Makefile index 14d399a70f10..c380e9f331a3 100644 --- a/tools/net/ynl/tests/Makefile +++ b/tools/net/ynl/tests/Makefile @@ -15,6 +15,7 @@ LDLIBS=../lib/ynl.a ../generated/protos.a TEST_PROGS := \ devlink.sh \ + ethtool.sh \ test_ynl_cli.sh \ test_ynl_ethtool.sh \ # end of TEST_PROGS @@ -28,10 +29,10 @@ TEST_GEN_PROGS := \ TEST_GEN_FILES := \ devlink \ + ethtool \ # end of TEST_GEN_FILES BINS := \ - ethtool \ rt-addr \ rt-route \ # end of BINS diff --git a/tools/net/ynl/tests/ethtool.c b/tools/net/ynl/tests/ethtool.c index a7ebbd1b98db..926a75d23c9b 100644 --- a/tools/net/ynl/tests/ethtool.c +++ b/tools/net/ynl/tests/ethtool.c @@ -6,28 +6,49 @@ #include +#include + #include "ethtool-user.h" -int main(int argc, char **argv) +FIXTURE(ethtool) +{ + struct ynl_sock *ys; +}; + +FIXTURE_SETUP(ethtool) +{ + self->ys = ynl_sock_create(&ynl_ethtool_family, NULL); + ASSERT_NE(NULL, self->ys) + TH_LOG("failed to create ethtool socket"); +} + +FIXTURE_TEARDOWN(ethtool) +{ + ynl_sock_destroy(self->ys); +} + +TEST_F(ethtool, channels) { struct ethtool_channels_get_req_dump creq = {}; - struct ethtool_rings_get_req_dump rreq = {}; struct ethtool_channels_get_list *channels; - struct ethtool_rings_get_list *rings; - struct ynl_sock *ys; - ys = ynl_sock_create(&ynl_ethtool_family, NULL); - if (!ys) - return 1; + creq._present.header = 1; /* ethtool needs an empty nest */ + channels = ethtool_channels_get_dump(self->ys, &creq); + ASSERT_NE(NULL, channels) { + TH_LOG("channels dump failed: %s", self->ys->err.msg); + } - creq._present.header = 1; /* ethtool needs an empty nest, sigh */ - channels = ethtool_channels_get_dump(ys, &creq); - if (!channels) - goto err_close; + if (ynl_dump_empty(channels)) { + ethtool_channels_get_list_free(channels); + SKIP(return, "no entries in channels dump"); + } - printf("Channels:\n"); ynl_dump_foreach(channels, dev) { - printf(" %8s: ", dev->header.dev_name); + EXPECT_TRUE((bool)dev->header._len.dev_name); + ksft_print_msg("%8s: ", dev->header.dev_name); + EXPECT_TRUE(dev->_present.rx_count || + dev->_present.tx_count || + dev->_present.combined_count); if (dev->_present.rx_count) printf("rx %d ", dev->rx_count); if (dev->_present.tx_count) @@ -37,15 +58,28 @@ int main(int argc, char **argv) printf("\n"); } ethtool_channels_get_list_free(channels); +} - rreq._present.header = 1; /* ethtool needs an empty nest.. */ - rings = ethtool_rings_get_dump(ys, &rreq); - if (!rings) - goto err_close; +TEST_F(ethtool, rings) +{ + struct ethtool_rings_get_req_dump rreq = {}; + struct ethtool_rings_get_list *rings; + + rreq._present.header = 1; /* ethtool needs an empty nest */ + rings = ethtool_rings_get_dump(self->ys, &rreq); + ASSERT_NE(NULL, rings) { + TH_LOG("rings dump failed: %s", self->ys->err.msg); + } + + if (ynl_dump_empty(rings)) { + ethtool_rings_get_list_free(rings); + SKIP(return, "no entries in rings dump"); + } - printf("Rings:\n"); ynl_dump_foreach(rings, dev) { - printf(" %8s: ", dev->header.dev_name); + EXPECT_TRUE((bool)dev->header._len.dev_name); + ksft_print_msg("%8s: ", dev->header.dev_name); + EXPECT_TRUE(dev->_present.rx || dev->_present.tx); if (dev->_present.rx) printf("rx %d ", dev->rx); if (dev->_present.tx) @@ -53,13 +87,6 @@ int main(int argc, char **argv) printf("\n"); } ethtool_rings_get_list_free(rings); - - ynl_sock_destroy(ys); - - return 0; - -err_close: - fprintf(stderr, "YNL (%d): %s\n", ys->err.code, ys->err.msg); - ynl_sock_destroy(ys); - return 2; } + +TEST_HARNESS_MAIN diff --git a/tools/net/ynl/tests/ethtool.sh b/tools/net/ynl/tests/ethtool.sh new file mode 100755 index 000000000000..b4f0b2a707bc --- /dev/null +++ b/tools/net/ynl/tests/ethtool.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +source "$(dirname "$(realpath "$0")")/ynl_nsim_lib.sh" +nsim_setup +exec "$(dirname "$(realpath "$0")")/ethtool" -- 2.53.0