2021-09-30 15:22:57 +00:00
|
|
|
package storage
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
gomock "github.com/golang/mock/gomock"
|
|
|
|
|
"github.com/qdm12/gluetun/internal/models"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func Test_extractServersFromBytes(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
testCases := map[string]struct {
|
|
|
|
|
b []byte
|
|
|
|
|
hardcoded models.AllServers
|
|
|
|
|
logged []string
|
|
|
|
|
persisted models.AllServers
|
|
|
|
|
err error
|
|
|
|
|
}{
|
|
|
|
|
"no data": {
|
|
|
|
|
err: errors.New("cannot decode versions: unexpected end of JSON input"),
|
|
|
|
|
},
|
|
|
|
|
"empty JSON": {
|
|
|
|
|
b: []byte("{}"),
|
|
|
|
|
err: errors.New("cannot decode servers for provider: Cyberghost: unexpected end of JSON input"),
|
|
|
|
|
},
|
|
|
|
|
"different versions": {
|
|
|
|
|
b: []byte(`{}`),
|
|
|
|
|
hardcoded: models.AllServers{
|
2022-04-16 22:25:36 +02:00
|
|
|
Cyberghost: models.Servers{Version: 1},
|
|
|
|
|
Expressvpn: models.Servers{Version: 1},
|
|
|
|
|
Fastestvpn: models.Servers{Version: 1},
|
|
|
|
|
HideMyAss: models.Servers{Version: 1},
|
|
|
|
|
Ipvanish: models.Servers{Version: 1},
|
|
|
|
|
Ivpn: models.Servers{Version: 1},
|
|
|
|
|
Mullvad: models.Servers{Version: 1},
|
|
|
|
|
Nordvpn: models.Servers{Version: 1},
|
|
|
|
|
Perfectprivacy: models.Servers{Version: 1},
|
|
|
|
|
Privado: models.Servers{Version: 1},
|
|
|
|
|
Pia: models.Servers{Version: 1},
|
|
|
|
|
Privatevpn: models.Servers{Version: 1},
|
|
|
|
|
Protonvpn: models.Servers{Version: 1},
|
|
|
|
|
Purevpn: models.Servers{Version: 1},
|
|
|
|
|
Surfshark: models.Servers{Version: 1},
|
|
|
|
|
Torguard: models.Servers{Version: 1},
|
|
|
|
|
VPNUnlimited: models.Servers{Version: 1},
|
|
|
|
|
Vyprvpn: models.Servers{Version: 1},
|
|
|
|
|
Wevpn: models.Servers{Version: 1},
|
|
|
|
|
Windscribe: models.Servers{Version: 1},
|
2021-09-30 15:22:57 +00:00
|
|
|
},
|
|
|
|
|
logged: []string{
|
|
|
|
|
"Cyberghost servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Expressvpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Fastestvpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
2022-04-18 09:00:02 +00:00
|
|
|
"Hidemyass servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
2021-09-30 15:22:57 +00:00
|
|
|
"Ipvanish servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Ivpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Mullvad servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Nordvpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
2021-10-05 10:44:15 -07:00
|
|
|
"Perfect Privacy servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
2021-09-30 15:22:57 +00:00
|
|
|
"Privado servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
2022-04-18 09:00:02 +00:00
|
|
|
"Private Internet Access servers from file discarded because they have version 0 and hardcoded servers have version 1", //nolint:lll
|
2021-09-30 15:22:57 +00:00
|
|
|
"Privatevpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Protonvpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Purevpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Surfshark servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Torguard servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
2022-04-18 09:00:02 +00:00
|
|
|
"Vpn Unlimited servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
2021-09-30 15:22:57 +00:00
|
|
|
"Vyprvpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Wevpn servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
"Windscribe servers from file discarded because they have version 0 and hardcoded servers have version 1",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"same versions": {
|
|
|
|
|
b: []byte(`{
|
|
|
|
|
"cyberghost": {"version": 1, "timestamp": 1},
|
|
|
|
|
"expressvpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"fastestvpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"hidemyass": {"version": 1, "timestamp": 1},
|
|
|
|
|
"ipvanish": {"version": 1, "timestamp": 1},
|
|
|
|
|
"ivpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"mullvad": {"version": 1, "timestamp": 1},
|
|
|
|
|
"nordvpn": {"version": 1, "timestamp": 1},
|
2022-05-27 00:35:33 +00:00
|
|
|
"perfect privacy": {"version": 1, "timestamp": 1},
|
2021-09-30 15:22:57 +00:00
|
|
|
"privado": {"version": 1, "timestamp": 1},
|
2022-05-27 00:35:33 +00:00
|
|
|
"private internet access": {"version": 1, "timestamp": 1},
|
2021-09-30 15:22:57 +00:00
|
|
|
"privatevpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"protonvpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"purevpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"surfshark": {"version": 1, "timestamp": 1},
|
|
|
|
|
"torguard": {"version": 1, "timestamp": 1},
|
2022-05-27 00:35:33 +00:00
|
|
|
"vpn unlimited": {"version": 1, "timestamp": 1},
|
2021-09-30 15:22:57 +00:00
|
|
|
"vyprvpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"wevpn": {"version": 1, "timestamp": 1},
|
|
|
|
|
"windscribe": {"version": 1, "timestamp": 1}
|
|
|
|
|
}`),
|
|
|
|
|
hardcoded: models.AllServers{
|
2022-04-16 22:25:36 +02:00
|
|
|
Cyberghost: models.Servers{Version: 1},
|
|
|
|
|
Expressvpn: models.Servers{Version: 1},
|
|
|
|
|
Fastestvpn: models.Servers{Version: 1},
|
|
|
|
|
HideMyAss: models.Servers{Version: 1},
|
|
|
|
|
Ipvanish: models.Servers{Version: 1},
|
|
|
|
|
Ivpn: models.Servers{Version: 1},
|
|
|
|
|
Mullvad: models.Servers{Version: 1},
|
|
|
|
|
Nordvpn: models.Servers{Version: 1},
|
|
|
|
|
Perfectprivacy: models.Servers{Version: 1},
|
|
|
|
|
Privado: models.Servers{Version: 1},
|
|
|
|
|
Pia: models.Servers{Version: 1},
|
|
|
|
|
Privatevpn: models.Servers{Version: 1},
|
|
|
|
|
Protonvpn: models.Servers{Version: 1},
|
|
|
|
|
Purevpn: models.Servers{Version: 1},
|
|
|
|
|
Surfshark: models.Servers{Version: 1},
|
|
|
|
|
Torguard: models.Servers{Version: 1},
|
|
|
|
|
VPNUnlimited: models.Servers{Version: 1},
|
|
|
|
|
Vyprvpn: models.Servers{Version: 1},
|
|
|
|
|
Wevpn: models.Servers{Version: 1},
|
|
|
|
|
Windscribe: models.Servers{Version: 1},
|
2021-09-30 15:22:57 +00:00
|
|
|
},
|
|
|
|
|
persisted: models.AllServers{
|
2022-04-16 22:25:36 +02:00
|
|
|
Cyberghost: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Expressvpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Fastestvpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
HideMyAss: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Ipvanish: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Ivpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Mullvad: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Nordvpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Perfectprivacy: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Privado: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Pia: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Privatevpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Protonvpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Purevpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Surfshark: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Torguard: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
VPNUnlimited: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Vyprvpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Wevpn: models.Servers{Version: 1, Timestamp: 1},
|
|
|
|
|
Windscribe: models.Servers{Version: 1, Timestamp: 1},
|
2021-09-30 15:22:57 +00:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for name, testCase := range testCases {
|
|
|
|
|
testCase := testCase
|
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
ctrl := gomock.NewController(t)
|
|
|
|
|
|
|
|
|
|
logger := NewMockInfoErrorer(ctrl)
|
|
|
|
|
for _, logged := range testCase.logged {
|
|
|
|
|
logger.EXPECT().Info(logged)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s := &Storage{
|
|
|
|
|
logger: logger,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
servers, err := s.extractServersFromBytes(testCase.b, testCase.hardcoded)
|
|
|
|
|
|
|
|
|
|
if testCase.err != nil {
|
|
|
|
|
require.Error(t, err)
|
|
|
|
|
assert.Equal(t, testCase.err.Error(), err.Error())
|
|
|
|
|
} else {
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, testCase.persisted, servers)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|