network_test.go raw

   1  package addrmgr_test
   2  
   3  import (
   4  	"net"
   5  	"testing"
   6  	
   7  	"github.com/p9c/p9/pkg/addrmgr"
   8  	"github.com/p9c/p9/pkg/wire"
   9  )
  10  
  11  // TestIPTypes ensures the various functions which determine the type of an IP address based on RFCs work as intended.
  12  func TestIPTypes(t *testing.T) {
  13  	type ipTest struct {
  14  		in       wire.NetAddress
  15  		rfc1918  bool
  16  		rfc2544  bool
  17  		rfc3849  bool
  18  		rfc3927  bool
  19  		rfc3964  bool
  20  		rfc4193  bool
  21  		rfc4380  bool
  22  		rfc4843  bool
  23  		rfc4862  bool
  24  		rfc5737  bool
  25  		rfc6052  bool
  26  		rfc6145  bool
  27  		rfc6598  bool
  28  		local    bool
  29  		valid    bool
  30  		routable bool
  31  	}
  32  	newIPTest := func(ip string, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964,
  33  		rfc4193, rfc4380, rfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598,
  34  		local, valid, routable bool,
  35  	) ipTest {
  36  		nip := net.ParseIP(ip)
  37  		na := *wire.NewNetAddressIPPort(nip, 11047, wire.SFNodeNetwork)
  38  		test := ipTest{na, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964, rfc4193, rfc4380,
  39  			rfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598, local, valid, routable,
  40  		}
  41  		return test
  42  	}
  43  	tests := []ipTest{
  44  		newIPTest("10.255.255.255", true, false, false, false, false, false,
  45  			false, false, false, false, false, false, false, false, true, false,
  46  		),
  47  		newIPTest("192.168.0.1", true, false, false, false, false, false,
  48  			false, false, false, false, false, false, false, false, true, false,
  49  		),
  50  		newIPTest("172.31.255.1", true, false, false, false, false, false,
  51  			false, false, false, false, false, false, false, false, true, false,
  52  		),
  53  		newIPTest("172.32.1.1", false, false, false, false, false, false, false, false,
  54  			false, false, false, false, false, false, true, true,
  55  		),
  56  		newIPTest("169.254.250.120", false, false, false, true, false, false,
  57  			false, false, false, false, false, false, false, false, true, false,
  58  		),
  59  		newIPTest("0.0.0.0", false, false, false, false, false, false, false,
  60  			false, false, false, false, false, false, true, false, false,
  61  		),
  62  		newIPTest("255.255.255.255", false, false, false, false, false, false,
  63  			false, false, false, false, false, false, false, false, false, false,
  64  		),
  65  		newIPTest("127.0.0.1", false, false, false, false, false, false,
  66  			false, false, false, false, false, false, false, true, true, false,
  67  		),
  68  		newIPTest("fd00:dead::1", false, false, false, false, false, true,
  69  			false, false, false, false, false, false, false, false, true, false,
  70  		),
  71  		newIPTest("2001::1", false, false, false, false, false, false,
  72  			true, false, false, false, false, false, false, false, true, true,
  73  		),
  74  		newIPTest("2001:10:abcd::1:1", false, false, false, false, false, false,
  75  			false, true, false, false, false, false, false, false, true, false,
  76  		),
  77  		newIPTest("fe80::1", false, false, false, false, false, false,
  78  			false, false, true, false, false, false, false, false, true, false,
  79  		),
  80  		newIPTest("fe80:1::1", false, false, false, false, false, false,
  81  			false, false, false, false, false, false, false, false, true, true,
  82  		),
  83  		newIPTest("64:ff9b::1", false, false, false, false, false, false,
  84  			false, false, false, false, true, false, false, false, true, true,
  85  		),
  86  		newIPTest("::ffff:abcd:ef12:1", false, false, false, false, false, false,
  87  			false, false, false, false, false, false, false, false, true, true,
  88  		),
  89  		newIPTest("::1", false, false, false, false, false, false, false, false,
  90  			false, false, false, false, false, true, true, false,
  91  		),
  92  		newIPTest("198.18.0.1", false, true, false, false, false, false, false,
  93  			false, false, false, false, false, false, false, true, false,
  94  		),
  95  		newIPTest("100.127.255.1", false, false, false, false, false, false, false,
  96  			false, false, false, false, false, true, false, true, false,
  97  		),
  98  		newIPTest("203.0.113.1", false, false, false, false, false, false, false,
  99  			false, false, false, false, false, false, false, true, false,
 100  		),
 101  	}
 102  	t.Logf("Running %d tests", len(tests))
 103  	for _, test := range tests {
 104  		if rv := addrmgr.IsRFC1918(&test.in); rv != test.rfc1918 {
 105  			t.Errorf("IsRFC1918 %s\n got: %v want: %v", test.in.IP, rv, test.rfc1918)
 106  		}
 107  		if rv := addrmgr.IsRFC3849(&test.in); rv != test.rfc3849 {
 108  			t.Errorf("IsRFC3849 %s\n got: %v want: %v", test.in.IP, rv, test.rfc3849)
 109  		}
 110  		if rv := addrmgr.IsRFC3927(&test.in); rv != test.rfc3927 {
 111  			t.Errorf("IsRFC3927 %s\n got: %v want: %v", test.in.IP, rv, test.rfc3927)
 112  		}
 113  		if rv := addrmgr.IsRFC3964(&test.in); rv != test.rfc3964 {
 114  			t.Errorf("IsRFC3964 %s\n got: %v want: %v", test.in.IP, rv, test.rfc3964)
 115  		}
 116  		if rv := addrmgr.IsRFC4193(&test.in); rv != test.rfc4193 {
 117  			t.Errorf("IsRFC4193 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4193)
 118  		}
 119  		if rv := addrmgr.IsRFC4380(&test.in); rv != test.rfc4380 {
 120  			t.Errorf("IsRFC4380 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4380)
 121  		}
 122  		if rv := addrmgr.IsRFC4843(&test.in); rv != test.rfc4843 {
 123  			t.Errorf("IsRFC4843 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4843)
 124  		}
 125  		if rv := addrmgr.IsRFC4862(&test.in); rv != test.rfc4862 {
 126  			t.Errorf("IsRFC4862 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4862)
 127  		}
 128  		if rv := addrmgr.IsRFC6052(&test.in); rv != test.rfc6052 {
 129  			t.Errorf("isRFC6052 %s\n got: %v want: %v", test.in.IP, rv, test.rfc6052)
 130  		}
 131  		if rv := addrmgr.IsRFC6145(&test.in); rv != test.rfc6145 {
 132  			t.Errorf("IsRFC1918 %s\n got: %v want: %v", test.in.IP, rv, test.rfc6145)
 133  		}
 134  		if rv := addrmgr.IsLocal(&test.in); rv != test.local {
 135  			t.Errorf("IsLocal %s\n got: %v want: %v", test.in.IP, rv, test.local)
 136  		}
 137  		if rv := addrmgr.IsValid(&test.in); rv != test.valid {
 138  			t.Errorf("IsValid %s\n got: %v want: %v", test.in.IP, rv, test.valid)
 139  		}
 140  		if rv := addrmgr.IsRoutable(&test.in); rv != test.routable {
 141  			t.Errorf("IsRoutable %s\n got: %v want: %v", test.in.IP, rv, test.routable)
 142  		}
 143  	}
 144  }
 145  
 146  // TestGroupKey tests the GroupKey function to ensure it properly groups various IP addresses.
 147  func TestGroupKey(t *testing.T) {
 148  	tests := []struct {
 149  		name     string
 150  		ip       string
 151  		expected string
 152  	}{
 153  		// Local addresses.
 154  		{name: "ipv4 localhost", ip: "127.0.0.1", expected: "local"},
 155  		{name: "ipv6 localhost", ip: "::1", expected: "local"},
 156  		{name: "ipv4 zero", ip: "0.0.0.0", expected: "local"},
 157  		{name: "ipv4 first octet zero", ip: "0.1.2.3", expected: "local"},
 158  		// Unroutable addresses.
 159  		{name: "ipv4 invalid bcast", ip: "255.255.255.255", expected: "unroutable"},
 160  		{name: "ipv4 rfc1918 10/8", ip: "10.1.2.3", expected: "unroutable"},
 161  		{name: "ipv4 rfc1918 172.16/12", ip: "172.16.1.2", expected: "unroutable"},
 162  		{name: "ipv4 rfc1918 192.168/16", ip: "192.168.1.2", expected: "unroutable"},
 163  		{name: "ipv6 rfc3849 2001:db8::/32", ip: "2001:db8::1234", expected: "unroutable"},
 164  		{name: "ipv4 rfc3927 169.254/16", ip: "169.254.1.2", expected: "unroutable"},
 165  		{name: "ipv6 rfc4193 fc00::/7", ip: "fc00::1234", expected: "unroutable"},
 166  		{name: "ipv6 rfc4843 2001:10::/28", ip: "2001:10::1234", expected: "unroutable"},
 167  		{name: "ipv6 rfc4862 fe80::/64", ip: "fe80::1234", expected: "unroutable"},
 168  		// IPv4 normal.
 169  		{name: "ipv4 normal class a", ip: "12.1.2.3", expected: "12.1.0.0"},
 170  		{name: "ipv4 normal class b", ip: "173.1.2.3", expected: "173.1.0.0"},
 171  		{name: "ipv4 normal class c", ip: "196.1.2.3", expected: "196.1.0.0"},
 172  		// IPv6/IPv4 translations.
 173  		{name: "ipv6 rfc3964 with ipv4 encap", ip: "2002:0c01:0203::", expected: "12.1.0.0"},
 174  		{name: "ipv6 rfc4380 toredo ipv4", ip: "2001:0:1234::f3fe:fdfc", expected: "12.1.0.0"},
 175  		{name: "ipv6 rfc6052 well-known prefix with ipv4", ip: "64:ff9b::0c01:0203", expected: "12.1.0.0"},
 176  		{name: "ipv6 rfc6145 translated ipv4", ip: "::ffff:0:0c01:0203", expected: "12.1.0.0"},
 177  		// Tor.
 178  		{name: "ipv6 tor onioncat", ip: "fd87:d87e:eb43:1234::5678", expected: "tor:2"},
 179  		{name: "ipv6 tor onioncat 2", ip: "fd87:d87e:eb43:1245::6789", expected: "tor:2"},
 180  		{name: "ipv6 tor onioncat 3", ip: "fd87:d87e:eb43:1345::6789", expected: "tor:3"},
 181  		// IPv6 normal.
 182  		{name: "ipv6 normal", ip: "2602:100::1", expected: "2602:100::"},
 183  		{name: "ipv6 normal 2", ip: "2602:0100::1234", expected: "2602:100::"},
 184  		{name: "ipv6 hurricane electric", ip: "2001:470:1f10:a1::2", expected: "2001:470:1000::"},
 185  		{name: "ipv6 hurricane electric 2", ip: "2001:0470:1f10:a1::2", expected: "2001:470:1000::"},
 186  	}
 187  	for i, test := range tests {
 188  		nip := net.ParseIP(test.ip)
 189  		na := *wire.NewNetAddressIPPort(nip, 11047, wire.SFNodeNetwork)
 190  		if key := addrmgr.GroupKey(&na); key != test.expected {
 191  			t.Errorf("TestGroupKey #%d (%s): unexpected group key "+
 192  				"- got '%s', want '%s'", i, test.name,
 193  				key, test.expected,
 194  			)
 195  		}
 196  	}
 197  }
 198