xref: /freebsd/crypto/heimdal/lib/wind/test-rw.c (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
1*ae771770SStanislav Sedov /*
2*ae771770SStanislav Sedov  * Copyright (c) 2008 Kungliga Tekniska Högskolan
3*ae771770SStanislav Sedov  * (Royal Institute of Technology, Stockholm, Sweden).
4*ae771770SStanislav Sedov  * All rights reserved.
5*ae771770SStanislav Sedov  *
6*ae771770SStanislav Sedov  * Redistribution and use in source and binary forms, with or without
7*ae771770SStanislav Sedov  * modification, are permitted provided that the following conditions
8*ae771770SStanislav Sedov  * are met:
9*ae771770SStanislav Sedov  *
10*ae771770SStanislav Sedov  * 1. Redistributions of source code must retain the above copyright
11*ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer.
12*ae771770SStanislav Sedov  *
13*ae771770SStanislav Sedov  * 2. Redistributions in binary form must reproduce the above copyright
14*ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer in the
15*ae771770SStanislav Sedov  *    documentation and/or other materials provided with the distribution.
16*ae771770SStanislav Sedov  *
17*ae771770SStanislav Sedov  * 3. Neither the name of the Institute nor the names of its contributors
18*ae771770SStanislav Sedov  *    may be used to endorse or promote products derived from this software
19*ae771770SStanislav Sedov  *    without specific prior written permission.
20*ae771770SStanislav Sedov  *
21*ae771770SStanislav Sedov  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22*ae771770SStanislav Sedov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23*ae771770SStanislav Sedov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24*ae771770SStanislav Sedov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25*ae771770SStanislav Sedov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26*ae771770SStanislav Sedov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27*ae771770SStanislav Sedov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*ae771770SStanislav Sedov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29*ae771770SStanislav Sedov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30*ae771770SStanislav Sedov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*ae771770SStanislav Sedov  * SUCH DAMAGE.
32*ae771770SStanislav Sedov  */
33*ae771770SStanislav Sedov 
34*ae771770SStanislav Sedov #include "windlocl.h"
35*ae771770SStanislav Sedov #include <stdio.h>
36*ae771770SStanislav Sedov #include <err.h>
37*ae771770SStanislav Sedov #include <assert.h>
38*ae771770SStanislav Sedov 
39*ae771770SStanislav Sedov #define MAX_LENGTH 10
40*ae771770SStanislav Sedov 
41*ae771770SStanislav Sedov 
42*ae771770SStanislav Sedov struct testcase {
43*ae771770SStanislav Sedov     unsigned int in_flags;
44*ae771770SStanislav Sedov     size_t in_len;
45*ae771770SStanislav Sedov     const char *in_ptr;
46*ae771770SStanislav Sedov     int ret;
47*ae771770SStanislav Sedov     size_t ucs2_len;
48*ae771770SStanislav Sedov     uint16_t ucs2[MAX_LENGTH];
49*ae771770SStanislav Sedov     unsigned int out_flags;
50*ae771770SStanislav Sedov } testcases[] = {
51*ae771770SStanislav Sedov     {
52*ae771770SStanislav Sedov 	WIND_RW_BOM,
53*ae771770SStanislav Sedov 	4, "\xff\xfe\x20\x00",
54*ae771770SStanislav Sedov 	0,
55*ae771770SStanislav Sedov 	1, { 0x0020 },
56*ae771770SStanislav Sedov 	WIND_RW_LE
57*ae771770SStanislav Sedov     },
58*ae771770SStanislav Sedov     {
59*ae771770SStanislav Sedov 	WIND_RW_BOM,
60*ae771770SStanislav Sedov 	4, "\xfe\xff\x00\x20",
61*ae771770SStanislav Sedov 	0,
62*ae771770SStanislav Sedov 	1, { 0x0020 },
63*ae771770SStanislav Sedov 	WIND_RW_BE
64*ae771770SStanislav Sedov     },
65*ae771770SStanislav Sedov     /* only BE BOM */
66*ae771770SStanislav Sedov     {
67*ae771770SStanislav Sedov 	WIND_RW_BOM,
68*ae771770SStanislav Sedov 	2, "\xfe\xff",
69*ae771770SStanislav Sedov 	0,
70*ae771770SStanislav Sedov 	0, { 0 },
71*ae771770SStanislav Sedov 	WIND_RW_BE
72*ae771770SStanislav Sedov     },
73*ae771770SStanislav Sedov     /* no input */
74*ae771770SStanislav Sedov     {
75*ae771770SStanislav Sedov 	WIND_RW_BOM,
76*ae771770SStanislav Sedov 	0, "",
77*ae771770SStanislav Sedov 	0,
78*ae771770SStanislav Sedov 	0, { 0 },
79*ae771770SStanislav Sedov 	WIND_RW_BOM
80*ae771770SStanislav Sedov     },
81*ae771770SStanislav Sedov     /* BOM only */
82*ae771770SStanislav Sedov     {
83*ae771770SStanislav Sedov 	WIND_RW_BOM,
84*ae771770SStanislav Sedov 	2, "\xff\xfe",
85*ae771770SStanislav Sedov 	0,
86*ae771770SStanislav Sedov 	0, { 0 },
87*ae771770SStanislav Sedov 	WIND_RW_LE
88*ae771770SStanislav Sedov     },
89*ae771770SStanislav Sedov     /* water + z */
90*ae771770SStanislav Sedov     {
91*ae771770SStanislav Sedov 	WIND_RW_BOM|WIND_RW_LE,
92*ae771770SStanislav Sedov 	4, "\x34\x6C\x7A\x00",
93*ae771770SStanislav Sedov 	0,
94*ae771770SStanislav Sedov 	2, { 0x6C34, 0x7a },
95*ae771770SStanislav Sedov 	WIND_RW_LE
96*ae771770SStanislav Sedov     },
97*ae771770SStanislav Sedov     /* water + z */
98*ae771770SStanislav Sedov     {
99*ae771770SStanislav Sedov 	WIND_RW_LE,
100*ae771770SStanislav Sedov 	4, "\x34\x6C\x7A\x00",
101*ae771770SStanislav Sedov 	0,
102*ae771770SStanislav Sedov 	2, { 0x6C34, 0x7a },
103*ae771770SStanislav Sedov 	WIND_RW_LE
104*ae771770SStanislav Sedov     },
105*ae771770SStanislav Sedov     /* BOM + water + z */
106*ae771770SStanislav Sedov     {
107*ae771770SStanislav Sedov 	WIND_RW_BOM,
108*ae771770SStanislav Sedov 	6, "\xFF\xFE\x34\x6C\x7A\x00",
109*ae771770SStanislav Sedov 	0,
110*ae771770SStanislav Sedov 	2, { 0x6C34, 0x7a },
111*ae771770SStanislav Sedov 	WIND_RW_LE
112*ae771770SStanislav Sedov     },
113*ae771770SStanislav Sedov     /* BOM + water + z */
114*ae771770SStanislav Sedov     {
115*ae771770SStanislav Sedov 	WIND_RW_BOM,
116*ae771770SStanislav Sedov 	6, "\xFE\xFF\x6C\x34\x00\x7A",
117*ae771770SStanislav Sedov 	0,
118*ae771770SStanislav Sedov 	2, { 0x6C34, 0x7a },
119*ae771770SStanislav Sedov 	WIND_RW_BE
120*ae771770SStanislav Sedov     },
121*ae771770SStanislav Sedov     /* error, odd length */
122*ae771770SStanislav Sedov     {
123*ae771770SStanislav Sedov 	WIND_RW_BOM,
124*ae771770SStanislav Sedov 	1, "\xfe",
125*ae771770SStanislav Sedov 	WIND_ERR_LENGTH_NOT_MOD2,
126*ae771770SStanislav Sedov 	0, { 0 },
127*ae771770SStanislav Sedov 	WIND_RW_BOM
128*ae771770SStanislav Sedov     },
129*ae771770SStanislav Sedov     /* error, missing BOM */
130*ae771770SStanislav Sedov     {
131*ae771770SStanislav Sedov 	WIND_RW_BOM,
132*ae771770SStanislav Sedov 	2, "\x00\x20",
133*ae771770SStanislav Sedov 	WIND_ERR_NO_BOM,
134*ae771770SStanislav Sedov 	0, { 0 },
135*ae771770SStanislav Sedov 	WIND_RW_BOM
136*ae771770SStanislav Sedov     },
137*ae771770SStanislav Sedov     /* error, overrun */
138*ae771770SStanislav Sedov     {
139*ae771770SStanislav Sedov 	WIND_RW_BE,
140*ae771770SStanislav Sedov 	4, "\x00\x20\x00\x20",
141*ae771770SStanislav Sedov 	WIND_ERR_OVERRUN,
142*ae771770SStanislav Sedov 	1, { 0x20 },
143*ae771770SStanislav Sedov 	WIND_RW_BOM
144*ae771770SStanislav Sedov     }
145*ae771770SStanislav Sedov 
146*ae771770SStanislav Sedov };
147*ae771770SStanislav Sedov 
148*ae771770SStanislav Sedov int
main(void)149*ae771770SStanislav Sedov main(void)
150*ae771770SStanislav Sedov {
151*ae771770SStanislav Sedov     unsigned int n, m, flags;
152*ae771770SStanislav Sedov     uint16_t data[MAX_LENGTH];
153*ae771770SStanislav Sedov     size_t datalen;
154*ae771770SStanislav Sedov     int ret;
155*ae771770SStanislav Sedov 
156*ae771770SStanislav Sedov     for (n = 0; n < sizeof(testcases)/sizeof(testcases[0]); n++) {
157*ae771770SStanislav Sedov 	flags = testcases[n].in_flags;
158*ae771770SStanislav Sedov 
159*ae771770SStanislav Sedov 	datalen = testcases[n].ucs2_len;
160*ae771770SStanislav Sedov 	assert(datalen < sizeof(data));
161*ae771770SStanislav Sedov 
162*ae771770SStanislav Sedov 	ret = wind_ucs2read(testcases[n].in_ptr,
163*ae771770SStanislav Sedov 			    testcases[n].in_len,
164*ae771770SStanislav Sedov 			    &flags,
165*ae771770SStanislav Sedov 			    data,
166*ae771770SStanislav Sedov 			    &datalen);
167*ae771770SStanislav Sedov 	if (ret != testcases[n].ret)
168*ae771770SStanislav Sedov 	    errx(1, "testcases %u: wind_ucs2read: %d", n, ret);
169*ae771770SStanislav Sedov 
170*ae771770SStanislav Sedov 	/* on error, skip all other tests */
171*ae771770SStanislav Sedov 	if (ret)
172*ae771770SStanislav Sedov 	    continue;
173*ae771770SStanislav Sedov 
174*ae771770SStanislav Sedov 	if (flags != testcases[n].out_flags)
175*ae771770SStanislav Sedov 	    errx(1, "testcases %u: flags wrong", n);
176*ae771770SStanislav Sedov 
177*ae771770SStanislav Sedov 	if (datalen != testcases[n].ucs2_len)
178*ae771770SStanislav Sedov 	    errx(1, "testcases %u: ucs len wrong", n);
179*ae771770SStanislav Sedov 
180*ae771770SStanislav Sedov 	for (m = 0; m < datalen; m++)
181*ae771770SStanislav Sedov 	    if (testcases[n].ucs2[m] != data[m])
182*ae771770SStanislav Sedov 		errx(1, "testcases %u: char %u wrong", n, m);
183*ae771770SStanislav Sedov     }
184*ae771770SStanislav Sedov 
185*ae771770SStanislav Sedov     return 0;
186*ae771770SStanislav Sedov }
187