/* tst_pr29.c --- Self tests for pr29_*().
* Copyright (C) 2004-2021 Simon Josefsson
*
* This file is part of GNU Libidn.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include
#include
#include
#include
#include
#include "utils.h"
struct tv
{
const char *name;
size_t inlen;
uint32_t in[100];
int rc;
};
static const struct tv tv[] = {
{
"Problem Sequence A",
3,
{0x1100, 0x0300, 0x1161, 0},
PR29_PROBLEM},
{
"Test Case",
3,
{0x0B47, 0x0300, 0x0B3E, 0},
PR29_PROBLEM},
{
"Instability Example",
4,
{0x1100, 0x0300, 0x1161, 0x0323, 0},
PR29_PROBLEM},
{
"Not a problem sequence 1",
3,
{0x1100, 0x1161, 0x0300, 0},
PR29_SUCCESS},
{
"Not a problem sequence 2",
3,
{0x0300, 0x1100, 0x1161, 0},
PR29_SUCCESS},
{
"Not a problem sequence 3",
3,
{0x1161, 0x1100, 0x0300, 0},
PR29_SUCCESS},
{
"Not a problem sequence 4",
3,
{0x1161, 0x0300, 0x1100, 0},
PR29_SUCCESS},
{
"Not a problem sequence 5",
3,
{0x1100, 0x00AA, 0x1161, 0},
PR29_SUCCESS},
{
/* http://lists.gnu.org/archive/html/help-libidn/2012-01/msg00008.html */
"Infloop",
3,
{0x1100, 0x0300, 0x4711, 0},
PR29_SUCCESS}
};
void
doit (void)
{
unsigned i;
int rc;
for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
{
if (debug)
{
uint32_t *p, *q;
printf ("PR29 entry %u: %s\n", i, tv[i].name);
printf ("in:\n");
ucs4print (tv[i].in, tv[i].inlen);
printf ("nfkc:\n");
p = stringprep_ucs4_nfkc_normalize (tv[i].in, tv[i].inlen);
ucs4print (p, -1);
printf ("second nfkc:\n");
q = stringprep_ucs4_nfkc_normalize (p, -1);
ucs4print (q, -1);
free (p);
free (q);
}
rc = pr29_4 (tv[i].in, tv[i].inlen);
if (rc != tv[i].rc)
{
fail ("PR29 entry %u failed (expected %d): %d\n", i, tv[i].rc, rc);
if (debug)
printf ("FATAL\n");
continue;
}
rc = pr29_4z (tv[i].in);
if (rc != tv[i].rc)
{
fail ("PR29 entry %u failed (expected %d): %d\n", i, tv[i].rc, rc);
if (debug)
printf ("FATAL\n");
continue;
}
{
char *p;
size_t items_read, items_written;
p = stringprep_ucs4_to_utf8 (tv[i].in, (ssize_t) tv[i].inlen,
&items_read, &items_written);
if (p == NULL)
fail ("FAIL: stringprep_ucs4_to_utf8(tv[%u]) == NULL\n", i);
if (debug)
hexprint (p, strlen (p));
rc = pr29_8z (p);
free (p);
if (rc != tv[i].rc)
{
fail ("PR29 entry %u failed (expected %d): %d\n",
i, tv[i].rc, rc);
if (debug)
printf ("FATAL\n");
continue;
}
}
if (debug)
{
if (tv[i].rc != PR29_SUCCESS)
printf ("EXPECTED FAIL\n");
else
printf ("OK\n");
}
}
}