VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTNetIPv6.cpp@ 66832

Last change on this file since 66832 was 62477, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 9.7 KB
Line 
1/* $Id: tstRTNetIPv6.cpp 62477 2016-07-22 18:27:37Z vboxsync $ */
2/** @file
3 * IPRT Testcase - IPv6.
4 */
5
6/*
7 * Copyright (C) 2008-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/net.h>
32
33#include <iprt/err.h>
34#include <iprt/initterm.h>
35#include <iprt/test.h>
36
37#include <iprt/string.h>
38
39
40/*********************************************************************************************************************************
41* Defined Constants And Macros *
42*********************************************************************************************************************************/
43#define CHECKADDR(String, rcExpected, u32_0, u32_1, u32_2, u32_3) \
44 do { \
45 RTNETADDRIPV6 Addr; \
46 char *pszZone; \
47 uint32_t ExpectedAddr[4] = { \
48 RT_H2N_U32_C(u32_0), RT_H2N_U32_C(u32_1), \
49 RT_H2N_U32_C(u32_2), RT_H2N_U32_C(u32_3) \
50 }; \
51 int rc2 = RTNetStrToIPv6Addr(String, &Addr, &pszZone); \
52 if ((rcExpected) && !rc2) \
53 { \
54 RTTestIFailed("at line %d: '%s': expected %Rrc got %Rrc\n", \
55 __LINE__, String, (rcExpected), rc2); \
56 } \
57 else if ( (rcExpected) != rc2 \
58 || ( rc2 == VINF_SUCCESS \
59 && memcmp(ExpectedAddr, &Addr, sizeof(Addr)) != 0)) \
60 { \
61 RTTestIFailed("at line %d: '%s': expected %Rrc got %Rrc," \
62 " expected address %RTnaipv6 got %RTnaipv6\n", \
63 __LINE__, String, rcExpected, rc2, \
64 ExpectedAddr, &Addr); \
65 } \
66 } while (0)
67
68#define GOODADDR(String, u32_0, u32_1, u32_2, u32_3) \
69 CHECKADDR(String, VINF_SUCCESS, u32_0, u32_1, u32_2, u32_3)
70
71#define BADADDR(String) \
72 CHECKADDR(String, VERR_INVALID_PARAMETER, 0, 0, 0, 0)
73
74
75#define CHECKANY(String, fExpected) \
76 do { \
77 bool fRc = RTNetStrIsIPv6AddrAny(String); \
78 if (fRc != fExpected) \
79 { \
80 RTTestIFailed("at line %d: '%s':" \
81 " expected %RTbool got %RTbool\n", \
82 __LINE__, (String), fExpected, fRc); \
83 } \
84 } while (0)
85
86#define IS_ANY(String) CHECKANY((String), true)
87#define NOT_ANY(String) CHECKANY((String), false)
88
89
90int main()
91{
92 RTTEST hTest;
93 int rc = RTTestInitAndCreate("tstRTNetIPv6", &hTest);
94 if (rc)
95 return rc;
96 RTTestBanner(hTest);
97
98
99 /* base case: eight groups fully spelled */
100 GOODADDR("1:2:3:4:5:6:7:8", 0x00010002, 0x00030004, 0x00050006, 0x00070008);
101 GOODADDR("0001:0002:0003:0004:0005:0006:0007:0008", 0x00010002, 0x00030004, 0x00050006, 0x00070008);
102 GOODADDR("D:E:A:D:b:e:e:f", 0x000d000e, 0x000a000d, 0x000b000e, 0x000e000f);
103
104 /* ... too short or too long */
105 BADADDR("1:2:3:4:5:6:7");
106 BADADDR("1:2:3:4:5:6:7:8:9");
107
108 /* ... hex group constraints */
109 BADADDR("1:2:3:4:5:6:7:-8");
110 BADADDR("1:2:3:4:5:6:7:0x8");
111 BADADDR("1:2:3:4:5:6:7:88888");
112 BADADDR("1:2:3:4:5:6:7:00008");
113
114
115 /* embedded IPv4 at the end */
116 GOODADDR("0:0:0:0:0:0:1.2.3.4", 0, 0, 0, 0x01020304);
117
118 /* ... not at the end */
119 BADADDR("0:0:0:0:0:1.2.3.4:0");
120
121 /* ... too short or too long */
122 BADADDR("0:0:0:0:0:0:0:1.2.3.4");
123 BADADDR("0:0:0:0:0:1.2.3.4");
124
125 /* ... invalid IPv4 address */
126 BADADDR("0:0:0:0:0:0:111.222.333.444");
127
128
129 /* "any" in compressed form */
130 GOODADDR("::", 0, 0, 0, 0);
131
132 /* compressed run at the beginning */
133 GOODADDR("::8", 0, 0, 0, 0x00000008);
134 GOODADDR("::7:8", 0, 0, 0, 0x00070008);
135 GOODADDR("::6:7:8", 0, 0, 0x00000006, 0x00070008);
136 GOODADDR("::5:6:7:8", 0, 0, 0x00050006, 0x00070008);
137 GOODADDR("::4:5:6:7:8", 0, 0x00000004, 0x00050006, 0x00070008);
138 GOODADDR("::3:4:5:6:7:8", 0, 0x00030004, 0x00050006, 0x00070008);
139 GOODADDR("::2:3:4:5:6:7:8", 0x00000002, 0x00030004, 0x00050006, 0x00070008);
140
141 /* ... too long */
142 BADADDR("::1:2:3:4:5:6:7:8");
143
144 /* compressed run at the end */
145 GOODADDR("1::", 0x00010000, 0, 0, 0);
146 GOODADDR("1:2::", 0x00010002, 0, 0, 0);
147 GOODADDR("1:2:3::", 0x00010002, 0x00030000, 0, 0);
148 GOODADDR("1:2:3:4::", 0x00010002, 0x00030004, 0, 0);
149 GOODADDR("1:2:3:4:5::", 0x00010002, 0x00030004, 0x00050000, 0);
150 GOODADDR("1:2:3:4:5:6::", 0x00010002, 0x00030004, 0x00050006, 0);
151 GOODADDR("1:2:3:4:5:6:7::", 0x00010002, 0x00030004, 0x00050006, 0x00070000);
152
153 /* ... too long */
154 BADADDR("1:2:3:4:5:6:7:8::");
155
156 /* compressed run in the middle */
157 GOODADDR("1::8", 0x00010000, 0, 0, 0x00000008);
158 GOODADDR("1:2::8", 0x00010002, 0, 0, 0x00000008);
159 GOODADDR("1:2:3::8", 0x00010002, 0x00030000, 0, 0x00000008);
160 GOODADDR("1:2:3:4::8", 0x00010002, 0x00030004, 0, 0x00000008);
161 GOODADDR("1:2:3:4:5::8", 0x00010002, 0x00030004, 0x00050000, 0x00000008);
162 GOODADDR("1:2:3:4:5:6::8", 0x00010002, 0x00030004, 0x00050006, 0x00000008);
163
164 GOODADDR("1::7:8", 0x00010000, 0, 0, 0x00070008);
165 GOODADDR("1::6:7:8", 0x00010000, 0, 0x00000006, 0x00070008);
166 GOODADDR("1::5:6:7:8", 0x00010000, 0, 0x00050006, 0x00070008);
167 GOODADDR("1::4:5:6:7:8", 0x00010000, 0x00000004, 0x00050006, 0x00070008);
168 GOODADDR("1::3:4:5:6:7:8", 0x00010000, 0x00030004, 0x00050006, 0x00070008);
169
170 /* ... too long */
171 BADADDR("1::2:3:4:5:6:7:8");
172 BADADDR("1:2::3:4:5:6:7:8");
173 BADADDR("1:2:3::4:5:6:7:8");
174 BADADDR("1:2:3:4::5:6:7:8");
175 BADADDR("1:2:3:4:5::6:7:8");
176 BADADDR("1:2:3:4:5:6::7:8");
177 BADADDR("1:2:3:4:5:6:7::8");
178
179 /* compressed with embedded IPv4 */
180 GOODADDR("::0.0.0.0", 0, 0, 0, 0);
181 GOODADDR("::1.2.3.4", 0, 0, 0, 0x01020304);
182 GOODADDR("::ffff:1.2.3.4", 0, 0, 0x0000ffff, 0x01020304);
183 GOODADDR("::ffff:0:1.2.3.4", 0, 0, 0xffff0000, 0x01020304);
184
185 GOODADDR("1::1.2.3.4", 0x00010000, 0, 0, 0x01020304);
186 GOODADDR("1:2::1.2.3.4", 0x00010002, 0, 0, 0x01020304);
187 GOODADDR("1:2:3::1.2.3.4", 0x00010002, 0x00030000, 0, 0x01020304);
188 GOODADDR("1:2:3:4::1.2.3.4", 0x00010002, 0x00030004, 0, 0x01020304);
189 GOODADDR("1:2:3:4:5::1.2.3.4", 0x00010002, 0x00030004, 0x00050000, 0x01020304);
190
191 /* ... too long */
192 BADADDR("1:2:3:4:5:6::1.2.3.4");
193 BADADDR("1:2:3:4:5::6:1.2.3.4");
194 BADADDR("1:2:3:4::5:6:1.2.3.4");
195 BADADDR("1:2:3::4:5:6:1.2.3.4");
196 BADADDR("1:2::3:4:5:6:1.2.3.4");
197 BADADDR("1::2:3:4:5:6:1.2.3.4");
198
199 /* zone ids (beware, shaky ground) */
200 GOODADDR("ff01::1%0", 0xff010000, 0, 0, 1);
201 GOODADDR("ff01::1%eth0", 0xff010000, 0, 0, 1);
202 GOODADDR("ff01::1%net1.0", 0xff010000, 0, 0, 1);
203
204 GOODADDR(" ff01::1%net1.1\t", 0xff010000, 0, 0, 1);
205
206
207 IS_ANY("::");
208 IS_ANY("::0.0.0.0");
209 IS_ANY("0:0:0:0:0:0:0:0");
210 IS_ANY("0000:0000:0000:0000:0000:0000:0000:0000");
211
212 IS_ANY("\t :: \t");
213
214 NOT_ANY("::1");
215 NOT_ANY("0:0:0:0:0:0:0:1");
216
217 NOT_ANY(":: x");
218 NOT_ANY("::%");
219 NOT_ANY("::%eth0"); /* or is it? */
220
221 return RTTestSummaryAndDestroy(hTest);
222}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette