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

111 lines
2.6 KiB
Go
Raw Normal View History

package netxlite
import (
"context"
"errors"
"io"
"net"
"net/url"
"testing"
"github.com/ooni/probe-cli/v3/internal/model/mocks"
)
func TestMaybeProxyDialer(t *testing.T) {
t.Run("MaybeWrapWithProxyDialer", func(t *testing.T) {
t.Run("without a proxy URL", func(t *testing.T) {
underlying := &mocks.Dialer{}
dialer := MaybeWrapWithProxyDialer(underlying, nil)
if dialer != underlying {
t.Fatal("should not have wrapped")
}
})
t.Run("with a proxy URL", func(t *testing.T) {
URL := &url.URL{}
underlying := &mocks.Dialer{}
dialer := MaybeWrapWithProxyDialer(underlying, URL)
real := dialer.(*proxyDialer)
if real.Dialer != underlying {
t.Fatal("did not wrap correctly")
}
if real.ProxyURL != URL {
t.Fatal("invalid URL")
}
})
})
t.Run("DialContext", func(t *testing.T) {
t.Run("invalid scheme", func(t *testing.T) {
child := &mocks.Dialer{}
URL := &url.URL{Scheme: "antani"}
d := MaybeWrapWithProxyDialer(child, URL)
conn, err := d.DialContext(context.Background(), "tcp", "www.google.com:443")
if !errors.Is(err, ErrProxyUnsupportedScheme) {
t.Fatal("not the error we expected")
}
if conn != nil {
t.Fatal("conn is not nil")
}
})
t.Run("underlying dial fails with EOF", func(t *testing.T) {
const expect = "10.0.0.1:9050"
d := &proxyDialer{
Dialer: &mocks.Dialer{
MockDialContext: func(ctx context.Context, network string, address string) (net.Conn, error) {
if address != expect {
return nil, errors.New("unexpected address")
}
return nil, io.EOF
},
},
ProxyURL: &url.URL{
Scheme: "socks5",
Host: expect,
},
}
conn, err := d.DialContext(context.Background(), "tcp", "www.google.com:443")
if !errors.Is(err, io.EOF) {
t.Fatal("not the error we expected")
}
if conn != nil {
t.Fatal("conn is not nil")
}
})
})
t.Run("CloseIdleConnections", func(t *testing.T) {
var called bool
child := &mocks.Dialer{
MockCloseIdleConnections: func() {
called = true
},
}
URL := &url.URL{}
dialer := MaybeWrapWithProxyDialer(child, URL)
dialer.CloseIdleConnections()
if !called {
t.Fatal("not called")
}
})
t.Run("proxyDialerWrapper", func(t *testing.T) {
t.Run("Dial panics", func(t *testing.T) {
d := &proxyDialerWrapper{}
err := func() (rv error) {
defer func() {
if r := recover(); r != nil {
rv = r.(error)
}
}()
d.Dial("tcp", "10.0.0.1:1234")
return
}()
if err.Error() != "proxyDialerWrapper.Dial should not be called directly" {
t.Fatal("unexpected result", err)
}
})
})
}