// SPDX-License-Identifier: GPL-2.0-only // Copyright (C) 2020 Michael Crute . All rights reserved. // // Use of this source code is governed by a license that can be found in the // LICENSE file. package six import ( "net" "strings" "testing" "time" "github.com/stretchr/testify/assert" ) var testDate = time.Date(2020, 02, 12, 19, 43, 23, 0, time.UTC) const roaTest = ` Timestamp: 2020-02-12 19:43:23 UTC Trust Anchor | ASN | Max Length | Prefix APNIC | 64496 | 24 | 192.0.2.0/24 RIPE | 64496 | 24 | 198.51.100.0/24 RIPE | 64496 | 48 | 2001:db8:3a80::/48 APNIC | 64496 | 48 | 2001:db8:3a81::/48 ` func parseCidr(c string) net.IPNet { _, n, _ := net.ParseCIDR(c) return *n } func TestROAParsing(t *testing.T) { rs := parseROAFile(strings.Split(roaTest, "\n")) matrix := []struct { TrustAnchor string ASN int MaxLength int Prefix net.IPNet }{ {"APNIC", 64496, 24, parseCidr("192.0.2.0/24")}, {"RIPE", 64496, 24, parseCidr("198.51.100.0/24")}, {"RIPE", 64496, 48, parseCidr("2001:db8:3a80::/48")}, {"APNIC", 64496, 48, parseCidr("2001:db8:3a81::/48")}, } for i, tv := range matrix { assert.EqualValues(t, tv, rs.ROAS[i]) } assert.Equal(t, rs.Timestamp, testDate) } const prefixListv4 = ` Timestamp: 2020-02-12 19:43:23 UTC 192.0.2.0/24 198.51.100.0/24 ` func TestPrefixSetv4Parsing(t *testing.T) { r := parsePrefixSetFile(strings.Split(prefixListv4, "\n")) assert.Equal(t, r.Timestamp, testDate) assert.Equal(t, r.Prefixes[0], parseCidr("192.0.2.0/24")) assert.Equal(t, r.Prefixes[1], parseCidr("198.51.100.0/24")) } const prefixListv6 = ` Timestamp: 2020-02-12 19:43:23 UTC 2001:db8:3a80::/48 2001:db8:3a81::/48 ` func TestPrefixSetv6Parsing(t *testing.T) { r := parsePrefixSetFile(strings.Split(prefixListv6, "\n")) assert.Equal(t, r.Timestamp, testDate) assert.Equal(t, r.Prefixes[0], parseCidr("2001:db8:3a80::/48")) assert.Equal(t, r.Prefixes[1], parseCidr("2001:db8:3a81::/48")) } const asPrefixListv4 = ` as-set: AS-TEST Timestamp: 2020-02-12 19:43:23 UTC 192.0.2.0/24 198.51.100.0/24 198.51.100.0/24, ` func TestPrefixSetASNv4Parsing(t *testing.T) { r := parsePrefixSetFile(strings.Split(asPrefixListv4, "\n")) assert.Equal(t, r.Timestamp, testDate) assert.Equal(t, *r.ASSet, "AS-TEST") assert.Equal(t, r.Prefixes[0], parseCidr("192.0.2.0/24")) assert.Equal(t, r.Prefixes[1], parseCidr("198.51.100.0/24")) assert.Equal(t, r.Prefixes[2], parseCidr("198.51.100.0/24")) } const asPrefixListv6 = ` as-set: AS-TEST Timestamp: 2020-02-12 19:43:23 UTC 2001:db8:3a80::/48 2001:db8:3a81::/48 2001:db8:3a81::/48, ` func TestPrefixSetASNv6Parsing(t *testing.T) { r := parsePrefixSetFile(strings.Split(asPrefixListv6, "\n")) assert.Equal(t, r.Timestamp, testDate) assert.Equal(t, *r.ASSet, "AS-TEST") assert.Equal(t, r.Prefixes[0], parseCidr("2001:db8:3a80::/48")) assert.Equal(t, r.Prefixes[1], parseCidr("2001:db8:3a81::/48")) assert.Equal(t, r.Prefixes[2], parseCidr("2001:db8:3a81::/48")) } const asSetFile = ` as-set: AS-TEST Timestamp: 2020-02-12 19:43:23 UTC 64496 64497 64498 ` func TestASSetParsing(t *testing.T) { r := parseASSetFile(strings.Split(asSetFile, "\n")) assert.Equal(t, r.Timestamp, testDate) assert.Equal(t, r.Name, "AS-TEST") assert.Equal(t, r.ASNumbers[0], 64496) assert.Equal(t, r.ASNumbers[1], 64497) assert.Equal(t, r.ASNumbers[2], 64498) } const errorFilev4 = ` 2020-02-12 19:43:23 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. 2020-02-12 19:43:23 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. 2020-02-12 19:43:23 64496:1:1500:v4:Testnet: 192.0.2.0/26 from 192.0.2.1 (path 64496): RPKI ROA_INVALID! Dropping. ` const errorFilev6 = ` 2020-02-12 19:43:23 64496:1:1500:v6:Testnet: 2001:db8::/16 from 2001:db8::1: matches bogon_prefixes! Dropping. 2020-02-12 19:43:23 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. 2020-02-12 19:43:23 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. ` // Last line intentionally not parsable const errorFilev4j = ` 2020-02-12 19:43:23 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. 2020-02-12 19:43:23 64496:1:9000:v4:Testnet: 198.51.100.0/24 from 192.0.2.1: matches bogon_prefixes! Dropping. 2 20-02-12 19:43:23 64496:1:9000:v4:Testnet: 192.0.2.0/26 from 192.0.2.1: matches bogon_prefixes! Dropping. ` // Last line intentionally not parsable const errorFilev6j = ` 2020-02-12 19:43:23 64496:1:9000:v6:Testnet: 2001:db8::/32 from 2001:db8::1 (path 64496 64497 64499): no IRR route object found! Transit_dropping. 2020-02-12 19:43:23 64496:1:9000:v6:Testnet: 2001:db8::/36 from 2001:db8::1 (path 64496 64498 64499): no IRR route object found! Transit_dropping. 2020-02-12 19:43:23 64496:1:9000:v6:Testnet: 2001:db8::/48 from 2001:db8::1 (path 64496 64498 64498 64498 64499): RPKI ROA_INVALID! Transit_dropping. 2 20-02-12 19:43:23 64496:1:9000:v6:Testnet: 2001:db8::/48 from 2001:db8::1 (path 64496 64498 64498 64498 64499): RPKI ROA_INVALID! Transit_dropping. ` func TestParsingErrorFile(t *testing.T) { e := parseErrorFiles( strings.Split(errorFilev4, "\n"), strings.Split(errorFilev6, "\n"), strings.Split(errorFilev4j, "\n"), strings.Split(errorFilev6j, "\n")) v4t := []struct { Timestamp time.Time ASN int MTU int Version IPVersion NetworkName string Network net.IPNet Router net.IP Path []int Message string }{ {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."}, {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."}, {testDate, 64496, 1500, IPv4, "Testnet", parseCidr("192.0.2.0/26"), net.ParseIP("192.0.2.1"), []int{64496}, "RPKI ROA_INVALID! Dropping."}, } for i, tv := range v4t { assert.EqualValues(t, tv, e.IPv4.Records[i]) } v6t := []struct { Timestamp time.Time ASN int MTU int Version IPVersion NetworkName string Network net.IPNet Router net.IP Path []int Message string }{ {testDate, 64496, 1500, IPv6, "Testnet", parseCidr("2001:db8::/16"), net.ParseIP("2001:db8::1"), []int{}, "matches bogon_prefixes! Dropping."}, {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."}, {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."}, } for i, tv := range v6t { assert.EqualValues(t, tv, e.IPv6.Records[i]) } v4jt := []struct { Timestamp time.Time ASN int MTU int Version IPVersion NetworkName string Network net.IPNet Router net.IP Path []int Message string }{ {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."}, {testDate, 64496, 9000, IPv4, "Testnet", parseCidr("198.51.100.0/24"), net.ParseIP("192.0.2.1"), []int{}, "matches bogon_prefixes! Dropping."}, } for i, tv := range v4jt { assert.EqualValues(t, tv, e.IPv4Jumbo.Records[i]) } badLinev4j := "2 20-02-12 19:43:23 64496:1:9000:v4:Testnet: 192.0.2.0/26 from 192.0.2.1: matches bogon_prefixes! Dropping." assert.Equal(t, badLinev4j, e.IPv4Jumbo.UnparsableLines[0]) v6jt := []struct { Timestamp time.Time ASN int MTU int Version IPVersion NetworkName string Network net.IPNet Router net.IP Path []int Message string }{ {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."}, {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."}, {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."}, } for i, tv := range v6jt { assert.EqualValues(t, tv, e.IPv6Jumbo.Records[i]) } badLinev6j := "2 20-02-12 19:43:23 64496:1:9000:v6:Testnet: 2001:db8::/48 from 2001:db8::1 (path 64496 64498 64498 64498 64499): RPKI ROA_INVALID! Transit_dropping." assert.Equal(t, badLinev6j, e.IPv6Jumbo.UnparsableLines[0]) }