aboutsummaryrefslogtreecommitdiff
path: root/six/info_file_parser_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'six/info_file_parser_test.go')
-rw-r--r--six/info_file_parser_test.go256
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
7package six
8
9import (
10 "net"
11 "strings"
12 "testing"
13 "time"
14
15 "github.com/stretchr/testify/assert"
16)
17
18var testDate = time.Date(2020, 02, 12, 19, 43, 23, 0, time.UTC)
19
20const roaTest = `
21Timestamp: 2020-02-12 19:43:23 UTC
22Trust 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
29func parseCidr(c string) net.IPNet {
30 _, n, _ := net.ParseCIDR(c)
31 return *n
32}
33
34func 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
56const prefixListv4 = `
57Timestamp: 2020-02-12 19:43:23 UTC
58192.0.2.0/24
59198.51.100.0/24
60`
61
62func 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
70const prefixListv6 = `
71Timestamp: 2020-02-12 19:43:23 UTC
722001:db8:3a80::/48
732001:db8:3a81::/48
74`
75
76func 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
84const asPrefixListv4 = `
85as-set: AS-TEST
86Timestamp: 2020-02-12 19:43:23 UTC
87192.0.2.0/24
88198.51.100.0/24
89198.51.100.0/24,
90`
91
92func 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
102const asPrefixListv6 = `
103as-set: AS-TEST
104Timestamp: 2020-02-12 19:43:23 UTC
1052001:db8:3a80::/48
1062001:db8:3a81::/48
1072001:db8:3a81::/48,
108`
109
110func 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
120const asSetFile = `
121as-set: AS-TEST
122Timestamp: 2020-02-12 19:43:23 UTC
12364496
12464497
12564498
126`
127
128func 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
138const errorFilev4 = `
1392020-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.
1402020-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.
1412020-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
144const errorFilev6 = `
1452020-02-12 19:43:23 <INFO> 64496:1:1500:v6:Testnet: 2001:db8::/16 from 2001:db8::1: matches bogon_prefixes! Dropping.
1462020-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.
1472020-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
151const errorFilev4j = `
1522020-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.
1532020-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.
1542 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
158const errorFilev6j = `
1592020-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.
1602020-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.
1612020-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.
1622 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
165func 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}