1'use strict';
2require('../common');
3const assert = require('assert');
4const net = require('net');
5
6const v6 = [
7  '::',
8  '1::',
9  '::1',
10  '1::8',
11  '1::7:8',
12  '1:2:3:4:5:6:7:8',
13  '1:2:3:4:5:6::8',
14  '1:2:3:4:5:6:7::',
15  '1:2:3:4:5::7:8',
16  '1:2:3:4:5::8',
17  '1:2:3::8',
18  '1::4:5:6:7:8',
19  '1::6:7:8',
20  '1::3:4:5:6:7:8',
21  '1:2:3:4::6:7:8',
22  '1:2::4:5:6:7:8',
23  '::2:3:4:5:6:7:8',
24  '1:2::8',
25  '2001:0000:1234:0000:0000:C1C0:ABCD:0876',
26  '3ffe:0b00:0000:0000:0001:0000:0000:000a',
27  'FF02:0000:0000:0000:0000:0000:0000:0001',
28  '0000:0000:0000:0000:0000:0000:0000:0001',
29  '0000:0000:0000:0000:0000:0000:0000:0000',
30  '::ffff:192.168.1.26',
31  '2::10',
32  'ff02::1',
33  'fe80::',
34  '2002::',
35  '2001:db8::',
36  '2001:0db8:1234::',
37  '::ffff:0:0',
38  '::ffff:192.168.1.1',
39  '1:2:3:4::8',
40  '1::2:3:4:5:6:7',
41  '1::2:3:4:5:6',
42  '1::2:3:4:5',
43  '1::2:3:4',
44  '1::2:3',
45  '::2:3:4:5:6:7',
46  '::2:3:4:5:6',
47  '::2:3:4:5',
48  '::2:3:4',
49  '::2:3',
50  '::8',
51  '1:2:3:4:5:6::',
52  '1:2:3:4:5::',
53  '1:2:3:4::',
54  '1:2:3::',
55  '1:2::',
56  '1:2:3:4::7:8',
57  '1:2:3::7:8',
58  '1:2::7:8',
59  '1:2:3:4:5:6:1.2.3.4',
60  '1:2:3:4:5::1.2.3.4',
61  '1:2:3:4::1.2.3.4',
62  '1:2:3::1.2.3.4',
63  '1:2::1.2.3.4',
64  '1::1.2.3.4',
65  '1:2:3:4::5:1.2.3.4',
66  '1:2:3::5:1.2.3.4',
67  '1:2::5:1.2.3.4',
68  '1::5:1.2.3.4',
69  '1::5:11.22.33.44',
70  'fe80::217:f2ff:254.7.237.98',
71  'fe80::217:f2ff:fe07:ed62',
72  '2001:DB8:0:0:8:800:200C:417A',
73  'FF01:0:0:0:0:0:0:101',
74  '0:0:0:0:0:0:0:1',
75  '0:0:0:0:0:0:0:0',
76  '2001:DB8::8:800:200C:417A',
77  'FF01::101',
78  '0:0:0:0:0:0:13.1.68.3',
79  '0:0:0:0:0:FFFF:129.144.52.38',
80  '::13.1.68.3',
81  '::FFFF:129.144.52.38',
82  'fe80:0000:0000:0000:0204:61ff:fe9d:f156',
83  'fe80:0:0:0:204:61ff:fe9d:f156',
84  'fe80::204:61ff:fe9d:f156',
85  'fe80:0:0:0:204:61ff:254.157.241.86',
86  'fe80::204:61ff:254.157.241.86',
87  'fe80::1',
88  '2001:0db8:85a3:0000:0000:8a2e:0370:7334',
89  '2001:db8:85a3:0:0:8a2e:370:7334',
90  '2001:db8:85a3::8a2e:370:7334',
91  '2001:0db8:0000:0000:0000:0000:1428:57ab',
92  '2001:0db8:0000:0000:0000::1428:57ab',
93  '2001:0db8:0:0:0:0:1428:57ab',
94  '2001:0db8:0:0::1428:57ab',
95  '2001:0db8::1428:57ab',
96  '2001:db8::1428:57ab',
97  '::ffff:12.34.56.78',
98  '::ffff:0c22:384e',
99  '2001:0db8:1234:0000:0000:0000:0000:0000',
100  '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff',
101  '2001:db8:a::123',
102  '::ffff:192.0.2.128',
103  '::ffff:c000:280',
104  'a:b:c:d:e:f:f1:f2',
105  'a:b:c::d:e:f:f1',
106  'a:b:c::d:e:f',
107  'a:b:c::d:e',
108  'a:b:c::d',
109  '::a',
110  '::a:b:c',
111  '::a:b:c:d:e:f:f1',
112  'a::',
113  'a:b:c::',
114  'a:b:c:d:e:f:f1::',
115  'a:bb:ccc:dddd:000e:00f:0f::',
116  '0:a:0:a:0:0:0:a',
117  '0:a:0:0:a:0:0:a',
118  '2001:db8:1:1:1:1:0:0',
119  '2001:db8:1:1:1:0:0:0',
120  '2001:db8:1:1:0:0:0:0',
121  '2001:db8:1:0:0:0:0:0',
122  '2001:db8:0:0:0:0:0:0',
123  '2001:0:0:0:0:0:0:0',
124  'A:BB:CCC:DDDD:000E:00F:0F::',
125  '0:0:0:0:0:0:0:a',
126  '0:0:0:0:a:0:0:0',
127  '0:0:0:a:0:0:0:0',
128  'a:0:0:a:0:0:a:a',
129  'a:0:0:a:0:0:0:a',
130  'a:0:0:0:a:0:0:a',
131  'a:0:0:0:a:0:0:0',
132  'a:0:0:0:0:0:0:0',
133  'fe80::7:8%eth0',
134  'fe80::7:8%1',
135];
136
137const v6not = [
138  '',
139  '1:',
140  ':1',
141  '11:36:12',
142  '02001:0000:1234:0000:0000:C1C0:ABCD:0876',
143  '2001:0000:1234:0000:00001:C1C0:ABCD:0876',
144  '2001:0000:1234: 0000:0000:C1C0:ABCD:0876',
145  '2001:1:1:1:1:1:255Z255X255Y255',
146  '3ffe:0b00:0000:0001:0000:0000:000a',
147  'FF02:0000:0000:0000:0000:0000:0000:0000:0001',
148  '3ffe:b00::1::a',
149  '::1111:2222:3333:4444:5555:6666::',
150  '1:2:3::4:5::7:8',
151  '12345::6:7:8',
152  '1::5:400.2.3.4',
153  '1::5:260.2.3.4',
154  '1::5:256.2.3.4',
155  '1::5:1.256.3.4',
156  '1::5:1.2.256.4',
157  '1::5:1.2.3.256',
158  '1::5:300.2.3.4',
159  '1::5:1.300.3.4',
160  '1::5:1.2.300.4',
161  '1::5:1.2.3.300',
162  '1::5:900.2.3.4',
163  '1::5:1.900.3.4',
164  '1::5:1.2.900.4',
165  '1::5:1.2.3.900',
166  '1::5:300.300.300.300',
167  '1::5:3000.30.30.30',
168  '1::400.2.3.4',
169  '1::260.2.3.4',
170  '1::256.2.3.4',
171  '1::1.256.3.4',
172  '1::1.2.256.4',
173  '1::1.2.3.256',
174  '1::300.2.3.4',
175  '1::1.300.3.4',
176  '1::1.2.300.4',
177  '1::1.2.3.300',
178  '1::900.2.3.4',
179  '1::1.900.3.4',
180  '1::1.2.900.4',
181  '1::1.2.3.900',
182  '1::300.300.300.300',
183  '1::3000.30.30.30',
184  '::400.2.3.4',
185  '::260.2.3.4',
186  '::256.2.3.4',
187  '::1.256.3.4',
188  '::1.2.256.4',
189  '::1.2.3.256',
190  '::300.2.3.4',
191  '::1.300.3.4',
192  '::1.2.300.4',
193  '::1.2.3.300',
194  '::900.2.3.4',
195  '::1.900.3.4',
196  '::1.2.900.4',
197  '::1.2.3.900',
198  '::300.300.300.300',
199  '::3000.30.30.30',
200  '2001:DB8:0:0:8:800:200C:417A:221',
201  'FF01::101::2',
202  '1111:2222:3333:4444::5555:',
203  '1111:2222:3333::5555:',
204  '1111:2222::5555:',
205  '1111::5555:',
206  '::5555:',
207  ':::',
208  '1111:',
209  ':',
210  ':1111:2222:3333:4444::5555',
211  ':1111:2222:3333::5555',
212  ':1111:2222::5555',
213  ':1111::5555',
214  ':::5555',
215  '1.2.3.4:1111:2222:3333:4444::5555',
216  '1.2.3.4:1111:2222:3333::5555',
217  '1.2.3.4:1111:2222::5555',
218  '1.2.3.4:1111::5555',
219  '1.2.3.4::5555',
220  '1.2.3.4::',
221  'fe80:0000:0000:0000:0204:61ff:254.157.241.086',
222  '123',
223  'ldkfj',
224  '2001::FFD3::57ab',
225  '2001:db8:85a3::8a2e:37023:7334',
226  '2001:db8:85a3::8a2e:370k:7334',
227  '1:2:3:4:5:6:7:8:9',
228  '1::2::3',
229  '1:::3:4:5',
230  '1:2:3::4:5:6:7:8:9',
231  '::ffff:2.3.4',
232  '::ffff:257.1.2.3',
233  '::ffff:12345678901234567890.1.26',
234  '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0',
235  '02001:0000:1234:0000:0000:C1C0:ABCD:0876',
236];
237
238v6.forEach((ip) => {
239  assert.strictEqual(net.isIPv6(ip), true);
240});
241
242v6not.forEach((ip) => {
243  assert.strictEqual(net.isIPv6(ip), false);
244});
245