@@ -3,6 +3,7 @@ package zos
33import (
44 "testing"
55
6+ "github.com/hashicorp/go-multierror"
67 "github.com/stretchr/testify/require"
78)
89
@@ -159,3 +160,112 @@ func TestValidBackendIP6(t *testing.T) {
159160 require .Error (err )
160161 })
161162}
163+
164+ func TestValidateBackends (t * testing.T ) {
165+ require := require .New (t )
166+
167+ t .Run ("empty backends" , func (t * testing.T ) {
168+ backends := []Backend {
169+ "" ,
170+ }
171+ err := ValidateBackends (backends , true )
172+ require .Error (err )
173+
174+ err = ValidateBackends (backends , false )
175+ require .Error (err )
176+ })
177+
178+ t .Run ("all valid backends with tlsPassthrough=true" , func (t * testing.T ) {
179+ backends := []Backend {
180+ "1.1.1.1:80" ,
181+ "2.2.2.2:443" ,
182+ "[2001:db8:3333:4444:CCCC:DDDD:EEEE:FFFF]:8080" ,
183+ }
184+ err := ValidateBackends (backends , true )
185+ require .NoError (err )
186+ })
187+
188+ t .Run ("all valid backends with tlsPassthrough=false" , func (t * testing.T ) {
189+ backends := []Backend {
190+ "http://1.1.1.1" ,
191+ "http://2.2.2.2:443" ,
192+ "http://[2001:db8:3333:4444:CCCC:DDDD:EEEE:FFFF]" ,
193+ }
194+ err := ValidateBackends (backends , false )
195+ require .NoError (err )
196+ })
197+
198+ t .Run ("mixed valid and invalid backends with tlsPassthrough=true" , func (t * testing.T ) {
199+ backends := []Backend {
200+ "1.1.1.1:80" ,
201+ "http://2.2.2.2:443" , // invalid (should be IP:port without http://)
202+ "2.2.2.2" , // invalid (missing port)
203+ "3.3.3.3:port" , // invalid (non-numeric port)
204+ "127.0.0.1:8080" ,
205+ "[::1]:8080" ,
206+ "[2001:db8::1]:8080" ,
207+ "2001:db8::1:8080" , // invalid (wrong IPv6 format)
208+ }
209+ err := ValidateBackends (backends , true )
210+ require .Error (err )
211+ merr , ok := err .(* multierror.Error )
212+ require .True (ok )
213+ require .Equal (4 , len (merr .Errors ))
214+ })
215+
216+ t .Run ("mixed valid and invalid backends with tlsPassthrough=false" , func (t * testing.T ) {
217+ backends := []Backend {
218+ "http://1.1.1.1" ,
219+ "1.1.1.1:80" , // invalid (needs http://)
220+ "http://2.2.2.2:443" ,
221+ "https://3.3.3.3" , // invalid (wrong scheme)
222+ "http://localhost" , // invalid (loopback)
223+ "http://127.0.0.1" , // invalid (loopback)
224+ "http://[::1]" , // invalid (loopback)
225+ "http://[2001:db8::1]:8080" ,
226+ }
227+ err := ValidateBackends (backends , false )
228+ require .Error (err )
229+ // Check that we have the expected number of errors
230+ merr , ok := err .(* multierror.Error )
231+ require .True (ok )
232+ require .Equal (5 , len (merr .Errors ))
233+ })
234+
235+ t .Run ("scheme mismatch using https when not permitted" , func (t * testing.T ) {
236+ backends := []Backend {
237+ "https://1.1.1.1" ,
238+ }
239+ err := ValidateBackends (backends , false )
240+ require .Error (err )
241+ })
242+
243+ t .Run ("scheme mismatch using http when tlsPassthrough=true" , func (t * testing.T ) {
244+ backends := []Backend {
245+ "http://1.1.1.1:80" ,
246+ }
247+ err := ValidateBackends (backends , true )
248+ require .Error (err )
249+ })
250+
251+ t .Run ("all invalid backends" , func (t * testing.T ) {
252+ backends := []Backend {
253+ "invalid" ,
254+ "1.1.1.1:port" ,
255+ "http://invalid" ,
256+ "ftp://1.1.1.1" ,
257+ }
258+
259+ err := ValidateBackends (backends , true )
260+ require .Error (err )
261+ merr , ok := err .(* multierror.Error )
262+ require .True (ok )
263+ require .Equal (4 , len (merr .Errors ))
264+
265+ err = ValidateBackends (backends , false )
266+ require .Error (err )
267+ merr , ok = err .(* multierror.Error )
268+ require .True (ok )
269+ require .Equal (4 , len (merr .Errors ))
270+ })
271+ }
0 commit comments