Skip to content

Commit

Permalink
aghnet: imp tests
Browse files Browse the repository at this point in the history
  • Loading branch information
EugeneOne1 committed Jan 21, 2022
1 parent 8bb3e2a commit 368e75b
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 109 deletions.
115 changes: 52 additions & 63 deletions internal/aghnet/hostscontainer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,123 +343,94 @@ func TestHostsContainer(t *testing.T) {

testdata := os.DirFS("./testdata")

nRewrites := func(t *testing.T, res *urlfilter.DNSResult, n int) (rws []*rules.DNSRewrite) {
require.NotNil(t, res)

rewrites := res.DNSRewrites()
require.Len(t, rewrites, n)

for _, rewrite := range rewrites {
require.Equal(t, listID, rewrite.FilterListID)

rw := rewrite.DNSRewrite
require.NotNil(t, rw)

rws = append(rws, rw)
}

return rws
}

testCases := []struct {
testTail func(t *testing.T, res *urlfilter.DNSResult)
name string
req urlfilter.DNSRequest
want []*rules.DNSRewrite
name string
req urlfilter.DNSRequest
}{{
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
Value: net.IPv4(1, 0, 0, 1),
RRType: dns.TypeA,
}, {
RCode: dns.RcodeSuccess,
Value: net.IP(append((&[15]byte{})[:], byte(1))),
RRType: dns.TypeAAAA,
}},
name: "simple",
req: urlfilter.DNSRequest{
Hostname: "simplehost",
DNSType: dns.TypeA,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
rws := nRewrites(t, res, 2)

v, ok := rws[0].Value.(net.IP)
require.True(t, ok)

assert.True(t, net.IP{1, 0, 0, 1}.Equal(v))

v, ok = rws[1].Value.(net.IP)
require.True(t, ok)

// It's ::1.
assert.True(t, net.IP(append((&[15]byte{})[:], byte(1))).Equal(v))
},
}, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
NewCNAME: "hello",
}},
name: "hello_alias",
req: urlfilter.DNSRequest{
Hostname: "hello.world",
DNSType: dns.TypeA,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Equal(t, "hello", nRewrites(t, res, 1)[0].NewCNAME)
},
}, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
NewCNAME: "hello",
}},
name: "other_line_alias",
req: urlfilter.DNSRequest{
Hostname: "hello.world.again",
DNSType: dns.TypeA,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Equal(t, "hello", nRewrites(t, res, 1)[0].NewCNAME)
},
}, {
want: []*rules.DNSRewrite{},
name: "hello_subdomain",
req: urlfilter.DNSRequest{
Hostname: "say.hello",
DNSType: dns.TypeA,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
nRewrites(t, res, 0)
},
}, {
want: []*rules.DNSRewrite{},
name: "hello_alias_subdomain",
req: urlfilter.DNSRequest{
Hostname: "say.hello.world",
DNSType: dns.TypeA,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
nRewrites(t, res, 0)
},
}, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
NewCNAME: "a.whole",
}},
name: "lots_of_aliases",
req: urlfilter.DNSRequest{
Hostname: "for.testing",
DNSType: dns.TypeA,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Equal(t, "a.whole", nRewrites(t, res, 1)[0].NewCNAME)
},
}, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
RRType: dns.TypePTR,
Value: "simplehost.",
}},
name: "reverse",
req: urlfilter.DNSRequest{
Hostname: "1.0.0.1.in-addr.arpa",
DNSType: dns.TypePTR,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
rw := nRewrites(t, res, 1)[0]

assert.Equal(t, dns.TypePTR, rw.RRType)
assert.Equal(t, "simplehost.", rw.Value)
},
}, {
want: []*rules.DNSRewrite{},
name: "non-existing",
req: urlfilter.DNSRequest{
Hostname: "nonexisting",
DNSType: dns.TypeA,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
nRewrites(t, res, 0)
},
}, {
want: nil,
name: "bad_type",
req: urlfilter.DNSRequest{
Hostname: "1.0.0.1.in-addr.arpa",
DNSType: dns.TypeSRV,
},
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Nil(t, res)
},
}}

stubWatcher := aghtest.FSWatcher{
Expand All @@ -476,7 +447,25 @@ func TestHostsContainer(t *testing.T) {
res, ok := hc.MatchRequest(tc.req)
require.False(t, ok)

tc.testTail(t, res)
if tc.want == nil {
assert.Nil(t, res)

return
}

require.NotNil(t, res)

rewrites := res.DNSRewrites()
require.Len(t, rewrites, len(tc.want))

for i, rewrite := range rewrites {
require.Equal(t, listID, rewrite.FilterListID)

rw := rewrite.DNSRewrite
require.NotNil(t, rw)

assert.Equal(t, tc.want[i], rw)
}
})
}
}
Expand Down
3 changes: 2 additions & 1 deletion internal/aghnet/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ func IfaceIPAddrs(iface NetIface, ipv IPVersion) (ips []net.IP, err error) {
// Assume that net.(*Interface).Addrs can only return valid IPv4 and
// IPv6 addresses. Thus, if it isn't an IPv4 address, it must be an
// IPv6 one.
if ip4 := ip.To4(); ipv == IPVersion4 {
ip4 := ip.To4()
if ipv == IPVersion4 {
if ip4 != nil {
ips = append(ips, ip4)
}
Expand Down
5 changes: 3 additions & 2 deletions internal/aghnet/interfaces_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ func TestIfaceIPAddrs(t *testing.T) {
}

type waitingFakeIface struct {
addrs []net.Addr
err error
addrs []net.Addr
n int
}

Expand Down Expand Up @@ -213,7 +213,8 @@ func TestIfaceDNSIPAddrs(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
got, err := IfaceDNSIPAddrs(tc.iface, tc.ipv, 2, 0)
require.True(t, errors.Is(err, tc.wantErr))
require.ErrorIs(t, err, tc.wantErr)

assert.Equal(t, tc.want, got)
})
}
Expand Down
4 changes: 2 additions & 2 deletions internal/aghnet/ipmut_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func TestIPMut(t *testing.T) {
8, 8, 8, 8,
}}

t.Run("nil", func(t *testing.T) {
t.Run("nil_no_mut", func(t *testing.T) {
ipmut := NewIPMut(nil)

ips := netutil.CloneIPs(testIPs)
Expand All @@ -27,7 +27,7 @@ func TestIPMut(t *testing.T) {
}
})

t.Run("not_nil", func(t *testing.T) {
t.Run("not_nil_mut", func(t *testing.T) {
ipmut := NewIPMut(func(ip net.IP) {
for i := range ip {
ip[i] = 0
Expand Down
84 changes: 43 additions & 41 deletions internal/aghnet/net_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,45 +81,47 @@ func TestBroadcastFromIPNet(t *testing.T) {
}

func TestCheckPort(t *testing.T) {
testCases := []struct {
listenFunc func(t *testing.T) (addr net.Addr, proto string)
name string
}{{
listenFunc: func(t *testing.T) (addr net.Addr, proto string) {
proto = "tcp"
l, err := net.Listen(proto, "127.0.0.1:")
require.NoError(t, err)
testutil.CleanupAndRequireSuccess(t, l.Close)

return l.Addr(), proto
},
name: "tcp_bound",
}, {
listenFunc: func(t *testing.T) (addr net.Addr, proto string) {
proto = "udp"
l, err := net.ListenPacket(proto, "127.0.0.1:")
require.NoError(t, err)
testutil.CleanupAndRequireSuccess(t, l.Close)

return l.LocalAddr(), proto
},
name: "udp_bound",
}}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
addr, proto := tc.listenFunc(t)

ipp := netutil.IPPortFromAddr(addr)
require.NotNil(t, ipp)
require.NotNil(t, ipp.IP)
require.NotZero(t, ipp.Port)

err := CheckPort(proto, ipp.IP, ipp.Port)
target := &net.OpError{}
require.ErrorAs(t, err, &target)

assert.Equal(t, "listen", target.Op)
})
}
t.Run("tcp_bound", func(t *testing.T) {
l, err := net.Listen("tcp", "127.0.0.1:")
require.NoError(t, err)
testutil.CleanupAndRequireSuccess(t, l.Close)

ipp := netutil.IPPortFromAddr(l.Addr())
require.NotNil(t, ipp)
require.NotNil(t, ipp.IP)
require.NotZero(t, ipp.Port)

err = CheckPort("tcp", ipp.IP, ipp.Port)
target := &net.OpError{}
require.ErrorAs(t, err, &target)

assert.Equal(t, "listen", target.Op)
})

t.Run("udp_bound", func(t *testing.T) {
conn, err := net.ListenPacket("udp", "127.0.0.1:")
require.NoError(t, err)
testutil.CleanupAndRequireSuccess(t, conn.Close)

ipp := netutil.IPPortFromAddr(conn.LocalAddr())
require.NotNil(t, ipp)
require.NotNil(t, ipp.IP)
require.NotZero(t, ipp.Port)

err = CheckPort("udp", ipp.IP, ipp.Port)
target := &net.OpError{}
require.ErrorAs(t, err, &target)

assert.Equal(t, "listen", target.Op)
})

t.Run("bad_network", func(t *testing.T) {
err := CheckPort("bad_network", nil, 0)
assert.NoError(t, err)
})

t.Run("can_bind", func(t *testing.T) {
err := CheckPort("udp", net.IP{0, 0, 0, 0}, 0)
assert.NoError(t, err)
})
}

0 comments on commit 368e75b

Please sign in to comment.