11 "github.com/anacrolix/missinggo"
12 "github.com/bradfitz/iter"
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
18 // Note the shared description "eff". The overlapping ranges at 1.2.8.2
19 // will cause problems. Don't overlap your ranges.
21 # List distributed by iblocklist.com
26 something:more detail:86.59.95.195-86.59.95.195
27 eff:127.0.0.0-127.0.0.1`
33 list, err := NewFromReader(strings.NewReader(sample))
37 err = list.WritePacked(&buf)
41 packedSample = buf.Bytes()
44 func TestIPv4RangeLen(t *testing.T) {
45 ranges, _ := sampleRanges(t)
46 for i := range iter.N(3) {
47 if len(ranges[i].First) != 4 {
50 if len(ranges[i].Last) != 4 {
56 func sampleRanges(tb testing.TB) (ranges []Range, err error) {
57 scanner := bufio.NewScanner(strings.NewReader(sample))
59 r, ok, err := ParseBlocklistP2PLine(scanner.Bytes())
64 ranges = append(ranges, r)
71 func BenchmarkParseP2pBlocklist(b *testing.B) {
72 for i := 0; i < b.N; i++ {
77 func connRemoteAddrIP(network, laddr string, dialHost string) net.IP {
78 l, err := net.Listen(network, laddr)
83 c, err := net.Dial(network, net.JoinHostPort(dialHost, fmt.Sprintf("%d", missinggo.AddrPort(l.Addr()))))
94 ret := missinggo.AddrIP(c.RemoteAddr())
98 func TestBadIP(t *testing.T) {
99 for _, iplist := range []Ranger{
101 NewFromPacked([]byte("\x00\x00\x00\x00\x00\x00\x00\x00")),
103 assert.Nil(t, iplist.Lookup(net.IP(make([]byte, 4))), "%v", iplist)
104 assert.Nil(t, iplist.Lookup(net.IP(make([]byte, 16))))
105 assert.Equal(t, iplist.Lookup(nil).Description, "bad IP")
106 assert.NotNil(t, iplist.Lookup(net.IP(make([]byte, 5))))
110 func testLookuperSimple(t *testing.T, iplist Ranger) {
111 for _, _case := range []struct {
116 {"1.2.3.255", false, ""},
117 {"1.2.8.0", true, "b"},
118 {"1.2.4.255", true, "a"},
119 // Try to roll over to the next octet on the parse. Note the final
120 // octet is overbounds. In the next case.
121 {"1.2.7.256", true, "bad IP"},
122 {"1.2.8.1", true, "b"},
123 {"1.2.8.2", true, "eff"},
125 ip := net.ParseIP(_case.IP)
126 r := iplist.Lookup(ip)
129 t.Fatalf("got hit when none was expected: %s", ip)
134 t.Fatalf("expected hit for %q", _case.IP)
136 assert.Equal(t, _case.Desc, r.Description, "%T", iplist)
140 func TestSimple(t *testing.T) {
141 ranges, err := sampleRanges(t)
142 require.NoError(t, err)
143 require.Len(t, ranges, 5)
144 iplist := New(ranges)
145 testLookuperSimple(t, iplist)
146 packed := NewFromPacked(packedSample)
147 testLookuperSimple(t, packed)