Blame resolv/tst-res_hnok.c

Packit Service 82fcde
/* Tests for res_hnok and related functions.
Packit Service 82fcde
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <array_length.h>
Packit Service 82fcde
#include <resolv.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <support/check.h>
Packit Service 82fcde
#include <support/test-driver.h>
Packit Service 82fcde
Packit Service 82fcde
/* Bits which indicate which functions are supposed to report
Packit Service 82fcde
   success.  */
Packit Service 82fcde
enum
Packit Service 82fcde
  {
Packit Service 82fcde
    hnok = 1,
Packit Service 82fcde
    dnok = 2,
Packit Service 82fcde
    mailok = 4,
Packit Service 82fcde
    ownok = 8,
Packit Service 82fcde
    allnomailok = hnok | dnok | ownok,
Packit Service 82fcde
    allok = hnok | dnok | mailok | ownok
Packit Service 82fcde
  };
Packit Service 82fcde
Packit Service 82fcde
/* A string of 60 characters.  */
Packit Service 82fcde
#define STRING60 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
Packit Service 82fcde
Packit Service 82fcde
/* A string of 63 characters (maximum label length).  */
Packit Service 82fcde
#define STRING63 STRING60 "zzz"
Packit Service 82fcde
Packit Service 82fcde
/* Combines a test name with the expected results.  */
Packit Service 82fcde
struct test_case
Packit Service 82fcde
{
Packit Service 82fcde
  const char *dn;
Packit Service 82fcde
  unsigned int result;          /* Combination of the *ok flags.  */
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static const struct test_case tests[] =
Packit Service 82fcde
  {
Packit Service 82fcde
    { "", allok },
Packit Service 82fcde
    { ".", allok },
Packit Service 82fcde
    { "..", 0 },
Packit Service 82fcde
    { "www", allnomailok },
Packit Service 82fcde
    { "www.", allnomailok },
Packit Service 82fcde
    { "example", allnomailok },
Packit Service 82fcde
    { "example.com", allok },
Packit Service 82fcde
    { "www.example.com", allok },
Packit Service 82fcde
    { "www.example.com.", allok },
Packit Service 82fcde
    { "www-.example.com.", allok },
Packit Service 82fcde
    { "www.-example.com.", allok },
Packit Service 82fcde
    { "*.example.com", dnok | mailok | ownok },
Packit Service 82fcde
    { "-v", dnok },
Packit Service 82fcde
    { "-v.example.com", mailok | dnok },
Packit Service 82fcde
    { "**.example.com", dnok | mailok },
Packit Service 82fcde
    { "www.example.com\\", 0 },
Packit Service 82fcde
    { STRING63, allnomailok },
Packit Service 82fcde
    { STRING63 ".", allnomailok },
Packit Service 82fcde
    { STRING63 "\\.", 0 },
Packit Service 82fcde
    { STRING63 "z", 0 },
Packit Service 82fcde
    { STRING63 ".example.com", allok },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "z", allok },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "z.", allok },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "zz", 0 },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "zzz", 0 },
Packit Service 82fcde
    { "hostmaster@mail.example.com", dnok | mailok },
Packit Service 82fcde
    { "hostmaster\\@mail.example.com", dnok | mailok },
Packit Service 82fcde
    { "with whitespace", 0 },
Packit Service 82fcde
    { "with\twhitespace", 0 },
Packit Service 82fcde
    { "with\nwhitespace", 0 },
Packit Service 82fcde
    { "with.whitespace ", 0 },
Packit Service 82fcde
    { "with.whitespace\t", 0 },
Packit Service 82fcde
    { "with.whitespace\n", 0 },
Packit Service 82fcde
    { "with\\ whitespace", 0 },
Packit Service 82fcde
    { "with\\\twhitespace", 0 },
Packit Service 82fcde
    { "with\\\nwhitespace", 0 },
Packit Service 82fcde
    { "with.whitespace\\ ", 0 },
Packit Service 82fcde
    { "with.whitespace\\\t", 0 },
Packit Service 82fcde
    { "with.whitespace\\\n", 0 },
Packit Service 82fcde
  };
Packit Service 82fcde
Packit Service 82fcde
/* Run test case *TEST with FUNC (named FUNCNAME) and report an error
Packit Service 82fcde
   if the result does not match the result flag at BIT.  */
Packit Service 82fcde
static void
Packit Service 82fcde
one_test (const struct test_case *test, const char *funcname,
Packit Service 82fcde
          int (*func) (const char *), unsigned int bit)
Packit Service 82fcde
{
Packit Service 82fcde
  int expected = (test->result & bit) != 0;
Packit Service 82fcde
  int actual = func (test->dn);
Packit Service 82fcde
  if (actual != expected)
Packit Service 82fcde
    {
Packit Service 82fcde
      support_record_failure ();
Packit Service 82fcde
      printf ("error: %s (\"%s\"): expected=%d, actual=%d\n",
Packit Service 82fcde
              funcname, test->dn, expected, actual);
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Run 255 tests using all the bytes from 1 to 255, surround the byte
Packit Service 82fcde
   with the strings PREFIX and SUFFIX, and check that FUNC (named
Packit Service 82fcde
   FUNCNAME) accepts only those bytes listed in ACCEPTED.  */
Packit Service 82fcde
static void
Packit Service 82fcde
one_char (const char *prefix, const char *accepted, const char *suffix,
Packit Service 82fcde
          const char *funcname, int (*func) (const char *))
Packit Service 82fcde
{
Packit Service 82fcde
  for (int ch = 1; ch <= 255; ++ch)
Packit Service 82fcde
    {
Packit Service 82fcde
      char dn[1024];
Packit Service 82fcde
      snprintf (dn, sizeof (dn), "%s%c%s", prefix, ch, suffix);
Packit Service 82fcde
      int expected = strchr (accepted, ch) != NULL;
Packit Service 82fcde
      int actual = func (dn);
Packit Service 82fcde
      if (actual != expected)
Packit Service 82fcde
        {
Packit Service 82fcde
          support_record_failure ();
Packit Service 82fcde
          printf ("error: %s (\"%s\"): expected=%d, actual=%d\n",
Packit Service 82fcde
                  funcname, dn, expected, actual);
Packit Service 82fcde
        }
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define LETTERSDIGITS \
Packit Service 82fcde
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
Packit Service 82fcde
Packit Service 82fcde
#define PRINTABLE \
Packit Service 82fcde
  "!\"#$%&'()*+,/:;<=>?@[\\]^`{|}~"
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  for (const struct test_case *test = tests; test < array_end (tests); ++test)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (test_verbose)
Packit Service 82fcde
        printf ("info: testing domain name [[[%s]]] (0x%x)\n",
Packit Service 82fcde
                test->dn, test->result);
Packit Service 82fcde
      one_test (test, "res_hnok", res_hnok, hnok);
Packit Service 82fcde
      one_test (test, "res_dnok", res_dnok, dnok);
Packit Service 82fcde
      one_test (test, "res_mailok", res_mailok, mailok);
Packit Service 82fcde
      one_test (test, "res_ownok", res_ownok, ownok);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  one_char
Packit Service 82fcde
    ("", LETTERSDIGITS "._", "", "res_hnok", res_hnok);
Packit Service 82fcde
  one_char
Packit Service 82fcde
    ("middle",
Packit Service 82fcde
     LETTERSDIGITS ".-_\\", /* "middle\\suffix" == "middlesuffix", so good.  */
Packit Service 82fcde
     "suffix", "res_hnok", res_hnok);
Packit Service 82fcde
  one_char
Packit Service 82fcde
    ("middle",
Packit Service 82fcde
     LETTERSDIGITS ".-_" PRINTABLE,
Packit Service 82fcde
     "suffix.example", "res_mailok", res_mailok);
Packit Service 82fcde
  one_char
Packit Service 82fcde
    ("mailbox.middle",
Packit Service 82fcde
     LETTERSDIGITS ".-_\\",
Packit Service 82fcde
     "suffix.example", "res_mailok", res_mailok);
Packit Service 82fcde
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#include <support/test-driver.c>