source: mainline/uspace/lib/inet/test/addr.c@ 443695e

Last change on this file since 443695e was 1801005, checked in by Jiri Svoboda <jiri@…>, 14 months ago

Fix IPv6 address parsing

  • Property mode set to 100644
File size: 6.8 KB
RevLine 
[1801005]1/*
2 * Copyright (c) 2024 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <errno.h>
30#include <inet/addr.h>
31#include <pcut/pcut.h>
32
33PCUT_INIT;
34
35PCUT_TEST_SUITE(addr);
36
37/** Test inet_addr_parse() with unabbreviated address */
38PCUT_TEST(inet_addr_parse_full)
39{
40 errno_t rc;
41 inet_addr_t addr;
42 char *endptr;
43
44 rc = inet_addr_parse("1122:3344:5566:7788:99aa:bbcc:ddee:ff00/", &addr,
45 &endptr);
46 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
47 PCUT_ASSERT_EQUALS('/', *endptr);
48
49 PCUT_ASSERT_INT_EQUALS(ip_v6, addr.version);
50
51 PCUT_ASSERT_INT_EQUALS(0x11, addr.addr6[0]);
52 PCUT_ASSERT_INT_EQUALS(0x22, addr.addr6[1]);
53 PCUT_ASSERT_INT_EQUALS(0x33, addr.addr6[2]);
54 PCUT_ASSERT_INT_EQUALS(0x44, addr.addr6[3]);
55 PCUT_ASSERT_INT_EQUALS(0x55, addr.addr6[4]);
56 PCUT_ASSERT_INT_EQUALS(0x66, addr.addr6[5]);
57 PCUT_ASSERT_INT_EQUALS(0x77, addr.addr6[6]);
58 PCUT_ASSERT_INT_EQUALS(0x88, addr.addr6[7]);
59
60 PCUT_ASSERT_INT_EQUALS(0x99, addr.addr6[8]);
61 PCUT_ASSERT_INT_EQUALS(0xaa, addr.addr6[9]);
62 PCUT_ASSERT_INT_EQUALS(0xbb, addr.addr6[10]);
63 PCUT_ASSERT_INT_EQUALS(0xcc, addr.addr6[11]);
64 PCUT_ASSERT_INT_EQUALS(0xdd, addr.addr6[12]);
65 PCUT_ASSERT_INT_EQUALS(0xee, addr.addr6[13]);
66 PCUT_ASSERT_INT_EQUALS(0xff, addr.addr6[14]);
67 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[15]);
68}
69
70/** Test inet_addr_parse() with short groups (< 0x1000) */
71PCUT_TEST(inet_addr_parse_shortgr)
72{
73 errno_t rc;
74 inet_addr_t addr;
75 char *endptr;
76
77 rc = inet_addr_parse("1:22:333:4444:5:66:777:8888/", &addr,
78 &endptr);
79 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
80 PCUT_ASSERT_EQUALS('/', *endptr);
81
82 PCUT_ASSERT_INT_EQUALS(ip_v6, addr.version);
83
84 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[0]);
85 PCUT_ASSERT_INT_EQUALS(0x01, addr.addr6[1]);
86 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[2]);
87 PCUT_ASSERT_INT_EQUALS(0x22, addr.addr6[3]);
88 PCUT_ASSERT_INT_EQUALS(0x03, addr.addr6[4]);
89 PCUT_ASSERT_INT_EQUALS(0x33, addr.addr6[5]);
90 PCUT_ASSERT_INT_EQUALS(0x44, addr.addr6[6]);
91 PCUT_ASSERT_INT_EQUALS(0x44, addr.addr6[7]);
92
93 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[8]);
94 PCUT_ASSERT_INT_EQUALS(0x05, addr.addr6[9]);
95 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[10]);
96 PCUT_ASSERT_INT_EQUALS(0x66, addr.addr6[11]);
97 PCUT_ASSERT_INT_EQUALS(0x07, addr.addr6[12]);
98 PCUT_ASSERT_INT_EQUALS(0x77, addr.addr6[13]);
99 PCUT_ASSERT_INT_EQUALS(0x88, addr.addr6[14]);
100 PCUT_ASSERT_INT_EQUALS(0x88, addr.addr6[15]);
101}
102
103/** Test inet_addr_parse() with wildcard at the beginning */
104PCUT_TEST(inet_addr_parse_wcbegin)
105{
106 errno_t rc;
107 inet_addr_t addr;
108 char *endptr;
109
110 rc = inet_addr_parse("::1234/", &addr, &endptr);
111 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
112 PCUT_ASSERT_EQUALS('/', *endptr);
113
114 PCUT_ASSERT_INT_EQUALS(ip_v6, addr.version);
115
116 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[0]);
117 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[1]);
118 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[2]);
119 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[3]);
120 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[4]);
121 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[5]);
122 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[6]);
123 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[7]);
124
125 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[8]);
126 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[9]);
127 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[10]);
128 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[11]);
129 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[12]);
130 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[13]);
131 PCUT_ASSERT_INT_EQUALS(0x12, addr.addr6[14]);
132 PCUT_ASSERT_INT_EQUALS(0x34, addr.addr6[15]);
133}
134
135/** Test inet_addr_parse() with wildcard in the middle */
136PCUT_TEST(inet_addr_parse_wcmiddle)
137{
138 errno_t rc;
139 inet_addr_t addr;
140 char *endptr;
141
142 rc = inet_addr_parse("1122:3344::5566/", &addr, &endptr);
143 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
144 PCUT_ASSERT_EQUALS('/', *endptr);
145
146 PCUT_ASSERT_INT_EQUALS(ip_v6, addr.version);
147
148 PCUT_ASSERT_INT_EQUALS(0x11, addr.addr6[0]);
149 PCUT_ASSERT_INT_EQUALS(0x22, addr.addr6[1]);
150 PCUT_ASSERT_INT_EQUALS(0x33, addr.addr6[2]);
151 PCUT_ASSERT_INT_EQUALS(0x44, addr.addr6[3]);
152 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[4]);
153 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[5]);
154 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[6]);
155 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[7]);
156
157 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[8]);
158 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[9]);
159 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[10]);
160 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[11]);
161 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[12]);
162 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[13]);
163 PCUT_ASSERT_INT_EQUALS(0x55, addr.addr6[14]);
164 PCUT_ASSERT_INT_EQUALS(0x66, addr.addr6[15]);
165}
166
167/** Test inet_addr_parse() with wildcard at the end */
168PCUT_TEST(inet_addr_parse_wcend)
169{
170 errno_t rc;
171 inet_addr_t addr;
172 char *endptr;
173
174 rc = inet_addr_parse("1234:5678::/", &addr, &endptr);
175 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
176 PCUT_ASSERT_EQUALS('/', *endptr);
177
178 PCUT_ASSERT_INT_EQUALS(ip_v6, addr.version);
179
180 PCUT_ASSERT_INT_EQUALS(0x12, addr.addr6[0]);
181 PCUT_ASSERT_INT_EQUALS(0x34, addr.addr6[1]);
182 PCUT_ASSERT_INT_EQUALS(0x56, addr.addr6[2]);
183 PCUT_ASSERT_INT_EQUALS(0x78, addr.addr6[3]);
184 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[4]);
185 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[5]);
186 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[6]);
187 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[7]);
188
189 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[8]);
190 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[9]);
191 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[10]);
192 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[11]);
193 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[12]);
194 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[13]);
195 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[14]);
196 PCUT_ASSERT_INT_EQUALS(0x00, addr.addr6[15]);
197}
198
199PCUT_EXPORT(addr);
Note: See TracBrowser for help on using the repository browser.