VirtualBox

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

Last change on this file since 58291 was 57358, checked in by vboxsync, 9 years ago

*: scm cleanup run.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 8.6 KB
Line 
1/* $Id: tstRTNetIPv6.cpp 57358 2015-08-14 15:16:38Z vboxsync $ */
2/** @file
3 * IPRT Testcase - IPv6.
4 */
5
6/*
7 * Copyright (C) 2008-2015 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
75int main()
76{
77 RTTEST hTest;
78 int rc = RTTestInitAndCreate("tstRTNetIPv6", &hTest);
79 if (rc)
80 return rc;
81 RTTestBanner(hTest);
82
83
84 /* base case: eight groups fully spelled */
85 GOODADDR("1:2:3:4:5:6:7:8", 0x00010002, 0x00030004, 0x00050006, 0x00070008);
86 GOODADDR("0001:0002:0003:0004:0005:0006:0007:0008", 0x00010002, 0x00030004, 0x00050006, 0x00070008);
87 GOODADDR("D:E:A:D:b:e:e:f", 0x000d000e, 0x000a000d, 0x000b000e, 0x000e000f);
88
89 /* ... too short or too long */
90 BADADDR("1:2:3:4:5:6:7");
91 BADADDR("1:2:3:4:5:6:7:8:9");
92
93 /* ... hex group constraints */
94 BADADDR("1:2:3:4:5:6:7:-8");
95 BADADDR("1:2:3:4:5:6:7:0x8");
96 BADADDR("1:2:3:4:5:6:7:88888");
97 BADADDR("1:2:3:4:5:6:7:00008");
98
99
100 /* embedded IPv4 at the end */
101 GOODADDR("0:0:0:0:0:0:1.2.3.4", 0, 0, 0, 0x01020304);
102
103 /* ... not at the end */
104 BADADDR("0:0:0:0:0:1.2.3.4:0");
105
106 /* ... too short or too long */
107 BADADDR("0:0:0:0:0:0:0:1.2.3.4");
108 BADADDR("0:0:0:0:0:1.2.3.4");
109
110 /* ... invalid IPv4 address */
111 BADADDR("0:0:0:0:0:0:111.222.333.444");
112
113
114 /* "any" in compressed form */
115 GOODADDR("::", 0, 0, 0, 0);
116
117 /* compressed run at the beginning */
118 GOODADDR("::8", 0, 0, 0, 0x00000008);
119 GOODADDR("::7:8", 0, 0, 0, 0x00070008);
120 GOODADDR("::6:7:8", 0, 0, 0x00000006, 0x00070008);
121 GOODADDR("::5:6:7:8", 0, 0, 0x00050006, 0x00070008);
122 GOODADDR("::4:5:6:7:8", 0, 0x00000004, 0x00050006, 0x00070008);
123 GOODADDR("::3:4:5:6:7:8", 0, 0x00030004, 0x00050006, 0x00070008);
124 GOODADDR("::2:3:4:5:6:7:8", 0x00000002, 0x00030004, 0x00050006, 0x00070008);
125
126 /* ... too long */
127 BADADDR("::1:2:3:4:5:6:7:8");
128
129 /* compressed run at the end */
130 GOODADDR("1::", 0x00010000, 0, 0, 0);
131 GOODADDR("1:2::", 0x00010002, 0, 0, 0);
132 GOODADDR("1:2:3::", 0x00010002, 0x00030000, 0, 0);
133 GOODADDR("1:2:3:4::", 0x00010002, 0x00030004, 0, 0);
134 GOODADDR("1:2:3:4:5::", 0x00010002, 0x00030004, 0x00050000, 0);
135 GOODADDR("1:2:3:4:5:6::", 0x00010002, 0x00030004, 0x00050006, 0);
136 GOODADDR("1:2:3:4:5:6:7::", 0x00010002, 0x00030004, 0x00050006, 0x00070000);
137
138 /* ... too long */
139 BADADDR("1:2:3:4:5:6:7:8::");
140
141 /* compressed run in the middle */
142 GOODADDR("1::8", 0x00010000, 0, 0, 0x00000008);
143 GOODADDR("1:2::8", 0x00010002, 0, 0, 0x00000008);
144 GOODADDR("1:2:3::8", 0x00010002, 0x00030000, 0, 0x00000008);
145 GOODADDR("1:2:3:4::8", 0x00010002, 0x00030004, 0, 0x00000008);
146 GOODADDR("1:2:3:4:5::8", 0x00010002, 0x00030004, 0x00050000, 0x00000008);
147 GOODADDR("1:2:3:4:5:6::8", 0x00010002, 0x00030004, 0x00050006, 0x00000008);
148
149 GOODADDR("1::7:8", 0x00010000, 0, 0, 0x00070008);
150 GOODADDR("1::6:7:8", 0x00010000, 0, 0x00000006, 0x00070008);
151 GOODADDR("1::5:6:7:8", 0x00010000, 0, 0x00050006, 0x00070008);
152 GOODADDR("1::4:5:6:7:8", 0x00010000, 0x00000004, 0x00050006, 0x00070008);
153 GOODADDR("1::3:4:5:6:7:8", 0x00010000, 0x00030004, 0x00050006, 0x00070008);
154
155 /* ... too long */
156 BADADDR("1::2:3:4:5:6:7:8");
157 BADADDR("1:2::3:4:5:6:7:8");
158 BADADDR("1:2:3::4:5:6:7:8");
159 BADADDR("1:2:3:4::5:6:7:8");
160 BADADDR("1:2:3:4:5::6:7:8");
161 BADADDR("1:2:3:4:5:6::7:8");
162 BADADDR("1:2:3:4:5:6:7::8");
163
164 /* compressed with embedded IPv4 */
165 GOODADDR("::0.0.0.0", 0, 0, 0, 0);
166 GOODADDR("::1.2.3.4", 0, 0, 0, 0x01020304);
167 GOODADDR("::ffff:1.2.3.4", 0, 0, 0x0000ffff, 0x01020304);
168 GOODADDR("::ffff:0:1.2.3.4", 0, 0, 0xffff0000, 0x01020304);
169
170 GOODADDR("1::1.2.3.4", 0x00010000, 0, 0, 0x01020304);
171 GOODADDR("1:2::1.2.3.4", 0x00010002, 0, 0, 0x01020304);
172 GOODADDR("1:2:3::1.2.3.4", 0x00010002, 0x00030000, 0, 0x01020304);
173 GOODADDR("1:2:3:4::1.2.3.4", 0x00010002, 0x00030004, 0, 0x01020304);
174 GOODADDR("1:2:3:4:5::1.2.3.4", 0x00010002, 0x00030004, 0x00050000, 0x01020304);
175
176 /* ... too long */
177 BADADDR("1:2:3:4:5:6::1.2.3.4");
178 BADADDR("1:2:3:4:5::6:1.2.3.4");
179 BADADDR("1:2:3:4::5:6:1.2.3.4");
180 BADADDR("1:2:3::4:5:6:1.2.3.4");
181 BADADDR("1:2::3:4:5:6:1.2.3.4");
182 BADADDR("1::2:3:4:5:6:1.2.3.4");
183
184 /* zone ids (beware, shaky ground) */
185 GOODADDR("ff01::1%0", 0xff010000, 0, 0, 1);
186 GOODADDR("ff01::1%eth0", 0xff010000, 0, 0, 1);
187 GOODADDR("ff01::1%net1.0", 0xff010000, 0, 0, 1);
188
189 GOODADDR(" ff01::1%net1.1\t", 0xff010000, 0, 0, 1);
190
191 return RTTestSummaryAndDestroy(hTest);
192}
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