diff options
Diffstat (limited to 'six/info_file_parser_test.go')
-rw-r--r-- | six/info_file_parser_test.go | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/six/info_file_parser_test.go b/six/info_file_parser_test.go new file mode 100644 index 0000000..9994e6f --- /dev/null +++ b/six/info_file_parser_test.go | |||
@@ -0,0 +1,256 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0-only | ||
2 | // Copyright (C) 2020 Michael Crute <mike@crute.us>. All rights reserved. | ||
3 | // | ||
4 | // Use of this source code is governed by a license that can be found in the | ||
5 | // LICENSE file. | ||
6 | |||
7 | package six | ||
8 | |||
9 | import ( | ||
10 | "net" | ||
11 | "strings" | ||
12 | "testing" | ||
13 | "time" | ||
14 | |||
15 | "github.com/stretchr/testify/assert" | ||
16 | ) | ||
17 | |||
18 | var testDate = time.Date(2020, 02, 12, 19, 43, 23, 0, time.UTC) | ||
19 | |||
20 | const roaTest = ` | ||
21 | Timestamp: 2020-02-12 19:43:23 UTC | ||
22 | Trust Anchor | ASN | Max Length | Prefix | ||
23 | APNIC | 64496 | 24 | 192.0.2.0/24 | ||
24 | RIPE | 64496 | 24 | 198.51.100.0/24 | ||
25 | RIPE | 64496 | 48 | 2001:db8:3a80::/48 | ||
26 | APNIC | 64496 | 48 | 2001:db8:3a81::/48 | ||
27 | ` | ||
28 | |||
29 | func parseCidr(c string) net.IPNet { | ||
30 | _, n, _ := net.ParseCIDR(c) | ||
31 | return *n | ||
32 | } | ||
33 | |||
34 | func TestROAParsing(t *testing.T) { | ||
35 | rs := parseROAFile(strings.Split(roaTest, "\n")) | ||
36 | |||
37 | matrix := []struct { | ||
38 | TrustAnchor string | ||
39 | ASN int | ||
40 | MaxLength int | ||
41 | Prefix net.IPNet | ||
42 | }{ | ||
43 | {"APNIC", 64496, 24, parseCidr("192.0.2.0/24")}, | ||
44 | {"RIPE", 64496, 24, parseCidr("198.51.100.0/24")}, | ||
45 | {"RIPE", 64496, 48, parseCidr("2001:db8:3a80::/48")}, | ||
46 | {"APNIC", 64496, 48, parseCidr("2001:db8:3a81::/48")}, | ||
47 | } | ||
48 | |||
49 | for i, tv := range matrix { | ||
50 | assert.EqualValues(t, tv, rs.ROAS[i]) | ||
51 | } | ||
52 | |||
53 | assert.Equal(t, rs.Timestamp, testDate) | ||
54 | } | ||
55 | |||
56 | const prefixListv4 = ` | ||
57 | Timestamp: 2020-02-12 19:43:23 UTC | ||
58 | 192.0.2.0/24 | ||
59 | 198.51.100.0/24 | ||
60 | ` | ||
61 | |||
62 | func TestPrefixSetv4Parsing(t *testing.T) { | ||
63 | r := parsePrefixSetFile(strings.Split(prefixListv4, "\n")) | ||
64 | |||
65 | assert.Equal(t, r.Timestamp, testDate) | ||
66 | assert.Equal(t, r.Prefixes[0], parseCidr("192.0.2.0/24")) | ||
67 | assert.Equal(t, r.Prefixes[1], parseCidr("198.51.100.0/24")) | ||
68 | } | ||
69 | |||
70 | const prefixListv6 = ` | ||
71 | Timestamp: 2020-02-12 19:43:23 UTC | ||
72 | 2001:db8:3a80::/48 | ||
73 | 2001:db8:3a81::/48 | ||
74 | ` | ||
75 | |||
76 | func TestPrefixSetv6Parsing(t *testing.T) { | ||
77 | r := parsePrefixSetFile(strings.Split(prefixListv6, "\n")) | ||
78 | |||
79 | assert.Equal(t, r.Timestamp, testDate) | ||
80 | assert.Equal(t, r.Prefixes[0], parseCidr("2001:db8:3a80::/48")) | ||
81 | assert.Equal(t, r.Prefixes[1], parseCidr("2001:db8:3a81::/48")) | ||
82 | } | ||
83 | |||
84 | const asPrefixListv4 = ` | ||
85 | as-set: AS-TEST | ||
86 | Timestamp: 2020-02-12 19:43:23 UTC | ||
87 | 192.0.2.0/24 | ||
88 | 198.51.100.0/24 | ||
89 | 198.51.100.0/24, | ||
90 | ` | ||
91 | |||
92 | func TestPrefixSetASNv4Parsing(t *testing.T) { | ||
93 | r := parsePrefixSetFile(strings.Split(asPrefixListv4, "\n")) | ||
94 | |||
95 | assert.Equal(t, r.Timestamp, testDate) | ||
96 | assert.Equal(t, *r.ASSet, "AS-TEST") | ||
97 | assert.Equal(t, r.Prefixes[0], parseCidr("192.0.2.0/24")) | ||
98 | assert.Equal(t, r.Prefixes[1], parseCidr("198.51.100.0/24")) | ||
99 | assert.Equal(t, r.Prefixes[2], parseCidr("198.51.100.0/24")) | ||
100 | } | ||
101 | |||
102 | const asPrefixListv6 = ` | ||
103 | as-set: AS-TEST | ||
104 | Timestamp: 2020-02-12 19:43:23 UTC | ||
105 | 2001:db8:3a80::/48 | ||
106 | 2001:db8:3a81::/48 | ||
107 | 2001:db8:3a81::/48, | ||
108 | ` | ||
109 | |||
110 | func TestPrefixSetASNv6Parsing(t *testing.T) { | ||
111 | r := parsePrefixSetFile(strings.Split(asPrefixListv6, "\n")) | ||
112 | |||
113 | assert.Equal(t, r.Timestamp, testDate) | ||
114 | assert.Equal(t, *r.ASSet, "AS-TEST") | ||
115 | assert.Equal(t, r.Prefixes[0], parseCidr("2001:db8:3a80::/48")) | ||
116 | assert.Equal(t, r.Prefixes[1], parseCidr("2001:db8:3a81::/48")) | ||
117 | assert.Equal(t, r.Prefixes[2], parseCidr("2001:db8:3a81::/48")) | ||
118 | } | ||
119 | |||
120 | const asSetFile = ` | ||
121 | as-set: AS-TEST | ||
122 | Timestamp: 2020-02-12 19:43:23 UTC | ||
123 | 64496 | ||
124 | 64497 | ||
125 | 64498 | ||
126 | ` | ||
127 | |||
128 | func TestASSetParsing(t *testing.T) { | ||
129 | r := parseASSetFile(strings.Split(asSetFile, "\n")) | ||
130 | |||
131 | assert.Equal(t, r.Timestamp, testDate) | ||
132 | assert.Equal(t, r.Name, "AS-TEST") | ||
133 | assert.Equal(t, r.ASNumbers[0], 64496) | ||
134 | assert.Equal(t, r.ASNumbers[1], 64497) | ||
135 | assert.Equal(t, r.ASNumbers[2], 64498) | ||
136 | } | ||
137 | |||
138 | const errorFilev4 = ` | ||
139 | 2020-02-12 19:43:23 <INFO> 64496:1:1500:v4:Testnet: 192.0.2.0/24 from 192.0.2.1 (path 64496 64497 64497 64497 64499): AS64499 not member of IRR as-set object! Dropping. | ||
140 | 2020-02-12 19:43:23 <INFO> 64496:1:1500:v4:Testnet: 198.51.100.0/24 from 192.0.2.1: bgp_path(path 64496 64497 64498 64498 64499) matches pdb_never_via_route_servers_ASNs! Dropping. | ||
141 | 2020-02-12 19:43:23 <INFO> 64496:1:1500:v4:Testnet: 192.0.2.0/26 from 192.0.2.1 (path 64496): RPKI ROA_INVALID! Dropping. | ||
142 | ` | ||
143 | |||
144 | const errorFilev6 = ` | ||
145 | 2020-02-12 19:43:23 <INFO> 64496:1:1500:v6:Testnet: 2001:db8::/16 from 2001:db8::1: matches bogon_prefixes! Dropping. | ||
146 | 2020-02-12 19:43:23 <INFO> 64496:1:1500:v6:Testnet: 2001:db8::/24 from 2001:db8::1: bgp_path(path 64496 64497 64497 64497 64497 64497 64497 64497 64497 64498) matches pdb_never_via_route_servers_ASNs! Dropping. | ||
147 | 2020-02-12 19:43:23 <INFO> 64496:1:1500:v6:Testnet: 2001:db8::/32 from 2001:db8::1 (path 64496 64497 64498 64498 64499): AS64499 not member of IRR as-set object! Dropping. | ||
148 | ` | ||
149 | |||
150 | // Last line intentionally not parsable | ||
151 | const errorFilev4j = ` | ||
152 | 2020-02-12 19:43:23 <INFO> 64496:1:9000:v4:Testnet: 192.0.2.0/24 from 192.0.2.1: bgp_path(path 64496 64498 { 75757 }) matches bogon_ASNs! Dropping. | ||
153 | 2020-02-12 19:43:23 <INFO> 64496:1:9000:v4:Testnet: 198.51.100.0/24 from 192.0.2.1: matches bogon_prefixes! Dropping. | ||
154 | 2 20-02-12 19:43:23 <INFO> 64496:1:9000:v4:Testnet: 192.0.2.0/26 from 192.0.2.1: matches bogon_prefixes! Dropping. | ||
155 | ` | ||
156 | |||
157 | // Last line intentionally not parsable | ||
158 | const errorFilev6j = ` | ||
159 | 2020-02-12 19:43:23 <INFO> 64496:1:9000:v6:Testnet: 2001:db8::/32 from 2001:db8::1 (path 64496 64497 64499): no IRR route object found! Transit_dropping. | ||
160 | 2020-02-12 19:43:23 <INFO> 64496:1:9000:v6:Testnet: 2001:db8::/36 from 2001:db8::1 (path 64496 64498 64499): no IRR route object found! Transit_dropping. | ||
161 | 2020-02-12 19:43:23 <INFO> 64496:1:9000:v6:Testnet: 2001:db8::/48 from 2001:db8::1 (path 64496 64498 64498 64498 64499): RPKI ROA_INVALID! Transit_dropping. | ||
162 | 2 20-02-12 19:43:23 <INFO> 64496:1:9000:v6:Testnet: 2001:db8::/48 from 2001:db8::1 (path 64496 64498 64498 64498 64499): RPKI ROA_INVALID! Transit_dropping. | ||
163 | ` | ||
164 | |||
165 | func TestParsingErrorFile(t *testing.T) { | ||
166 | e := parseErrorFiles( | ||
167 | strings.Split(errorFilev4, "\n"), | ||
168 | strings.Split(errorFilev6, "\n"), | ||
169 | strings.Split(errorFilev4j, "\n"), | ||
170 | strings.Split(errorFilev6j, "\n")) | ||
171 | |||
172 | v4t := []struct { | ||
173 | Timestamp time.Time | ||
174 | ASN int | ||
175 | MTU int | ||
176 | Version IPVersion | ||
177 | NetworkName string | ||
178 | Network net.IPNet | ||
179 | Router net.IP | ||
180 | Path []int | ||
181 | Message string | ||
182 | }{ | ||
183 | {testDate, 64496, 1500, IPv4, "Testnet", parseCidr("192.0.2.0/24"), net.ParseIP("192.0.2.1"), []int{64496, 64497, 64497, 64497, 64499}, "AS64499 not member of IRR as-set object! Dropping."}, | ||
184 | {testDate, 64496, 1500, IPv4, "Testnet", parseCidr("198.51.100.0/24"), net.ParseIP("192.0.2.1"), []int{64496, 64497, 64498, 64498, 64499}, "matches pdb_never_via_route_servers_ASNs! Dropping."}, | ||
185 | {testDate, 64496, 1500, IPv4, "Testnet", parseCidr("192.0.2.0/26"), net.ParseIP("192.0.2.1"), []int{64496}, "RPKI ROA_INVALID! Dropping."}, | ||
186 | } | ||
187 | |||
188 | for i, tv := range v4t { | ||
189 | assert.EqualValues(t, tv, e.IPv4.Records[i]) | ||
190 | } | ||
191 | |||
192 | v6t := []struct { | ||
193 | Timestamp time.Time | ||
194 | ASN int | ||
195 | MTU int | ||
196 | Version IPVersion | ||
197 | NetworkName string | ||
198 | Network net.IPNet | ||
199 | Router net.IP | ||
200 | Path []int | ||
201 | Message string | ||
202 | }{ | ||
203 | {testDate, 64496, 1500, IPv6, "Testnet", parseCidr("2001:db8::/16"), net.ParseIP("2001:db8::1"), []int{}, "matches bogon_prefixes! Dropping."}, | ||
204 | {testDate, 64496, 1500, IPv6, "Testnet", parseCidr("2001:db8::/24"), net.ParseIP("2001:db8::1"), []int{64496, 64497, 64497, 64497, 64497, 64497, 64497, 64497, 64497, 64498}, "matches pdb_never_via_route_servers_ASNs! Dropping."}, | ||
205 | {testDate, 64496, 1500, IPv6, "Testnet", parseCidr("2001:db8::/32"), net.ParseIP("2001:db8::1"), []int{64496, 64497, 64498, 64498, 64499}, "AS64499 not member of IRR as-set object! Dropping."}, | ||
206 | } | ||
207 | |||
208 | for i, tv := range v6t { | ||
209 | assert.EqualValues(t, tv, e.IPv6.Records[i]) | ||
210 | } | ||
211 | |||
212 | v4jt := []struct { | ||
213 | Timestamp time.Time | ||
214 | ASN int | ||
215 | MTU int | ||
216 | Version IPVersion | ||
217 | NetworkName string | ||
218 | Network net.IPNet | ||
219 | Router net.IP | ||
220 | Path []int | ||
221 | Message string | ||
222 | }{ | ||
223 | {testDate, 64496, 9000, IPv4, "Testnet", parseCidr("192.0.2.0/24"), net.ParseIP("192.0.2.1"), []int{64496, 64498, 75757}, "matches bogon_ASNs! Dropping."}, | ||
224 | {testDate, 64496, 9000, IPv4, "Testnet", parseCidr("198.51.100.0/24"), net.ParseIP("192.0.2.1"), []int{}, "matches bogon_prefixes! Dropping."}, | ||
225 | } | ||
226 | |||
227 | for i, tv := range v4jt { | ||
228 | assert.EqualValues(t, tv, e.IPv4Jumbo.Records[i]) | ||
229 | } | ||
230 | |||
231 | badLinev4j := "2 20-02-12 19:43:23 <INFO> 64496:1:9000:v4:Testnet: 192.0.2.0/26 from 192.0.2.1: matches bogon_prefixes! Dropping." | ||
232 | assert.Equal(t, badLinev4j, e.IPv4Jumbo.UnparsableLines[0]) | ||
233 | |||
234 | v6jt := []struct { | ||
235 | Timestamp time.Time | ||
236 | ASN int | ||
237 | MTU int | ||
238 | Version IPVersion | ||
239 | NetworkName string | ||
240 | Network net.IPNet | ||
241 | Router net.IP | ||
242 | Path []int | ||
243 | Message string | ||
244 | }{ | ||
245 | {testDate, 64496, 9000, IPv6, "Testnet", parseCidr("2001:db8::/32"), net.ParseIP("2001:db8::1"), []int{64496, 64497, 64499}, "no IRR route object found! Transit_dropping."}, | ||
246 | {testDate, 64496, 9000, IPv6, "Testnet", parseCidr("2001:db8::/36"), net.ParseIP("2001:db8::1"), []int{64496, 64498, 64499}, "no IRR route object found! Transit_dropping."}, | ||
247 | {testDate, 64496, 9000, IPv6, "Testnet", parseCidr("2001:db8::/48"), net.ParseIP("2001:db8::1"), []int{64496, 64498, 64498, 64498, 64499}, "RPKI ROA_INVALID! Transit_dropping."}, | ||
248 | } | ||
249 | |||
250 | for i, tv := range v6jt { | ||
251 | assert.EqualValues(t, tv, e.IPv6Jumbo.Records[i]) | ||
252 | } | ||
253 | |||
254 | badLinev6j := "2 20-02-12 19:43:23 <INFO> 64496:1:9000:v6:Testnet: 2001:db8::/48 from 2001:db8::1 (path 64496 64498 64498 64498 64499): RPKI ROA_INVALID! Transit_dropping." | ||
255 | assert.Equal(t, badLinev6j, e.IPv6Jumbo.UnparsableLines[0]) | ||
256 | } | ||