tests: Add tests for gethostbyname2_r, IPv4 and IPv6
authorSamuel Cabrero <scabrero@suse.de>
Wed, 18 Mar 2020 12:19:28 +0000 (13:19 +0100)
committerAndreas Schneider <asn@samba.org>
Thu, 19 Mar 2020 09:03:10 +0000 (10:03 +0100)
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Alexander Bokovoy <ab@samba.org>
tests/test_gethostby_name_addr.c

index c9f459444288a40fefc7cfad347eb53661b47fdd..e8939f60c578aca437a89b0f343934be58767c54 100644 (file)
@@ -274,6 +274,103 @@ static void test_nwrap_gethostbyname_r_null(void **state)
 }
 #endif
 
+#ifdef HAVE_GETHOSTBYNAME2_R
+static void test_nwrap_gethostbyname2_r_v4(void **state)
+{
+       char *buf = NULL;
+       size_t buflen = 2;
+       char ip[INET_ADDRSTRLEN];
+       struct hostent hb, *he;
+       const char *a;
+       int herr = 0;
+       int rc;
+
+       (void) state; /* unused */
+
+       for (rc = ERANGE, buflen = 2; rc == ERANGE; buflen *= 2) {
+               if (buf != NULL) {
+                       free(buf);
+               }
+               buf = calloc(1, buflen);
+               assert_non_null(buf);
+
+               rc = gethostbyname2_r("magrathea.galaxy.site", AF_INET,
+                                     &hb,
+                                     buf, buflen,
+                                     &he,
+                                     &herr);
+       }
+
+       assert_int_equal(rc, 0);
+       assert_int_equal(herr, 0);
+       assert_non_null(he);
+       assert_non_null(he->h_name);
+       assert_non_null(he->h_addr_list);
+
+       assert_string_equal(he->h_name, "magrathea.galaxy.site");
+       assert_int_equal(he->h_addrtype, AF_INET);
+
+       assert_non_null(he->h_addr_list[0]);
+       a = inet_ntop(AF_INET, he->h_addr_list[0], ip, sizeof(ip));
+       assert_non_null(a);
+       assert_string_equal(a, "127.0.0.11");
+
+       assert_non_null(he->h_addr_list[1]);
+       a = inet_ntop(AF_INET, he->h_addr_list[1], ip, sizeof(ip));
+       assert_non_null(a);
+       assert_string_equal(a, "127.0.0.12");
+
+       assert_null(he->h_addr_list[2]);
+
+       free(buf);
+}
+
+static void test_nwrap_gethostbyname2_r_v6(void **state)
+{
+       char *buf = NULL;
+       size_t buflen = 2;
+       char ip[INET6_ADDRSTRLEN];
+       struct hostent hb, *he;
+       const char *a;
+       int herr = 0;
+       int rc;
+
+       (void) state; /* unused */
+
+       for (rc = ERANGE, buflen = 2; rc == ERANGE; buflen *= 2) {
+               if (buf != NULL) {
+                       free(buf);
+               }
+               buf = calloc(1, buflen);
+               assert_non_null(buf);
+
+               rc = gethostbyname2_r("magrathea.galaxy.site", AF_INET6,
+                                     &hb,
+                                     buf, buflen,
+                                     &he,
+                                     &herr);
+       }
+
+       assert_int_equal(rc, 0);
+       assert_int_equal(herr, 0);
+       assert_non_null(he);
+       assert_non_null(he->h_name);
+       assert_non_null(he->h_addr_list);
+
+       assert_string_equal(he->h_name, "magrathea.galaxy.site");
+       assert_int_equal(he->h_addrtype, AF_INET6);
+
+       assert_non_null(he->h_addr_list[0]);
+       a = inet_ntop(AF_INET6, he->h_addr_list[0], ip, sizeof(ip));
+       assert_non_null(a);
+       assert_string_equal(a, "::29a");
+
+       assert_null(he->h_addr_list[1]);
+
+       free(buf);
+}
+#endif
+
 #ifdef HAVE_GETHOSTBYADDR_R
 static void test_nwrap_gethostbyaddr_r(void **state)
 {
@@ -320,6 +417,10 @@ int main(void) {
                cmocka_unit_test(test_nwrap_gethostbyname_r),
                cmocka_unit_test(test_nwrap_gethostbyname_r_null),
 #endif
+#ifdef HAVE_GETHOSTBYNAME2_R
+               cmocka_unit_test(test_nwrap_gethostbyname2_r_v4),
+               cmocka_unit_test(test_nwrap_gethostbyname2_r_v6),
+#endif
 #ifdef HAVE_GETHOSTBYADDR_R
                cmocka_unit_test(test_nwrap_gethostbyaddr_r),
 #endif