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