Line data Source code
1 : /* tst_pr29.c --- Self tests for pr29_*(). 2 : * Copyright (C) 2004-2020 Simon Josefsson 3 : * 4 : * This file is part of GNU Libidn. 5 : * 6 : * This program is free software: you can redistribute it and/or modify 7 : * it under the terms of the GNU General Public License as published by 8 : * the Free Software Foundation, either version 3 of the License, or 9 : * (at your option) any later version. 10 : * 11 : * This program is distributed in the hope that it will be useful, 12 : * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : * GNU General Public License for more details. 15 : * 16 : * You should have received a copy of the GNU General Public License 17 : * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 : * 19 : */ 20 : 21 : #ifdef HAVE_CONFIG_H 22 : # include "config.h" 23 : #endif 24 : 25 : #include <stdio.h> 26 : #include <stdlib.h> 27 : #include <stdarg.h> 28 : #include <string.h> 29 : 30 : #include <pr29.h> 31 : 32 : #include "utils.h" 33 : 34 : struct tv 35 : { 36 : const char *name; 37 : size_t inlen; 38 : uint32_t in[100]; 39 : int rc; 40 : }; 41 : 42 : static const struct tv tv[] = { 43 : { 44 : "Problem Sequence A", 45 : 3, 46 : {0x1100, 0x0300, 0x1161, 0}, 47 : PR29_PROBLEM}, 48 : { 49 : "Test Case", 50 : 3, 51 : {0x0B47, 0x0300, 0x0B3E, 0}, 52 : PR29_PROBLEM}, 53 : { 54 : "Instability Example", 55 : 4, 56 : {0x1100, 0x0300, 0x1161, 0x0323, 0}, 57 : PR29_PROBLEM}, 58 : { 59 : "Not a problem sequence 1", 60 : 3, 61 : {0x1100, 0x1161, 0x0300, 0}, 62 : PR29_SUCCESS}, 63 : { 64 : "Not a problem sequence 2", 65 : 3, 66 : {0x0300, 0x1100, 0x1161, 0}, 67 : PR29_SUCCESS}, 68 : { 69 : "Not a problem sequence 3", 70 : 3, 71 : {0x1161, 0x1100, 0x0300, 0}, 72 : PR29_SUCCESS}, 73 : { 74 : "Not a problem sequence 4", 75 : 3, 76 : {0x1161, 0x0300, 0x1100, 0}, 77 : PR29_SUCCESS}, 78 : { 79 : "Not a problem sequence 5", 80 : 3, 81 : {0x1100, 0x00AA, 0x1161, 0}, 82 : PR29_SUCCESS}, 83 : { 84 : /* http://lists.gnu.org/archive/html/help-libidn/2012-01/msg00008.html */ 85 : "Infloop", 86 : 3, 87 : {0x1100, 0x0300, 0x4711, 0}, 88 : PR29_SUCCESS} 89 : }; 90 : 91 : void 92 1 : doit (void) 93 : { 94 : unsigned i; 95 : int rc; 96 : 97 10 : for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++) 98 : { 99 9 : if (debug) 100 : { 101 : uint32_t *p, *q; 102 : 103 0 : printf ("PR29 entry %u: %s\n", i, tv[i].name); 104 : 105 0 : printf ("in:\n"); 106 0 : ucs4print (tv[i].in, tv[i].inlen); 107 : 108 0 : printf ("nfkc:\n"); 109 0 : p = stringprep_ucs4_nfkc_normalize (tv[i].in, tv[i].inlen); 110 0 : ucs4print (p, -1); 111 : 112 0 : printf ("second nfkc:\n"); 113 0 : q = stringprep_ucs4_nfkc_normalize (p, -1); 114 0 : ucs4print (q, -1); 115 : 116 0 : free (p); 117 0 : free (q); 118 : } 119 : 120 9 : rc = pr29_4 (tv[i].in, tv[i].inlen); 121 9 : if (rc != tv[i].rc) 122 : { 123 0 : fail ("PR29 entry %u failed (expected %d): %d\n", i, tv[i].rc, rc); 124 0 : if (debug) 125 0 : printf ("FATAL\n"); 126 0 : continue; 127 : } 128 : 129 9 : rc = pr29_4z (tv[i].in); 130 9 : if (rc != tv[i].rc) 131 : { 132 0 : fail ("PR29 entry %u failed (expected %d): %d\n", i, tv[i].rc, rc); 133 0 : if (debug) 134 0 : printf ("FATAL\n"); 135 0 : continue; 136 : } 137 : 138 : { 139 : char *p; 140 : size_t items_read, items_written; 141 : 142 9 : p = stringprep_ucs4_to_utf8 (tv[i].in, (ssize_t) tv[i].inlen, 143 : &items_read, &items_written); 144 9 : if (p == NULL) 145 0 : fail ("FAIL: stringprep_ucs4_to_utf8(tv[%u]) == NULL\n", i); 146 9 : if (debug) 147 0 : hexprint (p, strlen (p)); 148 : 149 9 : rc = pr29_8z (p); 150 9 : free (p); 151 9 : if (rc != tv[i].rc) 152 : { 153 0 : fail ("PR29 entry %u failed (expected %d): %d\n", 154 : i, tv[i].rc, rc); 155 0 : if (debug) 156 0 : printf ("FATAL\n"); 157 0 : continue; 158 : } 159 : } 160 : 161 9 : if (debug) 162 : { 163 0 : if (tv[i].rc != PR29_SUCCESS) 164 0 : printf ("EXPECTED FAIL\n"); 165 : else 166 0 : printf ("OK\n"); 167 : } 168 : } 169 1 : }