1 package integration
2
3 import (
4 "net"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9
10 v "edge-infra.dev/pkg/sds/remoteaccess/wireguard/vpn"
11 "edge-infra.dev/test/f2"
12 )
13
14 func TestIPAddressIsInSubnet(t *testing.T) {
15 var (
16 vpn *v.VPN
17 err error
18 )
19 feature := f2.NewFeature("IPAddressIsInSubnet").
20 Setup("create VPN", func(ctx f2.Context, t *testing.T) f2.Context {
21 vpn, err = v.New()
22 require.NoError(t, err)
23 return ctx
24 }).
25 Test("error when IP is nil", func(ctx f2.Context, t *testing.T) f2.Context {
26 in, err := vpn.IPAddressIsInSubnet(net.ParseIP("0.0.0.0"))
27 assert.Error(t, err)
28 assert.False(t, in)
29 return ctx
30 }).
31 Test("error when unable to parse subnet prefix", func(ctx f2.Context, t *testing.T) f2.Context {
32 vpn.SubnetCIDR = "1.2.3.0"
33 in, err := vpn.IPAddressIsInSubnet(net.ParseIP("0.0.0.0"))
34 assert.Error(t, err)
35 assert.False(t, in)
36 return ctx
37 }).
38 Test("error when unable to parse subnet address", func(ctx f2.Context, t *testing.T) f2.Context {
39 vpn.SubnetCIDR = "/24"
40 in, err := vpn.IPAddressIsInSubnet(net.ParseIP("0.0.0.0"))
41 assert.Error(t, err)
42 assert.False(t, in)
43 return ctx
44 }).
45 Test("return false if IP is not in subnet", func(ctx f2.Context, t *testing.T) f2.Context {
46 vpn.SubnetCIDR = "1.2.3.0/24"
47 in, err := vpn.IPAddressIsInSubnet(net.ParseIP("0.0.0.0"))
48 assert.NoError(t, err)
49 assert.False(t, in)
50 return ctx
51 }).
52 Test("return true if IP is in subnet", func(ctx f2.Context, t *testing.T) f2.Context {
53 vpn.SubnetCIDR = "1.2.3.0/24"
54 in, err := vpn.IPAddressIsInSubnet(net.ParseIP("1.2.3.4"))
55 assert.NoError(t, err)
56 assert.True(t, in)
57 return ctx
58 }).Feature()
59 f.Test(t, feature)
60 }
61
62 func TestRequestAvailableIPAddress(t *testing.T) {
63 var (
64 vpn *v.VPN
65 err error
66 )
67 feature := f2.NewFeature("RequestAvailableIPAddress").
68 Setup("create VPN", func(ctx f2.Context, t *testing.T) f2.Context {
69 vpn, err = v.New()
70 require.NoError(t, err)
71 return ctx
72 }).
73 Test("error and do not return IP when IP address pool is nil", func(ctx f2.Context, t *testing.T) f2.Context {
74 ip, err := vpn.RequestAvailableIPAddress("test-clusterEdgeID")
75 assert.Nil(t, ip)
76 assert.Error(t, err)
77 assert.ErrorIs(t, err, v.ErrSubnetNotConfigured)
78 return ctx
79 }).
80 Test("error and do not return IP when IP address pool is empty", func(ctx f2.Context, t *testing.T) f2.Context {
81 vpn.AvailableIPAddressPool = v.IPAddressPool{}
82 ip, err := vpn.RequestAvailableIPAddress("test-clusterEdgeID")
83 assert.Nil(t, ip)
84 assert.Error(t, err)
85 assert.ErrorIs(t, err, v.ErrNoIPAddressesAvailable)
86 return ctx
87 }).
88 Test("error and do not return IP when all IP addresses are unavailable", func(ctx f2.Context, t *testing.T) f2.Context {
89 vpn.AvailableIPAddressPool = v.IPAddressPool{"1.2.3.4": "another-cluster"}
90 ip, err := vpn.RequestAvailableIPAddress("test-clusterEdgeID")
91 assert.Nil(t, ip)
92 assert.Error(t, err)
93 assert.ErrorIs(t, err, v.ErrNoIPAddressesAvailable)
94 return ctx
95 }).
96 Test("successfully return IP when IPs address are available", func(ctx f2.Context, t *testing.T) f2.Context {
97 vpn.AvailableIPAddressPool = v.IPAddressPool{"1.2.3.4": ""}
98 ip, err := vpn.RequestAvailableIPAddress("test-clusterEdgeID")
99 assert.NoError(t, err)
100 assert.Equal(t, net.ParseIP("1.2.3.4"), ip)
101 return ctx
102 }).Feature()
103 f.Test(t, feature)
104 }
105
View as plain text