2021-07-29 01:41:26 +00:00
|
|
|
package client
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
2024-02-15 02:43:57 +00:00
|
|
|
"net/url"
|
2021-07-29 01:41:26 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2021-07-29 22:13:37 +00:00
|
|
|
func TestConfig_getHTTPClient(t *testing.T) {
|
2021-07-29 01:41:26 +00:00
|
|
|
insecureConfig := &Config{Insecure: true}
|
|
|
|
insecureConfig.ValidateAndSetDefaults()
|
2021-07-29 22:13:37 +00:00
|
|
|
insecureClient := insecureConfig.getHTTPClient()
|
2021-07-29 01:41:26 +00:00
|
|
|
if !(insecureClient.Transport).(*http.Transport).TLSClientConfig.InsecureSkipVerify {
|
|
|
|
t.Error("expected Config.Insecure set to true to cause the HTTP client to skip certificate verification")
|
|
|
|
}
|
2023-09-28 22:35:18 +00:00
|
|
|
if insecureClient.Timeout != defaultTimeout {
|
2021-07-29 01:41:26 +00:00
|
|
|
t.Error("expected Config.Timeout to default the HTTP client to a timeout of 10s")
|
|
|
|
}
|
|
|
|
request, _ := http.NewRequest("GET", "", nil)
|
|
|
|
if err := insecureClient.CheckRedirect(request, nil); err != nil {
|
|
|
|
t.Error("expected Config.IgnoreRedirect set to false to cause the HTTP client's CheckRedirect to return nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
secureConfig := &Config{IgnoreRedirect: true, Timeout: 5 * time.Second}
|
|
|
|
secureConfig.ValidateAndSetDefaults()
|
2021-07-29 22:13:37 +00:00
|
|
|
secureClient := secureConfig.getHTTPClient()
|
2021-07-29 01:41:26 +00:00
|
|
|
if (secureClient.Transport).(*http.Transport).TLSClientConfig.InsecureSkipVerify {
|
|
|
|
t.Error("expected Config.Insecure set to false to cause the HTTP client to not skip certificate verification")
|
|
|
|
}
|
|
|
|
if secureClient.Timeout != 5*time.Second {
|
|
|
|
t.Error("expected Config.Timeout to cause the HTTP client to have a timeout of 5s")
|
|
|
|
}
|
|
|
|
request, _ = http.NewRequest("GET", "", nil)
|
|
|
|
if err := secureClient.CheckRedirect(request, nil); err != http.ErrUseLastResponse {
|
|
|
|
t.Error("expected Config.IgnoreRedirect set to true to cause the HTTP client's CheckRedirect to return http.ErrUseLastResponse")
|
|
|
|
}
|
|
|
|
}
|
2022-06-13 23:16:34 +00:00
|
|
|
|
|
|
|
func TestConfig_ValidateAndSetDefaults_withCustomDNSResolver(t *testing.T) {
|
|
|
|
type args struct {
|
|
|
|
dnsResolver string
|
|
|
|
}
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
args args
|
|
|
|
wantErr bool
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "with-valid-resolver",
|
|
|
|
args: args{
|
|
|
|
dnsResolver: "tcp://1.1.1.1:53",
|
|
|
|
},
|
|
|
|
wantErr: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "with-invalid-resolver-port",
|
|
|
|
args: args{
|
|
|
|
dnsResolver: "tcp://127.0.0.1:99999",
|
|
|
|
},
|
|
|
|
wantErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "with-invalid-resolver-format",
|
|
|
|
args: args{
|
|
|
|
dnsResolver: "foobar",
|
|
|
|
},
|
|
|
|
wantErr: true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
cfg := &Config{
|
|
|
|
DNSResolver: tt.args.dnsResolver,
|
|
|
|
}
|
|
|
|
err := cfg.ValidateAndSetDefaults()
|
|
|
|
if (err != nil) != tt.wantErr {
|
|
|
|
t.Errorf("ValidateAndSetDefaults() error=%v, wantErr=%v", err, tt.wantErr)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2024-02-15 02:43:57 +00:00
|
|
|
|
|
|
|
func TestConfig_getHTTPClient_withCustomProxyURL(t *testing.T) {
|
|
|
|
proxyURL := "http://proxy.example.com:8080"
|
|
|
|
cfg := &Config{
|
|
|
|
ProxyURL: proxyURL,
|
|
|
|
}
|
|
|
|
cfg.ValidateAndSetDefaults()
|
|
|
|
client := cfg.getHTTPClient()
|
|
|
|
transport := client.Transport.(*http.Transport)
|
|
|
|
if transport.Proxy == nil {
|
|
|
|
t.Errorf("expected Config.ProxyURL to set the HTTP client's proxy to %s", proxyURL)
|
|
|
|
}
|
|
|
|
req := &http.Request{
|
|
|
|
URL: &url.URL{
|
|
|
|
Scheme: "http",
|
|
|
|
Host: "www.example.com",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
expectProxyURL, err := transport.Proxy(req)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("can't proxy the request %s", proxyURL)
|
|
|
|
}
|
|
|
|
if proxyURL != expectProxyURL.String() {
|
|
|
|
t.Errorf("expected Config.ProxyURL to set the HTTP client's proxy to %s", proxyURL)
|
|
|
|
}
|
|
|
|
}
|
2024-04-09 22:41:37 +00:00
|
|
|
|
|
|
|
func TestConfig_TlsIsValid(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
cfg *Config
|
|
|
|
expectedErr bool
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "good-tls-config",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "../testdata/cert.pem", PrivateKeyFile: "../testdata/cert.key"}},
|
|
|
|
expectedErr: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "missing-certificate-file",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "doesnotexist", PrivateKeyFile: "../testdata/cert.key"}},
|
|
|
|
expectedErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "bad-certificate-file",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "../testdata/badcert.pem", PrivateKeyFile: "../testdata/cert.key"}},
|
|
|
|
expectedErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "no-certificate-file",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "", PrivateKeyFile: "../testdata/cert.key"}},
|
|
|
|
expectedErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "missing-private-key-file",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "../testdata/cert.pem", PrivateKeyFile: "doesnotexist"}},
|
|
|
|
expectedErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "no-private-key-file",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "../testdata/cert.pem", PrivateKeyFile: ""}},
|
|
|
|
expectedErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "bad-private-key-file",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "../testdata/cert.pem", PrivateKeyFile: "../testdata/badcert.key"}},
|
|
|
|
expectedErr: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "bad-certificate-and-private-key-file",
|
|
|
|
cfg: &Config{TLS: &TLSConfig{CertificateFile: "../testdata/badcert.pem", PrivateKeyFile: "../testdata/badcert.key"}},
|
|
|
|
expectedErr: true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, test := range tests {
|
|
|
|
t.Run(test.name, func(t *testing.T) {
|
|
|
|
err := test.cfg.TLS.isValid()
|
|
|
|
if (err != nil) != test.expectedErr {
|
|
|
|
t.Errorf("expected the existence of an error to be %v, got %v", test.expectedErr, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if !test.expectedErr {
|
|
|
|
if test.cfg.TLS.isValid() != nil {
|
|
|
|
t.Error("cfg.TLS.isValid() returned an error even though no error was expected")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|