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