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