110 lines
2.5 KiB
Go
110 lines
2.5 KiB
Go
package pwextractor
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
var testDomain = "dns.google"
|
|
var testResult = []string{
|
|
"2001:4860:4860::8844", "2001:4860:4860::8888", "8.8.8.8", "8.8.4.4",
|
|
}
|
|
|
|
func TestGetIPs(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expectedIPStrings []string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "valid IPv4",
|
|
input: "192.0.2.1",
|
|
expectedIPStrings: []string{"192.0.2.1"},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid IPv6",
|
|
input: "2001:db8::1",
|
|
expectedIPStrings: []string{"2001:db8::1"},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "URL with IPv4 host",
|
|
input: "http://192.0.2.1",
|
|
expectedIPStrings: []string{"192.0.2.1"},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "URL with IPv6 host",
|
|
input: "http://[2001:db8::1]",
|
|
expectedIPStrings: []string{"2001:db8::1"},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "URL with hostname",
|
|
input: fmt.Sprintf("https://%s:8080", testDomain),
|
|
expectedIPStrings: testResult,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "hostname",
|
|
input: testDomain,
|
|
expectedIPStrings: testResult,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "invalid IP address",
|
|
input: "256.0.0.0",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "empty input",
|
|
input: "",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "invalid URL format",
|
|
input: "://invalid",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "unresolvable hostname",
|
|
input: "nonexistent.invalid",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
ips, err := getIPs(tc.input)
|
|
|
|
if tc.wantErr {
|
|
require.Error(t, err)
|
|
assert.Nil(t, ips)
|
|
} else {
|
|
require.NoError(t, err)
|
|
require.NotEmpty(t, ips, "result slice should not be empty when error is nil")
|
|
|
|
if tc.expectedIPStrings != nil {
|
|
ipStrings := make([]string, len(ips))
|
|
for i, ip := range ips {
|
|
ipStrings[i] = ip.String()
|
|
}
|
|
assert.ElementsMatch(t, tc.expectedIPStrings, ipStrings, "IPs do not match expected")
|
|
}
|
|
}
|
|
})
|
|
}
|
|
t.Run("cache set", func(t *testing.T) {
|
|
dnsCache.DeleteAll()
|
|
require.False(t, dnsCache.Has(testDomain))
|
|
ips, _ := getIPs(testDomain)
|
|
require.True(t, dnsCache.Has(testDomain))
|
|
require.ElementsMatch(t, ips, dnsCache.Get(testDomain).Value())
|
|
})
|
|
}
|