cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2021.1.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

edgediscovery/edgediscovery_test.go

167lines · modecode

1package edgediscovery
2
3import (
4 "net"
5 "testing"
6
7 "github.com/rs/zerolog"
8 "github.com/stretchr/testify/assert"
9)
10
11var (
12 addr0 = net.TCPAddr{
13 IP: net.ParseIP("123.0.0.0"),
14 Port: 8000,
15 Zone: "",
16 }
17 addr1 = net.TCPAddr{
18 IP: net.ParseIP("123.0.0.1"),
19 Port: 8000,
20 Zone: "",
21 }
22 addr2 = net.TCPAddr{
23 IP: net.ParseIP("123.0.0.2"),
24 Port: 8000,
25 Zone: "",
26 }
27 addr3 = net.TCPAddr{
28 IP: net.ParseIP("123.0.0.3"),
29 Port: 8000,
30 Zone: "",
31 }
32
33 log = zerolog.Nop()
34)
35
36func TestGiveBack(t *testing.T) {
37 edge := MockEdge(&log, []*net.TCPAddr{&addr0, &addr1, &addr2, &addr3})
38
39 // Give this connection an address
40 assert.Equal(t, 4, edge.AvailableAddrs())
41 const connID = 0
42 addr, err := edge.GetAddr(connID)
43 assert.NoError(t, err)
44 assert.NotNil(t, addr)
45 assert.Equal(t, 3, edge.AvailableAddrs())
46
47 // Get it back
48 edge.GiveBack(addr)
49 assert.Equal(t, 4, edge.AvailableAddrs())
50}
51
52func TestRPCAndProxyShareSingleEdgeIP(t *testing.T) {
53 // Make an edge with a single IP
54 edge := MockEdge(&log, []*net.TCPAddr{&addr0})
55 tunnelConnID := 0
56
57 // Use the IP for a tunnel
58 addrTunnel, err := edge.GetAddr(tunnelConnID)
59 assert.NoError(t, err)
60
61 // Ensure the IP can be used for RPC too
62 addrRPC, err := edge.GetAddrForRPC()
63 assert.NoError(t, err)
64 assert.Equal(t, addrTunnel, addrRPC)
65}
66
67func TestGetAddrForRPC(t *testing.T) {
68 edge := MockEdge(&log, []*net.TCPAddr{&addr0, &addr1, &addr2, &addr3})
69
70 // Get a connection
71 assert.Equal(t, 4, edge.AvailableAddrs())
72 addr, err := edge.GetAddrForRPC()
73 assert.NoError(t, err)
74 assert.NotNil(t, addr)
75
76 // Using an address for RPC shouldn't consume it
77 assert.Equal(t, 4, edge.AvailableAddrs())
78
79 // Get it back
80 edge.GiveBack(addr)
81 assert.Equal(t, 4, edge.AvailableAddrs())
82}
83
84func TestOnePerRegion(t *testing.T) {
85 // Make an edge with only one address
86 edge := MockEdge(&log, []*net.TCPAddr{&addr0, &addr1})
87
88 // Use the only address
89 const connID = 0
90 a1, err := edge.GetAddr(connID)
91 assert.NoError(t, err)
92 assert.NotNil(t, a1)
93
94 // if the first address is bad, get the second one
95 a2, err := edge.GetDifferentAddr(connID)
96 assert.NoError(t, err)
97 assert.NotNil(t, a2)
98 assert.NotEqual(t, a1, a2)
99
100 // now that second one is bad, get the first one again
101 a3, err := edge.GetDifferentAddr(connID)
102 assert.NoError(t, err)
103 assert.Equal(t, a1, a3)
104}
105
106func TestOnlyOneAddrLeft(t *testing.T) {
107 // Make an edge with only one address
108 edge := MockEdge(&log, []*net.TCPAddr{&addr0})
109
110 // Use the only address
111 const connID = 0
112 addr, err := edge.GetAddr(connID)
113 assert.NoError(t, err)
114 assert.NotNil(t, addr)
115
116 // If that edge address is "bad", there's no alternative address.
117 _, err = edge.GetDifferentAddr(connID)
118 assert.Error(t, err)
119
120 // previously bad address should become available again on next iteration.
121 addr, err = edge.GetDifferentAddr(connID)
122 assert.NoError(t, err)
123 assert.NotNil(t, addr)
124}
125
126func TestNoAddrsLeft(t *testing.T) {
127 // Make an edge with no addresses
128 edge := MockEdge(&log, []*net.TCPAddr{})
129
130 _, err := edge.GetAddr(2)
131 assert.Error(t, err)
132 _, err = edge.GetAddrForRPC()
133 assert.Error(t, err)
134}
135
136func TestGetAddr(t *testing.T) {
137 edge := MockEdge(&log, []*net.TCPAddr{&addr0, &addr1, &addr2, &addr3})
138
139 // Give this connection an address
140 const connID = 0
141 addr, err := edge.GetAddr(connID)
142 assert.NoError(t, err)
143 assert.NotNil(t, addr)
144
145 // If the same connection requests another address, it should get the same one.
146 addr2, err := edge.GetAddr(connID)
147 assert.NoError(t, err)
148 assert.Equal(t, addr, addr2)
149}
150
151func TestGetDifferentAddr(t *testing.T) {
152 edge := MockEdge(&log, []*net.TCPAddr{&addr0, &addr1, &addr2, &addr3})
153
154 // Give this connection an address
155 assert.Equal(t, 4, edge.AvailableAddrs())
156 const connID = 0
157 addr, err := edge.GetAddr(connID)
158 assert.NoError(t, err)
159 assert.NotNil(t, addr)
160 assert.Equal(t, 3, edge.AvailableAddrs())
161
162 // If the same connection requests another address, it should get the same one.
163 addr2, err := edge.GetDifferentAddr(connID)
164 assert.NoError(t, err)
165 assert.NotEqual(t, addr, addr2)
166 assert.Equal(t, 3, edge.AvailableAddrs())
167}
168