Blame resolv/tst-ns_name_pton.c

Packit Service 82fcde
/* Tests for ns_name_pton.
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 <arpa/nameser.h>
Packit Service 82fcde
#include <array_length.h>
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <support/check.h>
Packit Service 82fcde
#include <support/support.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
/* A string of 60 bytes (non-ASCII).  */
Packit Service 82fcde
#define STRING60OCT \
Packit Service 82fcde
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
Packit Service 82fcde
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
Packit Service 82fcde
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
Packit Service 82fcde
  "\377\377\377\377\377\377\377\377\377"
Packit Service 82fcde
Packit Service 82fcde
/* A string of 63 bytes (non-ASCII).  */
Packit Service 82fcde
#define STRING63OCT STRING60OCT "\377\377\377"
Packit Service 82fcde
Packit Service 82fcde
/* A string of 60 bytes (non-ASCII, quoted decimal).  */
Packit Service 82fcde
#define STRING60DEC \
Packit Service 82fcde
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit Service 82fcde
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit Service 82fcde
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit Service 82fcde
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit Service 82fcde
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit Service 82fcde
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255"
Packit Service 82fcde
Packit Service 82fcde
/* A string of 63 bytes (non-ASCII, quoted decimal).  */
Packit Service 82fcde
#define STRING63DEC STRING60DEC "\\255\\255\\255"
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
  const char *back; /* Expected test result converted using ns_name_ntop.  */
Packit Service 82fcde
  bool fully_qualified; /* True if the domain name has a trailing dot.  */
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static const struct test_case tests[] =
Packit Service 82fcde
  {
Packit Service 82fcde
    { "", ".", false },
Packit Service 82fcde
    { ".", ".", true },
Packit Service 82fcde
    { "..", NULL, },
Packit Service 82fcde
    { "www", "www", false },
Packit Service 82fcde
    { "www.", "www", true },
Packit Service 82fcde
    { "www\\.", "www\\.", false },
Packit Service 82fcde
    { ".www", NULL, },
Packit Service 82fcde
    { ".www\\.", NULL, },
Packit Service 82fcde
    { "example.com", "example.com", false },
Packit Service 82fcde
    { "example.com.", "example.com", true },
Packit Service 82fcde
    { ".example.com", NULL, },
Packit Service 82fcde
    { ".example.com.", NULL, },
Packit Service 82fcde
    { "example\\.com", "example\\.com", false },
Packit Service 82fcde
    { "example\\.com.", "example\\.com", true },
Packit Service 82fcde
    { "example..", NULL, },
Packit Service 82fcde
    { "example..com", NULL, },
Packit Service 82fcde
    { "example..com", NULL, },
Packit Service 82fcde
    { "\\0", NULL, },
Packit Service 82fcde
    { "\\00", NULL, },
Packit Service 82fcde
    { "\\000", "\\000", false },
Packit Service 82fcde
    { "\\1", NULL, },
Packit Service 82fcde
    { "\\01", NULL, },
Packit Service 82fcde
    { "\\001", "\\001", false },
Packit Service 82fcde
    { "\\1x", NULL, },
Packit Service 82fcde
    { "\\01x", NULL, },
Packit Service 82fcde
    { "\\001x", "\\001x", false },
Packit Service 82fcde
    { "\\256", NULL, },
Packit Service 82fcde
    { "\\0641", "\\@1", false },
Packit Service 82fcde
    { "\\0011", "\\0011", false },
Packit Service 82fcde
    { STRING63, STRING63, false },
Packit Service 82fcde
    { STRING63 ".", STRING63, true },
Packit Service 82fcde
    { STRING63 "z", NULL, },
Packit Service 82fcde
    { STRING63 "\\.", NULL, },
Packit Service 82fcde
    { STRING60 "zz\\.", STRING60 "zz\\.", false },
Packit Service 82fcde
    { STRING60 "zz\\..", STRING60 "zz\\.", true },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "z",
Packit Service 82fcde
      STRING63 "." STRING63 "." STRING63 "." STRING60 "z", false },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "z.",
Packit Service 82fcde
      STRING63 "." STRING63 "." STRING63 "." STRING60 "z", true },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "zz", NULL, },
Packit Service 82fcde
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "zzz", NULL, },
Packit Service 82fcde
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT "\377",
Packit Service 82fcde
      STRING63DEC "." STRING63DEC "." STRING63DEC "." STRING60DEC "\\255",
Packit Service 82fcde
      false },
Packit Service 82fcde
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT "\377.",
Packit Service 82fcde
      STRING63DEC "." STRING63DEC "." STRING63DEC "." STRING60DEC "\\255",
Packit Service 82fcde
      true },
Packit Service 82fcde
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT
Packit Service 82fcde
      "\377\377", NULL, },
Packit Service 82fcde
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT
Packit Service 82fcde
      "\377\377\377", NULL, },
Packit Service 82fcde
    { "\\", NULL, },
Packit Service 82fcde
    { "\\\\", "\\\\", false },
Packit Service 82fcde
    { "\\\\.", "\\\\", true },
Packit Service 82fcde
    { "\\\\\\", NULL, },
Packit Service 82fcde
    { "a\\", NULL, },
Packit Service 82fcde
    { "a.\\", NULL, },
Packit Service 82fcde
    { "a.b\\", NULL, },
Packit Service 82fcde
  };
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  unsigned char *wire = xmalloc (NS_MAXCDNAME);
Packit Service 82fcde
  char *text = xmalloc (NS_MAXDNAME);
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]]]\n", test->dn);
Packit Service 82fcde
      int ret = ns_name_pton (test->dn, wire, NS_MAXCDNAME);
Packit Service 82fcde
      if (ret == -1)
Packit Service 82fcde
        {
Packit Service 82fcde
          if (test->back != NULL)
Packit Service 82fcde
            {
Packit Service 82fcde
              support_record_failure ();
Packit Service 82fcde
              printf ("error: unexpected decoding failure for [[%s]]\n",
Packit Service 82fcde
                      test->dn);
Packit Service 82fcde
            }
Packit Service 82fcde
          /* Otherwise, we have an expected decoding failure.  */
Packit Service 82fcde
          continue;
Packit Service 82fcde
        }
Packit Service 82fcde
Packit Service 82fcde
      if (ret < -1 || ret > 1)
Packit Service 82fcde
        {
Packit Service 82fcde
          support_record_failure ();
Packit Service 82fcde
          printf ("error: invalid return value %d for [[%s]]\n",
Packit Service 82fcde
                  ret, test->dn);
Packit Service 82fcde
          continue;
Packit Service 82fcde
        }
Packit Service 82fcde
Packit Service 82fcde
      int ret2 = ns_name_ntop (wire, text, NS_MAXDNAME);
Packit Service 82fcde
Packit Service 82fcde
      if (ret2 < 0)
Packit Service 82fcde
        {
Packit Service 82fcde
          support_record_failure ();
Packit Service 82fcde
          printf ("error: failure to convert back [[%s]]\n", test->dn);
Packit Service 82fcde
        }
Packit Service 82fcde
Packit Service 82fcde
      if (test->back == NULL)
Packit Service 82fcde
        {
Packit Service 82fcde
          support_record_failure ();
Packit Service 82fcde
          printf ("error: unexpected success converting [[%s]]\n", test->dn);
Packit Service 82fcde
          if (ret2 >= 1)
Packit Service 82fcde
            printf ("error:   result converts back to [[%s]]\n", test->dn);
Packit Service 82fcde
          continue;
Packit Service 82fcde
        }
Packit Service 82fcde
Packit Service 82fcde
      if (strcmp (text, test->back) != 0)
Packit Service 82fcde
        {
Packit Service 82fcde
          support_record_failure ();
Packit Service 82fcde
          printf ("error: back-conversion of [[%s]] did not match\n",
Packit Service 82fcde
                  test->dn);
Packit Service 82fcde
          printf ("error:   expected: [[%s]]\n", test->back);
Packit Service 82fcde
          printf ("error:     actual: [[%s]]\n", text);
Packit Service 82fcde
        }
Packit Service 82fcde
Packit Service 82fcde
      if (ret != test->fully_qualified)
Packit Service 82fcde
        {
Packit Service 82fcde
          support_record_failure ();
Packit Service 82fcde
          printf ("error: invalid fully-qualified status for [[%s]]\n",
Packit Service 82fcde
                  test->dn);
Packit Service 82fcde
          printf ("error:   expected: %d\n", (int) test->fully_qualified);
Packit Service 82fcde
          printf ("error:     actual: %d\n", ret);
Packit Service 82fcde
        }
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  free (text);
Packit Service 82fcde
  free (wire);
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#include <support/test-driver.c>