ooni-probe-cli/internal/netxlite/bogon_test.go

209 lines
4.7 KiB
Go
Raw Normal View History

package netxlite
import (
"context"
"errors"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/ooni/probe-cli/v3/internal/model/mocks"
)
func TestMaybeWrapWithBogonResolver(t *testing.T) {
t.Run("with enabled equal to true", func(t *testing.T) {
underlying := &mocks.Resolver{}
reso := MaybeWrapWithBogonResolver(true, underlying)
bogoreso := reso.(*bogonResolver)
if bogoreso.Resolver != underlying {
t.Fatal("did not wrap")
}
})
t.Run("with enabled equal to false", func(t *testing.T) {
underlying := &mocks.Resolver{}
reso := MaybeWrapWithBogonResolver(false, underlying)
if reso != underlying {
t.Fatal("expected unmodified resolver")
}
})
}
func TestBogonResolver(t *testing.T) {
t.Run("LookupHost", func(t *testing.T) {
t.Run("with failure", func(t *testing.T) {
expected := errors.New("mocked")
reso := &bogonResolver{
Resolver: &mocks.Resolver{
MockLookupHost: func(ctx context.Context, domain string) ([]string, error) {
return nil, expected
},
},
}
ctx := context.Background()
addrs, err := reso.LookupHost(ctx, "dns.google")
if !errors.Is(err, expected) {
t.Fatal("unexpected err", err)
}
if len(addrs) > 0 {
t.Fatal("expected no addrs")
}
})
t.Run("with success and no bogon", func(t *testing.T) {
expected := []string{"8.8.8.8", "149.112.112.112"}
reso := &bogonResolver{
Resolver: &mocks.Resolver{
MockLookupHost: func(ctx context.Context, domain string) ([]string, error) {
return expected, nil
},
},
}
ctx := context.Background()
addrs, err := reso.LookupHost(ctx, "dns.google")
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(expected, addrs); diff != "" {
t.Fatal(diff)
}
})
t.Run("with success and bogon", func(t *testing.T) {
reso := &bogonResolver{
Resolver: &mocks.Resolver{
MockLookupHost: func(ctx context.Context, domain string) ([]string, error) {
return []string{"8.8.8.8", "10.34.34.35", "149.112.112.112"}, nil
},
},
}
ctx := context.Background()
addrs, err := reso.LookupHost(ctx, "dns.google")
if !errors.Is(err, ErrDNSBogon) {
t.Fatal("unexpected err", err)
}
var ew *ErrWrapper
if !errors.As(err, &ew) {
t.Fatal("error has not been wrapped")
}
if len(addrs) > 0 {
t.Fatal("expected no addrs")
}
})
})
t.Run("LookupHTTPS", func(t *testing.T) {
ctx := context.Background()
reso := &bogonResolver{}
https, err := reso.LookupHTTPS(ctx, "dns.google")
if !errors.Is(err, ErrNoDNSTransport) {
t.Fatal("unexpected err", err)
}
if https != nil {
t.Fatal("expected nil https here")
}
})
t.Run("LookupNS", func(t *testing.T) {
ctx := context.Background()
reso := &bogonResolver{}
ns, err := reso.LookupNS(ctx, "dns.google")
if !errors.Is(err, ErrNoDNSTransport) {
t.Fatal("unexpected err", err)
}
if len(ns) > 0 {
t.Fatal("expected empty ns here")
}
})
t.Run("Network", func(t *testing.T) {
expected := "antani"
reso := &bogonResolver{
Resolver: &mocks.Resolver{
MockNetwork: func() string {
return expected
},
},
}
if reso.Network() != expected {
t.Fatal("unexpected network")
}
})
t.Run("Address", func(t *testing.T) {
expected := "antani"
reso := &bogonResolver{
Resolver: &mocks.Resolver{
MockAddress: func() string {
return expected
},
},
}
if reso.Address() != expected {
t.Fatal("unexpected address")
}
})
t.Run("CloseIdleConnections", func(t *testing.T) {
var called bool
reso := &bogonResolver{
Resolver: &mocks.Resolver{
MockCloseIdleConnections: func() {
called = true
},
},
}
reso.CloseIdleConnections()
if !called {
t.Fatal("not called")
}
})
}
func TestIsBogon(t *testing.T) {
if IsBogon("antani") != true {
t.Fatal("unexpected result")
}
if IsBogon("127.0.0.1") != true {
t.Fatal("unexpected result")
}
if IsBogon("1.1.1.1") != false {
t.Fatal("unexpected result")
}
if IsBogon("8.8.4.4") != false {
t.Fatal("unexpected result")
}
if IsBogon("2001:4860:4860::8844") != false {
t.Fatal("unexpected result")
}
if IsBogon("10.0.1.1") != true {
t.Fatal("unexpected result")
}
if IsBogon("::1") != true {
t.Fatal("unexpected result")
}
}
func TestIsLoopback(t *testing.T) {
if IsLoopback("antani") != true {
t.Fatal("unexpected result")
}
if IsLoopback("127.0.0.1") != true {
t.Fatal("unexpected result")
}
if IsLoopback("1.1.1.1") != false {
t.Fatal("unexpected result")
}
if IsLoopback("8.8.4.4") != false {
t.Fatal("unexpected result")
}
if IsLoopback("2001:4860:4860::8844") != false {
t.Fatal("unexpected result")
}
if IsLoopback("10.0.1.1") != false {
t.Fatal("unexpected result")
}
if IsLoopback("::1") != true {
t.Fatal("unexpected result")
}
}