mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00:00
resolv: Add tst-res_hnok
This commit is contained in:
parent
a19c0a1db5
commit
5c1a69238f
@ -1,3 +1,9 @@
|
||||
2017-11-11 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* resolv/tst-res_hnok.c: New file.
|
||||
* resolv/Makefile (tests): Add tst-res_hnok.
|
||||
(tst-res_hnok): Link against libresolv.
|
||||
|
||||
2017-11-11 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* resolv/tst-resolv-network.c: Use test framework instead explicit
|
||||
|
@ -47,6 +47,7 @@ tests += \
|
||||
tst-ns_name \
|
||||
tst-ns_name_compress \
|
||||
tst-res_hconf_reorder \
|
||||
tst-res_hnok \
|
||||
tst-res_use_inet6 \
|
||||
tst-resolv-basic \
|
||||
tst-resolv-edns \
|
||||
@ -172,6 +173,7 @@ $(objpfx)tst-resolv-canonname: \
|
||||
$(objpfx)tst-ns_name: $(objpfx)libresolv.so
|
||||
$(objpfx)tst-ns_name.out: tst-ns_name.data
|
||||
$(objpfx)tst-ns_name_compress: $(objpfx)libresolv.so
|
||||
$(objpfx)tst-res_hnok: $(objpfx)libresolv.so
|
||||
|
||||
|
||||
# This test case uses the deprecated RES_USE_INET6 resolver option.
|
||||
|
153
resolv/tst-res_hnok.c
Normal file
153
resolv/tst-res_hnok.c
Normal file
@ -0,0 +1,153 @@
|
||||
/* Tests for res_hnok and related functions.
|
||||
Copyright (C) 2017 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <array_length.h>
|
||||
#include <resolv.h>
|
||||
#include <string.h>
|
||||
#include <support/check.h>
|
||||
#include <support/test-driver.h>
|
||||
|
||||
/* Bits which indicate which functions are supposed to report
|
||||
success. */
|
||||
enum
|
||||
{
|
||||
hnok = 1,
|
||||
dnok = 2,
|
||||
mailok = 4,
|
||||
ownok = 8,
|
||||
allnomailok = hnok | dnok | ownok,
|
||||
allok = hnok | dnok | mailok | ownok
|
||||
};
|
||||
|
||||
/* A string of 60 characters. */
|
||||
#define STRING60 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
|
||||
|
||||
/* A string of 63 characters (maximum label length). */
|
||||
#define STRING63 STRING60 "zzz"
|
||||
|
||||
/* Combines a test name with the expected results. */
|
||||
struct test_case
|
||||
{
|
||||
const char *dn;
|
||||
unsigned int result; /* Combination of the *ok flags. */
|
||||
};
|
||||
|
||||
static const struct test_case tests[] =
|
||||
{
|
||||
{ "", allok },
|
||||
{ ".", allok },
|
||||
{ "www", allnomailok },
|
||||
{ "example", allnomailok },
|
||||
{ "example.com", allok },
|
||||
{ "www.example.com", allok },
|
||||
{ "www.example.com.", allok },
|
||||
{ "*.example.com", dnok | mailok | ownok },
|
||||
{ "-v", dnok },
|
||||
{ "-v.example.com", mailok | dnok },
|
||||
{ "**.example.com", dnok | mailok },
|
||||
{ STRING63, allnomailok },
|
||||
{ STRING63 ".example.com", allok },
|
||||
{ STRING63 "." STRING63 "." STRING63 "." STRING60 "z", allok },
|
||||
{ "hostmaster@mail.example.com", dnok | mailok },
|
||||
{ "with whitespace", 0 },
|
||||
{ "with\twhitespace", 0 },
|
||||
{ "with\nwhitespace", 0 },
|
||||
{ "with.whitespace ", 0 },
|
||||
{ "with.whitespace\t", 0 },
|
||||
{ "with.whitespace\n", 0 },
|
||||
{ "with\\ whitespace", 0 },
|
||||
{ "with\\\twhitespace", 0 },
|
||||
{ "with\\\nwhitespace", 0 },
|
||||
{ "with.whitespace\\ ", 0 },
|
||||
{ "with.whitespace\\\t", 0 },
|
||||
{ "with.whitespace\\\n", 0 },
|
||||
};
|
||||
|
||||
/* Run test case *TEST with FUNC (named FUNCNAME) and report an error
|
||||
if the result does not match the result flag at BIT. */
|
||||
static void
|
||||
one_test (const struct test_case *test, const char *funcname,
|
||||
int (*func) (const char *), unsigned int bit)
|
||||
{
|
||||
int expected = (test->result & bit) != 0;
|
||||
int actual = func (test->dn);
|
||||
if (actual != expected)
|
||||
{
|
||||
support_record_failure ();
|
||||
printf ("error: %s (\"%s\"): expected=%d, actual=%d\n",
|
||||
funcname, test->dn, expected, actual);
|
||||
}
|
||||
}
|
||||
|
||||
/* Run 255 tests using all the bytes from 1 to 255, surround the byte
|
||||
with the strings PREFIX and SUFFIX, and check that FUNC (named
|
||||
FUNCNAME) accepts only those bytes listed in ACCEPTED. */
|
||||
static void
|
||||
one_char (const char *prefix, const char *accepted, const char *suffix,
|
||||
const char *funcname, int (*func) (const char *))
|
||||
{
|
||||
for (int ch = 1; ch <= 255; ++ch)
|
||||
{
|
||||
char dn[1024];
|
||||
snprintf (dn, sizeof (dn), "%s%c%s", prefix, ch, suffix);
|
||||
int expected = strchr (accepted, ch) != NULL;
|
||||
int actual = func (dn);
|
||||
if (actual != expected)
|
||||
{
|
||||
support_record_failure ();
|
||||
printf ("error: %s (\"%s\"): expected=%d, actual=%d\n",
|
||||
funcname, dn, expected, actual);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
for (const struct test_case *test = tests; test < array_end (tests); ++test)
|
||||
{
|
||||
if (test_verbose)
|
||||
printf ("info: testing domain name [[[%s]]] (0x%x)\n",
|
||||
test->dn, test->result);
|
||||
one_test (test, "res_hnok", res_hnok, hnok);
|
||||
one_test (test, "res_dnok", res_dnok, dnok);
|
||||
one_test (test, "res_mailok", res_mailok, mailok);
|
||||
one_test (test, "res_ownok", res_ownok, ownok);
|
||||
}
|
||||
|
||||
one_char
|
||||
("", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.",
|
||||
"", "res_hnok", res_hnok);
|
||||
one_char
|
||||
("middle",
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_",
|
||||
"suffix", "res_hnok", res_hnok);
|
||||
one_char
|
||||
("middle",
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_"
|
||||
"!\"#$%&'()*+,/:;<=>?@[\\]^`{|}~",
|
||||
"suffix.example", "res_mailok", res_mailok);
|
||||
one_char
|
||||
("mailbox.middle",
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_",
|
||||
"suffix.example", "res_mailok", res_mailok);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
Loading…
Reference in New Issue
Block a user