]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tools: ynl: convert rt-addr sample to selftest
authorJakub Kicinski <kuba@kernel.org>
Sat, 7 Mar 2026 03:36:29 +0000 (19:36 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 10 Mar 2026 00:02:27 +0000 (17:02 -0700)
Convert rt-addr.c to use kselftest_harness.h with FIXTURE/TEST_F.

Validate that the addresses configured by the wrapper (192.168.1.1
and 2001:db8::1) appear in the dump.

Output:

  TAP version 13
  1..1
  # Starting 1 tests from 1 test cases.
  #  RUN           rt_addr.dump ...
  #               lo: 127.0.0.1
  #            nsim0: 192.168.1.1
  #               lo: ::1
  #            nsim0: 2001:db8::1
  #            nsim0: fe80::7c66:c9ff:fe5f:bf01
  #            OK  rt_addr.dump
  ok 1 rt_addr.dump
  # PASSED: 1 / 1 tests passed.
  # Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0

Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Tested-by: Donald Hunter <donald.hunter@gmail.com>
Link: https://patch.msgid.link/20260307033630.1396085-10-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/net/ynl/tests/Makefile
tools/net/ynl/tests/rt-addr.c
tools/net/ynl/tests/rt-addr.sh [new file with mode: 0755]

index c380e9f331a384dadf3b38febfd57eece00a2243..52b54ea6c90f0132a29460e495762d6b4ea9e5d5 100644 (file)
@@ -16,6 +16,7 @@ LDLIBS=../lib/ynl.a ../generated/protos.a
 TEST_PROGS := \
        devlink.sh \
        ethtool.sh \
+       rt-addr.sh \
        test_ynl_cli.sh \
        test_ynl_ethtool.sh \
 # end of TEST_PROGS
@@ -30,10 +31,10 @@ TEST_GEN_PROGS := \
 TEST_GEN_FILES := \
        devlink \
        ethtool \
+       rt-addr \
 # end of TEST_GEN_FILES
 
 BINS := \
-       rt-addr \
        rt-route \
 # end of BINS
 
index 2edde5c36b185936114d950e3f9af001f1878fe6..f6c3715b2f20dfe7b2472af366c0664028c5f802 100644 (file)
@@ -7,9 +7,12 @@
 #include <arpa/inet.h>
 #include <net/if.h>
 
+#include <kselftest_harness.h>
+
 #include "rt-addr-user.h"
 
-static void rt_addr_print(struct rt_addr_getaddr_rsp *a)
+static void rt_addr_print(struct __test_metadata *_metadata,
+                         struct rt_addr_getaddr_rsp *a)
 {
        char ifname[IF_NAMESIZE];
        char addr_str[64];
@@ -17,9 +20,11 @@ static void rt_addr_print(struct rt_addr_getaddr_rsp *a)
        const char *name;
 
        name = if_indextoname(a->_hdr.ifa_index, ifname);
+       EXPECT_NE(NULL, name);
        if (name)
-               printf("%16s: ", name);
+               ksft_print_msg("%16s: ", name);
 
+       EXPECT_TRUE(a->_len.address == 4 || a->_len.address == 16);
        switch (a->_len.address) {
        case 4:
                addr = inet_ntop(AF_INET, a->address,
@@ -41,40 +46,66 @@ static void rt_addr_print(struct rt_addr_getaddr_rsp *a)
        printf("\n");
 }
 
-int main(int argc, char **argv)
+FIXTURE(rt_addr)
+{
+       struct ynl_sock *ys;
+};
+
+FIXTURE_SETUP(rt_addr)
+{
+       struct ynl_error yerr;
+
+       self->ys = ynl_sock_create(&ynl_rt_addr_family, &yerr);
+       ASSERT_NE(NULL, self->ys)
+               TH_LOG("failed to create rt-addr socket: %s", yerr.msg);
+}
+
+FIXTURE_TEARDOWN(rt_addr)
+{
+       ynl_sock_destroy(self->ys);
+}
+
+TEST_F(rt_addr, dump)
 {
        struct rt_addr_getaddr_list *rsp;
        struct rt_addr_getaddr_req *req;
-       struct ynl_error yerr;
-       struct ynl_sock *ys;
+       struct in6_addr v6_expected;
+       struct in_addr v4_expected;
+       bool found_v4 = false;
+       bool found_v6 = false;
 
-       ys = ynl_sock_create(&ynl_rt_addr_family, &yerr);
-       if (!ys) {
-               fprintf(stderr, "YNL: %s\n", yerr.msg);
-               return 1;
-       }
+       /* The bash wrapper for this test adds these addresses on nsim0,
+        * make sure we can find them in the dump.
+        */
+       inet_pton(AF_INET, "192.168.1.1", &v4_expected);
+       inet_pton(AF_INET6, "2001:db8::1", &v6_expected);
 
        req = rt_addr_getaddr_req_alloc();
-       if (!req)
-               goto err_destroy;
+       ASSERT_NE(NULL, req);
 
-       rsp = rt_addr_getaddr_dump(ys, req);
+       rsp = rt_addr_getaddr_dump(self->ys, req);
        rt_addr_getaddr_req_free(req);
-       if (!rsp)
-               goto err_close;
+       ASSERT_NE(NULL, rsp) {
+               TH_LOG("dump failed: %s", self->ys->err.msg);
+       }
 
-       if (ynl_dump_empty(rsp))
-               fprintf(stderr, "Error: no addresses reported\n");
-       ynl_dump_foreach(rsp, addr)
-               rt_addr_print(addr);
-       rt_addr_getaddr_list_free(rsp);
+       ASSERT_FALSE(ynl_dump_empty(rsp)) {
+               rt_addr_getaddr_list_free(rsp);
+               TH_LOG("no addresses reported");
+       }
 
-       ynl_sock_destroy(ys);
-       return 0;
+       ynl_dump_foreach(rsp, addr) {
+               rt_addr_print(_metadata, addr);
 
-err_close:
-       fprintf(stderr, "YNL: %s\n", ys->err.msg);
-err_destroy:
-       ynl_sock_destroy(ys);
-       return 2;
+               found_v4 |= addr->_len.address == 4 &&
+                           !memcmp(addr->address, &v4_expected, 4);
+               found_v6 |= addr->_len.address == 16 &&
+                           !memcmp(addr->address, &v6_expected, 16);
+       }
+       rt_addr_getaddr_list_free(rsp);
+
+       EXPECT_TRUE(found_v4);
+       EXPECT_TRUE(found_v6);
 }
+
+TEST_HARNESS_MAIN
diff --git a/tools/net/ynl/tests/rt-addr.sh b/tools/net/ynl/tests/rt-addr.sh
new file mode 100755 (executable)
index 0000000..8766123
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+source "$(dirname "$(realpath "$0")")/ynl_nsim_lib.sh"
+nsim_setup
+"$(dirname "$(realpath "$0")")/rt-addr"