]> Sergey Matveev's repositories - btrtrc.git/blob - iplist/iplist_test.go
Some utils moved to missinggo
[btrtrc.git] / iplist / iplist_test.go
1 package iplist
2
3 import (
4         "bufio"
5         "fmt"
6         "net"
7         "strings"
8         "testing"
9
10         "github.com/anacrolix/missinggo"
11         "github.com/bradfitz/iter"
12 )
13
14 var sample = `
15 # List distributed by iblocklist.com
16
17 a:1.2.4.0-1.2.4.255
18 b:1.2.8.0-1.2.8.255
19 something:more detail:86.59.95.195-86.59.95.195`
20
21 func TestIPv4RangeLen(t *testing.T) {
22         ranges, _ := sampleRanges(t)
23         for i := range iter.N(3) {
24                 if len(ranges[i].First) != 4 {
25                         t.FailNow()
26                 }
27                 if len(ranges[i].Last) != 4 {
28                         t.FailNow()
29                 }
30         }
31 }
32
33 func sampleRanges(tb testing.TB) (ranges []Range, err error) {
34         scanner := bufio.NewScanner(strings.NewReader(sample))
35         for scanner.Scan() {
36                 r, ok, err := ParseBlocklistP2PLine(scanner.Bytes())
37                 if err != nil {
38                         tb.Fatal(err)
39                 }
40                 if ok {
41                         ranges = append(ranges, r)
42                 }
43         }
44         err = scanner.Err()
45         return
46 }
47
48 func BenchmarkParseP2pBlocklist(b *testing.B) {
49         for i := 0; i < b.N; i++ {
50                 sampleRanges(b)
51         }
52 }
53
54 func connRemoteAddrIP(network, laddr string, dialHost string) net.IP {
55         l, err := net.Listen(network, laddr)
56         if err != nil {
57                 panic(err)
58         }
59         go func() {
60                 c, err := net.Dial(network, net.JoinHostPort(dialHost, fmt.Sprintf("%d", missinggo.AddrPort(l.Addr()))))
61                 if err != nil {
62                         panic(err)
63                 }
64                 defer c.Close()
65         }()
66         c, err := l.Accept()
67         if err != nil {
68                 panic(err)
69         }
70         defer c.Close()
71         ret := missinggo.AddrIP(c.RemoteAddr())
72         return ret
73 }
74
75 func TestBadIP(t *testing.T) {
76         iplist := New(nil)
77         if iplist.Lookup(net.IP(make([]byte, 4))) != nil {
78                 t.FailNow()
79         }
80         if iplist.Lookup(net.IP(make([]byte, 16))) != nil {
81                 t.FailNow()
82         }
83         if iplist.Lookup(nil) == nil {
84                 t.FailNow()
85         }
86         if iplist.Lookup(net.IP(make([]byte, 5))) == nil {
87                 t.FailNow()
88         }
89 }
90
91 func TestSimple(t *testing.T) {
92         ranges, err := sampleRanges(t)
93         if err != nil {
94                 t.Fatal(err)
95         }
96         if len(ranges) != 3 {
97                 t.Fatalf("expected 3 ranges but got %d", len(ranges))
98         }
99         iplist := New(ranges)
100         for _, _case := range []struct {
101                 IP   string
102                 Hit  bool
103                 Desc string
104         }{
105                 {"1.2.3.255", false, ""},
106                 {"1.2.8.0", true, "b"},
107                 {"1.2.4.255", true, "a"},
108                 // Try to roll over to the next octet on the parse. Note the final
109                 // octet is overbounds. In the next case.
110                 {"1.2.7.256", true, "unsupported IP: <nil>"},
111                 {"1.2.8.254", true, "b"},
112         } {
113                 ip := net.ParseIP(_case.IP)
114                 r := iplist.Lookup(ip)
115                 if !_case.Hit {
116                         if r != nil {
117                                 t.Fatalf("got hit when none was expected: %s", ip)
118                         }
119                         continue
120                 }
121                 if r == nil {
122                         t.Fatalf("expected hit for %q", _case.IP)
123                 }
124                 if r.Description != _case.Desc {
125                         t.Fatalf("%q != %q", r.Description, _case.Desc)
126                 }
127         }
128 }