diff --git a/internal/provider/cyberghost/updater/resolve.go b/internal/provider/cyberghost/updater/resolve.go index a92b002d..70f0ed23 100644 --- a/internal/provider/cyberghost/updater/resolve.go +++ b/internal/provider/cyberghost/updater/resolve.go @@ -1,16 +1,12 @@ package cyberghost import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - possibleHosts []string, minServers int) ( - hostToIPs map[string][]net.IP, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 1 maxDuration = 20 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,10 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - hostToIPs, _, err = presolver.Resolve(ctx, possibleHosts, settings) - if err != nil { - return nil, err - } - - return hostToIPs, nil + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/cyberghost/updater/servers.go b/internal/provider/cyberghost/updater/servers.go index b6ceb0fa..a2922b8f 100644 --- a/internal/provider/cyberghost/updater/servers.go +++ b/internal/provider/cyberghost/updater/servers.go @@ -14,7 +14,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( possibleServers := getPossibleServers() possibleHosts := possibleServers.hostsSlice() - hostToIPs, err := resolveHosts(ctx, u.presolver, possibleHosts, minServers) + hostToIPs, _, err := u.presolver.Resolve(ctx, possibleHosts, minServers) if err != nil { return nil, err } diff --git a/internal/provider/cyberghost/updater/updater.go b/internal/provider/cyberghost/updater/updater.go index 588f5727..e03c1081 100644 --- a/internal/provider/cyberghost/updater/updater.go +++ b/internal/provider/cyberghost/updater/updater.go @@ -6,8 +6,8 @@ type Updater struct { presolver resolver.Parallel } -func New(presolver resolver.Parallel) *Updater { +func New() *Updater { return &Updater{ - presolver: presolver, + presolver: newParallelResolver(), } } diff --git a/internal/provider/expressvpn/updater/resolve.go b/internal/provider/expressvpn/updater/resolve.go index 959fa493..8b42198e 100644 --- a/internal/provider/expressvpn/updater/resolve.go +++ b/internal/provider/expressvpn/updater/resolve.go @@ -1,16 +1,12 @@ package expressvpn import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() resolver.Parallel { const ( maxFailRatio = 0.1 maxNoNew = 1 @@ -18,7 +14,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: time.Second, MaxNoNew: maxNoNew, @@ -26,5 +21,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/expressvpn/updater/servers.go b/internal/provider/expressvpn/updater/servers.go index 8c620e2b..2c4f5eac 100644 --- a/internal/provider/expressvpn/updater/servers.go +++ b/internal/provider/expressvpn/updater/servers.go @@ -21,7 +21,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( hosts[i] = servers[i].Hostname } - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/expressvpn/updater/updater.go b/internal/provider/expressvpn/updater/updater.go index 49d7907b..abe945a7 100644 --- a/internal/provider/expressvpn/updater/updater.go +++ b/internal/provider/expressvpn/updater/updater.go @@ -15,11 +15,10 @@ type Warner interface { Warn(s string) } -func New(unzipper unzip.Unzipper, presolver resolver.Parallel, - warner Warner) *Updater { +func New(unzipper unzip.Unzipper, warner Warner) *Updater { return &Updater{ unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/fastestvpn/updater/resolve.go b/internal/provider/fastestvpn/updater/resolve.go index 93c1bb10..7c7a6c36 100644 --- a/internal/provider/fastestvpn/updater/resolve.go +++ b/internal/provider/fastestvpn/updater/resolve.go @@ -1,16 +1,12 @@ package fastestvpn import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() resolver.Parallel { const ( maxFailRatio = 0.1 maxNoNew = 1 @@ -18,7 +14,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: time.Second, MaxNoNew: maxNoNew, @@ -26,5 +21,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/fastestvpn/updater/servers.go b/internal/provider/fastestvpn/updater/servers.go index 07e02ded..4100b599 100644 --- a/internal/provider/fastestvpn/updater/servers.go +++ b/internal/provider/fastestvpn/updater/servers.go @@ -56,7 +56,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( } hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/fastestvpn/updater/updater.go b/internal/provider/fastestvpn/updater/updater.go index 3a0b5c3a..89afef0f 100644 --- a/internal/provider/fastestvpn/updater/updater.go +++ b/internal/provider/fastestvpn/updater/updater.go @@ -15,11 +15,10 @@ type Warner interface { Warn(s string) } -func New(unzipper unzip.Unzipper, presolver resolver.Parallel, - warner Warner) *Updater { +func New(unzipper unzip.Unzipper, warner Warner) *Updater { return &Updater{ unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/hidemyass/updater/resolve.go b/internal/provider/hidemyass/updater/resolve.go index 171e7228..68a963d6 100644 --- a/internal/provider/hidemyass/updater/resolve.go +++ b/internal/provider/hidemyass/updater/resolve.go @@ -1,16 +1,12 @@ package hidemyass import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) ( - hostToIPs map[string][]net.IP, warnings []string, err error) { +func newParallelResolver() resolver.Parallel { const ( maxFailRatio = 0.1 maxDuration = 15 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,5 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/hidemyass/updater/servers.go b/internal/provider/hidemyass/updater/servers.go index bbda07dc..78e94268 100644 --- a/internal/provider/hidemyass/updater/servers.go +++ b/internal/provider/hidemyass/updater/servers.go @@ -26,7 +26,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( common.ErrNotEnoughServers, len(hosts), minServers) } - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/hidemyass/updater/updater.go b/internal/provider/hidemyass/updater/updater.go index e56bdc5e..cbeec9da 100644 --- a/internal/provider/hidemyass/updater/updater.go +++ b/internal/provider/hidemyass/updater/updater.go @@ -16,11 +16,10 @@ type Warner interface { Warn(s string) } -func New(client *http.Client, presolver resolver.Parallel, - warner Warner) *Updater { +func New(client *http.Client, warner Warner) *Updater { return &Updater{ client: client, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/ipvanish/updater/resolve.go b/internal/provider/ipvanish/updater/resolve.go index b727da5f..b6a42b8b 100644 --- a/internal/provider/ipvanish/updater/resolve.go +++ b/internal/provider/ipvanish/updater/resolve.go @@ -1,14 +1,12 @@ package ipvanish import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func getResolveSettings(minServers int) (settings resolver.ParallelSettings) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 20 * time.Second @@ -16,9 +14,8 @@ func getResolveSettings(minServers int) (settings resolver.ParallelSettings) { maxNoNew = 2 maxFails = 2 ) - return resolver.ParallelSettings{ + settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -27,11 +24,5 @@ func getResolveSettings(minServers int) (settings resolver.ParallelSettings) { SortIPs: true, }, } -} - -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { - settings := getResolveSettings(minServers) - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/ipvanish/updater/resolve_test.go b/internal/provider/ipvanish/updater/resolve_test.go deleted file mode 100644 index f40be5cd..00000000 --- a/internal/provider/ipvanish/updater/resolve_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package ipvanish - -import ( - "context" - "errors" - "net" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/qdm12/gluetun/internal/updater/resolver" - "github.com/qdm12/gluetun/internal/updater/resolver/mock_resolver" - "github.com/stretchr/testify/assert" -) - -func Test_resolveHosts(t *testing.T) { - t.Parallel() - ctrl := gomock.NewController(t) - - ctx := context.Background() - presolver := mock_resolver.NewMockParallel(ctrl) - hosts := []string{"host1", "host2"} - const minServers = 10 - - expectedHostToIPs := map[string][]net.IP{ - "host1": {{1, 2, 3, 4}}, - "host2": {{2, 3, 4, 5}}, - } - expectedWarnings := []string{"warning1", "warning2"} - expectedErr := errors.New("dummy") - - const ( - maxFailRatio = 0.1 - maxDuration = 20 * time.Second - betweenDuration = time.Second - maxNoNew = 2 - maxFails = 2 - ) - expectedSettings := resolver.ParallelSettings{ - MaxFailRatio: maxFailRatio, - MinFound: minServers, - Repeat: resolver.RepeatSettings{ - MaxDuration: maxDuration, - BetweenDuration: betweenDuration, - MaxNoNew: maxNoNew, - MaxFails: maxFails, - SortIPs: true, - }, - } - presolver.EXPECT().Resolve(ctx, hosts, expectedSettings). - Return(expectedHostToIPs, expectedWarnings, expectedErr) - - hostToIPs, warnings, err := resolveHosts(ctx, presolver, hosts, minServers) - assert.Equal(t, expectedHostToIPs, hostToIPs) - assert.Equal(t, expectedWarnings, warnings) - assert.Equal(t, expectedErr, err) -} diff --git a/internal/provider/ipvanish/updater/servers.go b/internal/provider/ipvanish/updater/servers.go index fabc0144..24590ece 100644 --- a/internal/provider/ipvanish/updater/servers.go +++ b/internal/provider/ipvanish/updater/servers.go @@ -67,7 +67,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( } hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/ipvanish/updater/servers_test.go b/internal/provider/ipvanish/updater/servers_test.go index b88f0873..9e64979e 100644 --- a/internal/provider/ipvanish/updater/servers_test.go +++ b/internal/provider/ipvanish/updater/servers_test.go @@ -9,7 +9,6 @@ import ( "github.com/golang/mock/gomock" "github.com/qdm12/gluetun/internal/constants/vpn" "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/resolver/mock_resolver" "github.com/qdm12/gluetun/internal/updater/unzip/mock_unzip" "github.com/stretchr/testify/assert" @@ -32,7 +31,6 @@ func Test_Updater_GetServers(t *testing.T) { // Resolution expectResolve bool hostsToResolve []string - resolveSettings resolver.ParallelSettings hostToIPs map[string][]net.IP resolveWarnings []string resolveErr error @@ -88,10 +86,9 @@ func Test_Updater_GetServers(t *testing.T) { unzipContents: map[string][]byte{ "ipvanish-CA-City-A-hosta.ovpn": []byte("remote hosta\nremote hostb"), }, - expectResolve: true, - hostsToResolve: []string{"hosta"}, - resolveSettings: getResolveSettings(1), - err: errors.New("not enough servers found: 0 and expected at least 1"), + expectResolve: true, + hostsToResolve: []string{"hosta"}, + err: errors.New("not enough servers found: 0 and expected at least 1"), }, "resolve error": { warnerBuilder: func(ctrl *gomock.Controller) Warner { @@ -104,7 +101,6 @@ func Test_Updater_GetServers(t *testing.T) { }, expectResolve: true, hostsToResolve: []string{"hosta"}, - resolveSettings: getResolveSettings(0), resolveWarnings: []string{"resolve warning"}, resolveErr: errors.New("dummy"), err: errors.New("dummy"), @@ -132,9 +128,8 @@ func Test_Updater_GetServers(t *testing.T) { "ipvanish-CA-City-A-hosta.ovpn": []byte("remote hosta"), "ipvanish-LU-City-B-hostb.ovpn": []byte("remote hostb"), }, - expectResolve: true, - hostsToResolve: []string{"hosta", "hostb"}, - resolveSettings: getResolveSettings(1), + expectResolve: true, + hostsToResolve: []string{"hosta", "hostb"}, hostToIPs: map[string][]net.IP{ "hosta": {{1, 1, 1, 1}, {2, 2, 2, 2}}, "hostb": {{3, 3, 3, 3}, {4, 4, 4, 4}}, @@ -175,13 +170,15 @@ func Test_Updater_GetServers(t *testing.T) { presolver := mock_resolver.NewMockParallel(ctrl) if testCase.expectResolve { - presolver.EXPECT().Resolve(ctx, testCase.hostsToResolve, testCase.resolveSettings). + presolver.EXPECT().Resolve(ctx, testCase.hostsToResolve, testCase.minServers). Return(testCase.hostToIPs, testCase.resolveWarnings, testCase.resolveErr) } - warner := testCase.warnerBuilder(ctrl) - - updater := New(unzipper, presolver, warner) + updater := &Updater{ + unzipper: unzipper, + warner: testCase.warnerBuilder(ctrl), + presolver: presolver, + } servers, err := updater.FetchServers(ctx, testCase.minServers) diff --git a/internal/provider/ipvanish/updater/updater.go b/internal/provider/ipvanish/updater/updater.go index edd73374..0c2f2687 100644 --- a/internal/provider/ipvanish/updater/updater.go +++ b/internal/provider/ipvanish/updater/updater.go @@ -7,19 +7,18 @@ import ( type Updater struct { unzipper unzip.Unzipper - presolver resolver.Parallel warner Warner + presolver resolver.Parallel } type Warner interface { Warn(s string) } -func New(unzipper unzip.Unzipper, presolver resolver.Parallel, - warner Warner) *Updater { +func New(unzipper unzip.Unzipper, warner Warner) *Updater { return &Updater{ unzipper: unzipper, - presolver: presolver, warner: warner, + presolver: newParallelResolver(), } } diff --git a/internal/provider/ivpn/updater/resolve.go b/internal/provider/ivpn/updater/resolve.go index 8a0eaa43..e79dcb91 100644 --- a/internal/provider/ivpn/updater/resolve.go +++ b/internal/provider/ivpn/updater/resolve.go @@ -1,14 +1,12 @@ package ivpn import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func getResolveSettings(minServers int) (settings resolver.ParallelSettings) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 20 * time.Second @@ -16,9 +14,8 @@ func getResolveSettings(minServers int) (settings resolver.ParallelSettings) { maxNoNew = 2 maxFails = 2 ) - return resolver.ParallelSettings{ + settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -27,11 +24,5 @@ func getResolveSettings(minServers int) (settings resolver.ParallelSettings) { SortIPs: true, }, } -} - -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { - settings := getResolveSettings(minServers) - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/ivpn/updater/resolve_test.go b/internal/provider/ivpn/updater/resolve_test.go deleted file mode 100644 index c31327f7..00000000 --- a/internal/provider/ivpn/updater/resolve_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package ivpn - -import ( - "context" - "errors" - "net" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/qdm12/gluetun/internal/updater/resolver" - "github.com/qdm12/gluetun/internal/updater/resolver/mock_resolver" - "github.com/stretchr/testify/assert" -) - -func Test_resolveHosts(t *testing.T) { - t.Parallel() - ctrl := gomock.NewController(t) - - ctx := context.Background() - presolver := mock_resolver.NewMockParallel(ctrl) - hosts := []string{"host1", "host2"} - const minServers = 10 - - expectedHostToIPs := map[string][]net.IP{ - "host1": {{1, 2, 3, 4}}, - "host2": {{2, 3, 4, 5}}, - } - expectedWarnings := []string{"warning1", "warning2"} - expectedErr := errors.New("dummy") - - const ( - maxFailRatio = 0.1 - maxDuration = 20 * time.Second - betweenDuration = time.Second - maxNoNew = 2 - maxFails = 2 - ) - expectedSettings := resolver.ParallelSettings{ - MaxFailRatio: maxFailRatio, - MinFound: minServers, - Repeat: resolver.RepeatSettings{ - MaxDuration: maxDuration, - BetweenDuration: betweenDuration, - MaxNoNew: maxNoNew, - MaxFails: maxFails, - SortIPs: true, - }, - } - presolver.EXPECT().Resolve(ctx, hosts, expectedSettings). - Return(expectedHostToIPs, expectedWarnings, expectedErr) - - hostToIPs, warnings, err := resolveHosts(ctx, presolver, hosts, minServers) - assert.Equal(t, expectedHostToIPs, hostToIPs) - assert.Equal(t, expectedWarnings, warnings) - assert.Equal(t, expectedErr, err) -} diff --git a/internal/provider/ivpn/updater/servers.go b/internal/provider/ivpn/updater/servers.go index e73f6e0a..6a725454 100644 --- a/internal/provider/ivpn/updater/servers.go +++ b/internal/provider/ivpn/updater/servers.go @@ -38,7 +38,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( common.ErrNotEnoughServers, len(hosts), minServers) } - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/ivpn/updater/servers_test.go b/internal/provider/ivpn/updater/servers_test.go index 7c21e761..4e60e456 100644 --- a/internal/provider/ivpn/updater/servers_test.go +++ b/internal/provider/ivpn/updater/servers_test.go @@ -12,7 +12,6 @@ import ( "github.com/golang/mock/gomock" "github.com/qdm12/gluetun/internal/constants/vpn" "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/resolver/mock_resolver" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -35,7 +34,6 @@ func Test_Updater_GetServers(t *testing.T) { // Resolution expectResolve bool hostsToResolve []string - resolveSettings resolver.ParallelSettings hostToIPs map[string][]net.IP resolveWarnings []string resolveErr error @@ -61,7 +59,6 @@ func Test_Updater_GetServers(t *testing.T) { responseStatus: http.StatusOK, expectResolve: true, hostsToResolve: []string{"hosta"}, - resolveSettings: getResolveSettings(0), resolveWarnings: []string{"resolve warning"}, resolveErr: errors.New("dummy"), err: errors.New("dummy"), @@ -87,10 +84,9 @@ func Test_Updater_GetServers(t *testing.T) { {"country":"Country2","city":"City B","hostnames":{"openvpn":"hostb"},"wg_public_key":"xyz"}, {"country":"Country3","city":"City C","hostnames":{"wireguard":"hostc"},"wg_public_key":"xyz"} ]}`, - responseStatus: http.StatusOK, - expectResolve: true, - hostsToResolve: []string{"hosta", "hostb", "hostc"}, - resolveSettings: getResolveSettings(1), + responseStatus: http.StatusOK, + expectResolve: true, + hostsToResolve: []string{"hosta", "hostb", "hostc"}, hostToIPs: map[string][]net.IP{ "hosta": {{1, 1, 1, 1}, {2, 2, 2, 2}}, "hostb": {{3, 3, 3, 3}, {4, 4, 4, 4}}, @@ -134,13 +130,17 @@ func Test_Updater_GetServers(t *testing.T) { presolver := mock_resolver.NewMockParallel(ctrl) if testCase.expectResolve { - presolver.EXPECT().Resolve(ctx, testCase.hostsToResolve, testCase.resolveSettings). + presolver.EXPECT().Resolve(ctx, testCase.hostsToResolve, testCase.minServers). Return(testCase.hostToIPs, testCase.resolveWarnings, testCase.resolveErr) } warner := testCase.warnerBuilder(ctrl) - updater := New(client, presolver, warner) + updater := &Updater{ + client: client, + presolver: presolver, + warner: warner, + } servers, err := updater.FetchServers(ctx, testCase.minServers) diff --git a/internal/provider/ivpn/updater/updater.go b/internal/provider/ivpn/updater/updater.go index 294594e8..11cbcfd4 100644 --- a/internal/provider/ivpn/updater/updater.go +++ b/internal/provider/ivpn/updater/updater.go @@ -16,11 +16,10 @@ type Warner interface { Warn(s string) } -func New(client *http.Client, presolver resolver.Parallel, - warner Warner) *Updater { +func New(client *http.Client, warner Warner) *Updater { return &Updater{ client: client, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/privado/updater/resolve.go b/internal/provider/privado/updater/resolve.go index 01223840..7d74a911 100644 --- a/internal/provider/privado/updater/resolve.go +++ b/internal/provider/privado/updater/resolve.go @@ -1,25 +1,20 @@ package privado import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 30 * time.Second - maxNoNew = 1 - maxFails = 5 + maxNoNew = 2 + maxFails = 2 ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, MaxNoNew: maxNoNew, @@ -27,5 +22,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/privado/updater/servers.go b/internal/provider/privado/updater/servers.go index c8c07a58..9a13e891 100644 --- a/internal/provider/privado/updater/servers.go +++ b/internal/provider/privado/updater/servers.go @@ -50,7 +50,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( } hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/privado/updater/updater.go b/internal/provider/privado/updater/updater.go index ac37afe6..e835b665 100644 --- a/internal/provider/privado/updater/updater.go +++ b/internal/provider/privado/updater/updater.go @@ -19,11 +19,11 @@ type Warner interface { } func New(client *http.Client, unzipper unzip.Unzipper, - presolver resolver.Parallel, warner Warner) *Updater { + warner Warner) *Updater { return &Updater{ client: client, unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/privatevpn/updater/resolve.go b/internal/provider/privatevpn/updater/resolve.go index f80fa9b3..dfeac174 100644 --- a/internal/provider/privatevpn/updater/resolve.go +++ b/internal/provider/privatevpn/updater/resolve.go @@ -1,16 +1,12 @@ package privatevpn import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 6 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,5 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/privatevpn/updater/servers.go b/internal/provider/privatevpn/updater/servers.go index fe4ade28..99428073 100644 --- a/internal/provider/privatevpn/updater/servers.go +++ b/internal/provider/privatevpn/updater/servers.go @@ -82,7 +82,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/privatevpn/updater/updater.go b/internal/provider/privatevpn/updater/updater.go index 46d2bdd5..0e8ef40d 100644 --- a/internal/provider/privatevpn/updater/updater.go +++ b/internal/provider/privatevpn/updater/updater.go @@ -15,11 +15,10 @@ type Warner interface { Warn(s string) } -func New(unzipper unzip.Unzipper, presolver resolver.Parallel, - warner Warner) *Updater { +func New(unzipper unzip.Unzipper, warner Warner) *Updater { return &Updater{ unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/purevpn/updater/resolve.go b/internal/provider/purevpn/updater/resolve.go index 3c7e8469..fb356748 100644 --- a/internal/provider/purevpn/updater/resolve.go +++ b/internal/provider/purevpn/updater/resolve.go @@ -1,16 +1,12 @@ package purevpn import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 20 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,5 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/purevpn/updater/servers.go b/internal/provider/purevpn/updater/servers.go index e4205e9b..f3d35483 100644 --- a/internal/provider/purevpn/updater/servers.go +++ b/internal/provider/purevpn/updater/servers.go @@ -60,7 +60,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( } hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/purevpn/updater/updater.go b/internal/provider/purevpn/updater/updater.go index 0faead4e..a908b1fc 100644 --- a/internal/provider/purevpn/updater/updater.go +++ b/internal/provider/purevpn/updater/updater.go @@ -19,11 +19,11 @@ type Warner interface { } func New(client *http.Client, unzipper unzip.Unzipper, - presolver resolver.Parallel, warner Warner) *Updater { + warner Warner) *Updater { return &Updater{ client: client, unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/surfshark/updater/resolve.go b/internal/provider/surfshark/updater/resolve.go index 50a45cc7..0ca9d60b 100644 --- a/internal/provider/surfshark/updater/resolve.go +++ b/internal/provider/surfshark/updater/resolve.go @@ -1,16 +1,12 @@ package surfshark import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 20 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,5 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/surfshark/updater/resolve_test.go b/internal/provider/surfshark/updater/resolve_test.go deleted file mode 100644 index 201d2c6f..00000000 --- a/internal/provider/surfshark/updater/resolve_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package surfshark - -import ( - "context" - "errors" - "net" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/qdm12/gluetun/internal/updater/resolver" - "github.com/qdm12/gluetun/internal/updater/resolver/mock_resolver" - "github.com/stretchr/testify/assert" -) - -func Test_resolveHosts(t *testing.T) { - t.Parallel() - ctrl := gomock.NewController(t) - - ctx := context.Background() - presolver := mock_resolver.NewMockParallel(ctrl) - hosts := []string{"host1", "host2"} - const minServers = 10 - - expectedHostToIPs := map[string][]net.IP{ - "host1": {{1, 2, 3, 4}}, - "host2": {{2, 3, 4, 5}}, - } - expectedWarnings := []string{"warning1", "warning2"} - expectedErr := errors.New("dummy") - - const ( - maxFailRatio = 0.1 - maxDuration = 20 * time.Second - betweenDuration = time.Second - maxNoNew = 2 - maxFails = 2 - ) - expectedSettings := resolver.ParallelSettings{ - MaxFailRatio: maxFailRatio, - MinFound: minServers, - Repeat: resolver.RepeatSettings{ - MaxDuration: maxDuration, - BetweenDuration: betweenDuration, - MaxNoNew: maxNoNew, - MaxFails: maxFails, - SortIPs: true, - }, - } - presolver.EXPECT().Resolve(ctx, hosts, expectedSettings). - Return(expectedHostToIPs, expectedWarnings, expectedErr) - - hostToIPs, warnings, err := resolveHosts(ctx, presolver, hosts, minServers) - assert.Equal(t, expectedHostToIPs, hostToIPs) - assert.Equal(t, expectedWarnings, warnings) - assert.Equal(t, expectedErr, err) -} diff --git a/internal/provider/surfshark/updater/servers.go b/internal/provider/surfshark/updater/servers.go index 5fd4bdef..ddc71b32 100644 --- a/internal/provider/surfshark/updater/servers.go +++ b/internal/provider/surfshark/updater/servers.go @@ -31,7 +31,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( getRemainingServers(hts) hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/surfshark/updater/updater.go b/internal/provider/surfshark/updater/updater.go index e8e4d6f3..f54f87cf 100644 --- a/internal/provider/surfshark/updater/updater.go +++ b/internal/provider/surfshark/updater/updater.go @@ -19,11 +19,11 @@ type Warner interface { } func New(client *http.Client, unzipper unzip.Unzipper, - presolver resolver.Parallel, warner Warner) *Updater { + warner Warner) *Updater { return &Updater{ client: client, unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/torguard/updater/resolve.go b/internal/provider/torguard/updater/resolve.go index fb831dd8..8de687a8 100644 --- a/internal/provider/torguard/updater/resolve.go +++ b/internal/provider/torguard/updater/resolve.go @@ -1,16 +1,12 @@ package torguard import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 20 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,5 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/torguard/updater/servers.go b/internal/provider/torguard/updater/servers.go index 571b12ec..36da5af9 100644 --- a/internal/provider/torguard/updater/servers.go +++ b/internal/provider/torguard/updater/servers.go @@ -50,7 +50,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( } hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) u.warnWarnings(warnings) if err != nil { return nil, err diff --git a/internal/provider/torguard/updater/updater.go b/internal/provider/torguard/updater/updater.go index b9a86431..2a354421 100644 --- a/internal/provider/torguard/updater/updater.go +++ b/internal/provider/torguard/updater/updater.go @@ -15,11 +15,10 @@ type Warner interface { Warn(s string) } -func New(unzipper unzip.Unzipper, presolver resolver.Parallel, - warner Warner) *Updater { +func New(unzipper unzip.Unzipper, warner Warner) *Updater { return &Updater{ unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/vpnunlimited/updater/resolve.go b/internal/provider/vpnunlimited/updater/resolve.go index 9bacd870..1131061b 100644 --- a/internal/provider/vpnunlimited/updater/resolve.go +++ b/internal/provider/vpnunlimited/updater/resolve.go @@ -1,16 +1,12 @@ package vpnunlimited import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 20 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,5 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/vpnunlimited/updater/servers.go b/internal/provider/vpnunlimited/updater/servers.go index 133d2a4a..5eedc324 100644 --- a/internal/provider/vpnunlimited/updater/servers.go +++ b/internal/provider/vpnunlimited/updater/servers.go @@ -20,7 +20,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( } hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/vpnunlimited/updater/updater.go b/internal/provider/vpnunlimited/updater/updater.go index e2ccd824..6f054d7c 100644 --- a/internal/provider/vpnunlimited/updater/updater.go +++ b/internal/provider/vpnunlimited/updater/updater.go @@ -15,11 +15,10 @@ type Warner interface { Warn(s string) } -func New(unzipper unzip.Unzipper, presolver resolver.Parallel, - warner Warner) *Updater { +func New(unzipper unzip.Unzipper, warner Warner) *Updater { return &Updater{ unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/vyprvpn/updater/resolve.go b/internal/provider/vyprvpn/updater/resolve.go index b5e2175a..135d96e7 100644 --- a/internal/provider/vyprvpn/updater/resolve.go +++ b/internal/provider/vyprvpn/updater/resolve.go @@ -1,30 +1,28 @@ package vyprvpn import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( - maxFailRatio = 0.1 - maxNoNew = 2 - maxFails = 2 + maxFailRatio = 0.1 + maxDuration = 5 * time.Second + betweenDuration = time.Second + maxNoNew = 2 + maxFails = 2 ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ - MaxDuration: time.Second, - MaxNoNew: maxNoNew, - MaxFails: maxFails, - SortIPs: true, + MaxDuration: maxDuration, + BetweenDuration: betweenDuration, + MaxNoNew: maxNoNew, + MaxFails: maxFails, + SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/vyprvpn/updater/servers.go b/internal/provider/vyprvpn/updater/servers.go index 40d28dd4..9d091735 100644 --- a/internal/provider/vyprvpn/updater/servers.go +++ b/internal/provider/vyprvpn/updater/servers.go @@ -64,7 +64,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( } hosts := hts.toHostsSlice() - hostToIPs, warnings, err := resolveHosts(ctx, u.presolver, hosts, minServers) + hostToIPs, warnings, err := u.presolver.Resolve(ctx, hosts, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/vyprvpn/updater/updater.go b/internal/provider/vyprvpn/updater/updater.go index b4bcfe9a..f79fb582 100644 --- a/internal/provider/vyprvpn/updater/updater.go +++ b/internal/provider/vyprvpn/updater/updater.go @@ -15,11 +15,10 @@ type Warner interface { Warn(s string) } -func New(unzipper unzip.Unzipper, presolver resolver.Parallel, - warner Warner) *Updater { +func New(unzipper unzip.Unzipper, warner Warner) *Updater { return &Updater{ unzipper: unzipper, - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/provider/wevpn/updater/resolve.go b/internal/provider/wevpn/updater/resolve.go index e9d653b4..179eaf62 100644 --- a/internal/provider/wevpn/updater/resolve.go +++ b/internal/provider/wevpn/updater/resolve.go @@ -1,16 +1,12 @@ package wevpn import ( - "context" - "net" "time" "github.com/qdm12/gluetun/internal/updater/resolver" ) -func resolveHosts(ctx context.Context, presolver resolver.Parallel, - hosts []string, minServers int) (hostToIPs map[string][]net.IP, - warnings []string, err error) { +func newParallelResolver() (parallelResolver resolver.Parallel) { const ( maxFailRatio = 0.1 maxDuration = 20 * time.Second @@ -20,7 +16,6 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, ) settings := resolver.ParallelSettings{ MaxFailRatio: maxFailRatio, - MinFound: minServers, Repeat: resolver.RepeatSettings{ MaxDuration: maxDuration, BetweenDuration: betweenDuration, @@ -29,5 +24,5 @@ func resolveHosts(ctx context.Context, presolver resolver.Parallel, SortIPs: true, }, } - return presolver.Resolve(ctx, hosts, settings) + return resolver.NewParallelResolver(settings) } diff --git a/internal/provider/wevpn/updater/resolve_test.go b/internal/provider/wevpn/updater/resolve_test.go deleted file mode 100644 index e18a471b..00000000 --- a/internal/provider/wevpn/updater/resolve_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package wevpn - -import ( - "context" - "errors" - "net" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/qdm12/gluetun/internal/updater/resolver" - "github.com/qdm12/gluetun/internal/updater/resolver/mock_resolver" - "github.com/stretchr/testify/assert" -) - -func Test_resolveHosts(t *testing.T) { - t.Parallel() - ctrl := gomock.NewController(t) - - ctx := context.Background() - presolver := mock_resolver.NewMockParallel(ctrl) - hosts := []string{"host1", "host2"} - const minServers = 10 - - expectedHostToIPs := map[string][]net.IP{ - "host1": {{1, 2, 3, 4}}, - "host2": {{2, 3, 4, 5}}, - } - expectedWarnings := []string{"warning1", "warning2"} - expectedErr := errors.New("dummy") - - const ( - maxFailRatio = 0.1 - maxDuration = 20 * time.Second - betweenDuration = time.Second - maxNoNew = 2 - maxFails = 2 - ) - expectedSettings := resolver.ParallelSettings{ - MaxFailRatio: maxFailRatio, - MinFound: minServers, - Repeat: resolver.RepeatSettings{ - MaxDuration: maxDuration, - BetweenDuration: betweenDuration, - MaxNoNew: maxNoNew, - MaxFails: maxFails, - SortIPs: true, - }, - } - presolver.EXPECT().Resolve(ctx, hosts, expectedSettings). - Return(expectedHostToIPs, expectedWarnings, expectedErr) - - hostToIPs, warnings, err := resolveHosts(ctx, presolver, hosts, minServers) - assert.Equal(t, expectedHostToIPs, hostToIPs) - assert.Equal(t, expectedWarnings, warnings) - assert.Equal(t, expectedErr, err) -} diff --git a/internal/provider/wevpn/updater/servers.go b/internal/provider/wevpn/updater/servers.go index 88b4da02..c5de3852 100644 --- a/internal/provider/wevpn/updater/servers.go +++ b/internal/provider/wevpn/updater/servers.go @@ -31,7 +31,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( hostnameToCity[hostname] = city } - hostnameToIPs, warnings, err := resolveHosts(ctx, u.presolver, hostnames, minServers) + hostnameToIPs, warnings, err := u.presolver.Resolve(ctx, hostnames, minServers) for _, warning := range warnings { u.warner.Warn(warning) } diff --git a/internal/provider/wevpn/updater/updater.go b/internal/provider/wevpn/updater/updater.go index 8d118e6c..b842237d 100644 --- a/internal/provider/wevpn/updater/updater.go +++ b/internal/provider/wevpn/updater/updater.go @@ -13,9 +13,9 @@ type Warner interface { Warn(s string) } -func New(presolver resolver.Parallel, warner Warner) *Updater { +func New(warner Warner) *Updater { return &Updater{ - presolver: presolver, + presolver: newParallelResolver(), warner: warner, } } diff --git a/internal/updater/providers.go b/internal/updater/providers.go index a04308ac..b3e4e7ef 100644 --- a/internal/updater/providers.go +++ b/internal/updater/providers.go @@ -60,17 +60,17 @@ func (u *Updater) fetchServers(ctx context.Context, provider string, case providers.Custom: panic("cannot update custom provider") case providers.Cyberghost: - providerUpdater = cyberghost.New(u.presolver) + providerUpdater = cyberghost.New() case providers.Expressvpn: - providerUpdater = expressvpn.New(u.unzipper, u.presolver, u.logger) + providerUpdater = expressvpn.New(u.unzipper, u.logger) case providers.Fastestvpn: - providerUpdater = fastestvpn.New(u.unzipper, u.presolver, u.logger) + providerUpdater = fastestvpn.New(u.unzipper, u.logger) case providers.HideMyAss: - providerUpdater = hidemyass.New(u.client, u.presolver, u.logger) + providerUpdater = hidemyass.New(u.client, u.logger) case providers.Ipvanish: - providerUpdater = ipvanish.New(u.unzipper, u.presolver, u.logger) + providerUpdater = ipvanish.New(u.unzipper, u.logger) case providers.Ivpn: - providerUpdater = ivpn.New(u.client, u.presolver, u.logger) + providerUpdater = ivpn.New(u.client, u.logger) case providers.Mullvad: providerUpdater = mullvad.New(u.client) case providers.Nordvpn: @@ -78,25 +78,25 @@ func (u *Updater) fetchServers(ctx context.Context, provider string, case providers.Perfectprivacy: providerUpdater = perfectprivacy.New(u.unzipper, u.logger) case providers.Privado: - providerUpdater = privado.New(u.client, u.unzipper, u.presolver, u.logger) + providerUpdater = privado.New(u.client, u.unzipper, u.logger) case providers.PrivateInternetAccess: providerUpdater = privateinternetaccess.New(u.client) case providers.Privatevpn: - providerUpdater = privatevpn.New(u.unzipper, u.presolver, u.logger) + providerUpdater = privatevpn.New(u.unzipper, u.logger) case providers.Protonvpn: providerUpdater = protonvpn.New(u.client, u.logger) case providers.Purevpn: - providerUpdater = purevpn.New(u.client, u.unzipper, u.presolver, u.logger) + providerUpdater = purevpn.New(u.client, u.unzipper, u.logger) case providers.Surfshark: - providerUpdater = surfshark.New(u.client, u.unzipper, u.presolver, u.logger) + providerUpdater = surfshark.New(u.client, u.unzipper, u.logger) case providers.Torguard: - providerUpdater = torguard.New(u.unzipper, u.presolver, u.logger) + providerUpdater = torguard.New(u.unzipper, u.logger) case providers.VPNUnlimited: - providerUpdater = vpnunlimited.New(u.unzipper, u.presolver, u.logger) + providerUpdater = vpnunlimited.New(u.unzipper, u.logger) case providers.Vyprvpn: - providerUpdater = vyprvpn.New(u.unzipper, u.presolver, u.logger) + providerUpdater = vyprvpn.New(u.unzipper, u.logger) case providers.Wevpn: - providerUpdater = wevpn.New(u.presolver, u.logger) + providerUpdater = wevpn.New(u.logger) case providers.Windscribe: providerUpdater = windscribe.New(u.client, u.logger) default: diff --git a/internal/updater/resolver/mock_resolver/parallel.go b/internal/updater/resolver/mock_resolver/parallel.go index ad76dae2..0cd743b6 100644 --- a/internal/updater/resolver/mock_resolver/parallel.go +++ b/internal/updater/resolver/mock_resolver/parallel.go @@ -10,7 +10,6 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - resolver "github.com/qdm12/gluetun/internal/updater/resolver" ) // MockParallel is a mock of Parallel interface. @@ -37,7 +36,7 @@ func (m *MockParallel) EXPECT() *MockParallelMockRecorder { } // Resolve mocks base method. -func (m *MockParallel) Resolve(arg0 context.Context, arg1 []string, arg2 resolver.ParallelSettings) (map[string][]net.IP, []string, error) { +func (m *MockParallel) Resolve(arg0 context.Context, arg1 []string, arg2 int) (map[string][]net.IP, []string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Resolve", arg0, arg1, arg2) ret0, _ := ret[0].(map[string][]net.IP) diff --git a/internal/updater/resolver/parallel.go b/internal/updater/resolver/parallel.go index 66915c86..3d3afab6 100644 --- a/internal/updater/resolver/parallel.go +++ b/internal/updater/resolver/parallel.go @@ -10,17 +10,19 @@ import ( //go:generate mockgen -destination=mock_$GOPACKAGE/$GOFILE . Parallel type Parallel interface { - Resolve(ctx context.Context, hosts []string, settings ParallelSettings) ( + Resolve(ctx context.Context, hosts []string, minToFind int) ( hostToIPs map[string][]net.IP, warnings []string, err error) } type parallel struct { repeatResolver Repeat + settings ParallelSettings } -func NewParallelResolver(address string) Parallel { +func NewParallelResolver(settings ParallelSettings) Parallel { return ¶llel{ - repeatResolver: NewRepeat(address), + repeatResolver: NewRepeat(settings.Repeat), + settings: settings, } } @@ -32,10 +34,6 @@ type ParallelSettings struct { // This value is between 0 and 1. Note this is only // applicable if FailEarly is not set to true. MaxFailRatio float64 - // MinFound is the minimum number of hosts to be found. - // If it is bigger than the number of hosts given, it - // is set to the number of hosts given. - MinFound int } type parallelResult struct { @@ -48,13 +46,8 @@ var ( ErrMaxFailRatio = errors.New("maximum failure ratio reached") ) -func (pr *parallel) Resolve(ctx context.Context, hosts []string, - settings ParallelSettings) (hostToIPs map[string][]net.IP, warnings []string, err error) { - minFound := settings.MinFound - if minFound > len(hosts) { - minFound = len(hosts) - } - +func (pr *parallel) Resolve(ctx context.Context, hosts []string, minToFind int) ( + hostToIPs map[string][]net.IP, warnings []string, err error) { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -64,16 +57,16 @@ func (pr *parallel) Resolve(ctx context.Context, hosts []string, defer close(errors) for _, host := range hosts { - go pr.resolveAsync(ctx, host, settings.Repeat, results, errors) + go pr.resolveAsync(ctx, host, results, errors) } hostToIPs = make(map[string][]net.IP, len(hosts)) - maxFails := int(settings.MaxFailRatio * float64(len(hosts))) + maxFails := int(pr.settings.MaxFailRatio * float64(len(hosts))) for range hosts { select { case newErr := <-errors: - if settings.FailEarly { + if pr.settings.FailEarly { if err == nil { // only set the error to the first error encountered // and not the context canceled errors coming after. @@ -100,14 +93,14 @@ func (pr *parallel) Resolve(ctx context.Context, hosts []string, return nil, warnings, err } - if len(hostToIPs) < minFound { + if len(hostToIPs) < minToFind { return nil, warnings, fmt.Errorf("%w: found %d hosts but expected at least %d", - ErrMinFound, len(hostToIPs), minFound) + ErrMinFound, len(hostToIPs), minToFind) } failureRatio := float64(len(warnings)) / float64(len(hosts)) - if failureRatio > settings.MaxFailRatio { + if failureRatio > pr.settings.MaxFailRatio { return hostToIPs, warnings, fmt.Errorf("%w: %.2f failure ratio reached", ErrMaxFailRatio, failureRatio) } @@ -116,8 +109,8 @@ func (pr *parallel) Resolve(ctx context.Context, hosts []string, } func (pr *parallel) resolveAsync(ctx context.Context, host string, - settings RepeatSettings, results chan<- parallelResult, errors chan<- error) { - IPs, err := pr.repeatResolver.Resolve(ctx, host, settings) + results chan<- parallelResult, errors chan<- error) { + IPs, err := pr.repeatResolver.Resolve(ctx, host) if err != nil { errors <- err return diff --git a/internal/updater/resolver/repeat.go b/internal/updater/resolver/repeat.go index 3c087def..ba19d411 100644 --- a/internal/updater/resolver/repeat.go +++ b/internal/updater/resolver/repeat.go @@ -11,20 +11,23 @@ import ( ) type Repeat interface { - Resolve(ctx context.Context, host string, settings RepeatSettings) (IPs []net.IP, err error) + Resolve(ctx context.Context, host string) (IPs []net.IP, err error) } type repeat struct { resolver *net.Resolver + settings RepeatSettings } -func NewRepeat(address string) Repeat { +func NewRepeat(settings RepeatSettings) Repeat { return &repeat{ - resolver: newResolver(address), + resolver: newResolver(settings.Address), + settings: settings, } } type RepeatSettings struct { + Address string MaxDuration time.Duration BetweenDuration time.Duration MaxNoNew int @@ -33,8 +36,8 @@ type RepeatSettings struct { SortIPs bool } -func (r *repeat) Resolve(ctx context.Context, host string, settings RepeatSettings) (ips []net.IP, err error) { - timedCtx, cancel := context.WithTimeout(ctx, settings.MaxDuration) +func (r *repeat) Resolve(ctx context.Context, host string) (ips []net.IP, err error) { + timedCtx, cancel := context.WithTimeout(ctx, r.settings.MaxDuration) defer cancel() noNewCounter := 0 @@ -45,7 +48,7 @@ func (r *repeat) Resolve(ctx context.Context, host string, settings RepeatSettin // TODO // - one resolving every 100ms for round robin DNS responses // - one every second for time based DNS cycling responses - noNewCounter, failCounter, err = r.resolveOnce(ctx, timedCtx, host, settings, uniqueIPs, noNewCounter, failCounter) + noNewCounter, failCounter, err = r.resolveOnce(ctx, timedCtx, host, r.settings, uniqueIPs, noNewCounter, failCounter) } if len(uniqueIPs) == 0 { @@ -54,7 +57,7 @@ func (r *repeat) Resolve(ctx context.Context, host string, settings RepeatSettin ips = uniqueIPsToSlice(uniqueIPs) - if settings.SortIPs { + if r.settings.SortIPs { sort.Slice(ips, func(i, j int) bool { return bytes.Compare(ips[i], ips[j]) < 1 }) diff --git a/internal/updater/updater.go b/internal/updater/updater.go index 1df4db50..2bfe6a03 100644 --- a/internal/updater/updater.go +++ b/internal/updater/updater.go @@ -8,7 +8,6 @@ import ( "github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/updater/resolver" "github.com/qdm12/gluetun/internal/updater/unzip" "golang.org/x/text/cases" "golang.org/x/text/language" @@ -22,11 +21,10 @@ type Updater struct { storage Storage // Functions for tests - logger Logger - timeNow func() time.Time - presolver resolver.Parallel - client *http.Client - unzipper unzip.Unzipper + logger Logger + timeNow func() time.Time + client *http.Client + unzipper unzip.Unzipper } type Storage interface { @@ -45,13 +43,12 @@ func New(settings settings.Updater, httpClient *http.Client, storage Storage, logger Logger) *Updater { unzipper := unzip.New(httpClient) return &Updater{ - options: settings, - storage: storage, - logger: logger, - timeNow: time.Now, - presolver: resolver.NewParallelResolver(settings.DNSAddress.String()), - client: httpClient, - unzipper: unzipper, + options: settings, + storage: storage, + logger: logger, + timeNow: time.Now, + client: httpClient, + unzipper: unzipper, } }