[v1] inet: test if_nametoindex and if_indextoname

Message ID xnle15o6ss.fsf@greed.delorie.com
State Committed
Commit 2eee835eca960c9d4119279804214b7a1ed5d156
Headers
Series [v1] inet: test if_nametoindex and if_indextoname |

Checks

Context Check Description
redhat-pt-bot/TryBot-32bit success Build for i686
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Test passed

Commit Message

DJ Delorie Aug. 9, 2024, 7:05 p.m. UTC
  Tests for if_nameindex, if_name2index, and if_index2name

Tests that valid results are consistent.

Tests that invalid parameters fail correctly.
  

Comments

Florian Weimer Aug. 14, 2024, 12:41 p.m. UTC | #1
* DJ Delorie:

> Tests for if_nameindex, if_name2index, and if_index2name
>
> Tests that valid results are consistent.
>
> Tests that invalid parameters fail correctly.

Looks okay.

Reviewed-by: Florian Weimer <fweimer@redhat.com>

Thanks,
Florian
  
DJ Delorie Aug. 19, 2024, 9:40 p.m. UTC | #2
Florian Weimer <fweimer@redhat.com> writes:
> * DJ Delorie:
>
>> Tests for if_nameindex, if_name2index, and if_index2name
>>
>> Tests that valid results are consistent.
>>
>> Tests that invalid parameters fail correctly.
>
> Looks okay.
>
> Reviewed-by: Florian Weimer <fweimer@redhat.com>

Thanks!  Pushed.
  

Patch

diff --git a/inet/Makefile b/inet/Makefile
index 2f03e6f7ee..cb97b45f0f 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -91,6 +91,7 @@  tests := \
   tst-getni1 \
   tst-getni2 \
   tst-if_index-long \
+  tst-if_nameindex \
   tst-inet6_rth \
   tst-network \
   tst-ntoa \
diff --git a/inet/tst-if_nameindex.c b/inet/tst-if_nameindex.c
new file mode 100644
index 0000000000..b025cdb3a7
--- /dev/null
+++ b/inet/tst-if_nameindex.c
@@ -0,0 +1,116 @@ 
+/* Tests for if_nameindex et al.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <net/if.h>
+#include <netdb.h>
+#include <string.h>
+#include <support/check.h>
+#include <support/descriptors.h>
+#include <support/support.h>
+
+static char *buffer;
+
+static const char *test_names[] = {
+  "testing",
+  "invalid",
+  "dont-match",
+  "",
+  "\001\001\001\177",
+  NULL
+};
+
+static void
+checki (int i)
+{
+  char *ifname;
+
+  /* Test that a known-invalid index returns NULL.  */
+  /* BUFFER should not be accessed.  */
+
+  printf ("Testing if_indextoname (%d) == NULL\n", i);
+  ifname = if_indextoname (i, NULL);
+  TEST_VERIFY (ifname == NULL);
+  TEST_VERIFY (errno == ENXIO);
+}
+
+static int
+do_test (void)
+{
+  struct if_nameindex *if_ni, *ifp;
+  int min_idx, max_idx, buflen = 0;
+  int i;
+
+  if_ni = if_nameindex ();
+  TEST_VERIFY (if_ni != NULL);
+
+  min_idx = max_idx = if_ni->if_index;
+
+  for (ifp = if_ni; !(ifp->if_index == 0 && ifp->if_name == NULL); ifp++)
+    {
+      printf ("%u: %s\n", ifp->if_index, ifp->if_name);
+      if (ifp->if_index < min_idx)
+	min_idx = ifp->if_index;
+      if (ifp->if_index > max_idx)
+	max_idx = ifp->if_index;
+      if (strlen (ifp->if_name) + 1 > buflen)
+	buflen = strlen (ifp->if_name) + 1;
+    }
+  buffer = (char *) xmalloc (buflen);
+
+  /* Check normal operation.  */
+  for (ifp = if_ni; !(ifp->if_index == 0 && ifp->if_name == NULL); ifp++)
+    {
+      unsigned int idx = if_nametoindex (ifp->if_name);
+      TEST_VERIFY (idx == ifp->if_index);
+
+      char *fn = if_indextoname (ifp->if_index, buffer);
+      TEST_VERIFY (strcmp (fn, ifp->if_name) == 0);
+    }
+
+  for (i=-2; i<min_idx; i++)
+    checki (i);
+  for (i=max_idx+1; i<max_idx+3; i++)
+    checki (i);
+
+  /* Check that a known-invalid name returns 0.  */
+
+  for (i=0; test_names[i] != NULL; i++)
+    {
+      /* Make sure our "invalid" name is really invalid.  */
+      for (ifp = if_ni; !(ifp->if_index == 0 && ifp->if_name == NULL); ifp++)
+	if (strcmp (test_names[i], ifp->if_name) == 0)
+	  goto not_this_one;
+
+      printf ("Testing if_nametoindex (%s) == 0\n", test_names[i]);
+
+      unsigned int idx = if_nametoindex (test_names[i]);
+      TEST_VERIFY (idx == 0);
+      TEST_VERIFY (errno == ENODEV);
+
+    not_this_one:
+    }
+
+
+  if_freenameindex (if_ni);
+
+  return 0;
+}
+
+#include <support/test-driver.c>