]> Sergey Matveev's repositories - btrtrc.git/blob - iplist/iplist_test.go
iplist: Fix ranges that contain extra colons, and minimize memory use for IP
[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         "bitbucket.org/anacrolix/go.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 TestSimple(t *testing.T) {
77         ranges, err := sampleRanges(t)
78         if err != nil {
79                 t.Fatal(err)
80         }
81         if len(ranges) != 3 {
82                 t.Fatalf("expected 3 ranges but got %d", len(ranges))
83         }
84         iplist := New(ranges)
85         for _, _case := range []struct {
86                 IP   string
87                 Hit  bool
88                 Desc string
89         }{
90                 {"1.2.3.255", false, ""},
91                 {"1.2.8.0", true, "b"},
92                 {"1.2.4.255", true, "a"},
93                 // Try to roll over to the next octet on the parse.
94                 {"1.2.7.256", false, ""},
95                 {"1.2.8.254", true, "b"},
96         } {
97                 r := iplist.Lookup(net.ParseIP(_case.IP))
98                 if !_case.Hit {
99                         if r != nil {
100                                 t.Fatalf("got hit when none was expected")
101                         }
102                         continue
103                 }
104                 if r == nil {
105                         t.Fatalf("expected hit for %q", _case.IP)
106                 }
107                 if r.Description != _case.Desc {
108                         t.Fatalf("%q != %q", r.Description, _case.Desc)
109                 }
110         }
111 }