14
14
package proxy
15
15
16
16
import (
17
+ "crypto/tls"
18
+ "crypto/x509"
19
+ "io/ioutil"
17
20
"net/http"
18
21
"reflect"
19
22
"runtime"
@@ -26,21 +29,33 @@ import (
26
29
"github.com/stretchr/testify/assert"
27
30
"github.com/stretchr/testify/require"
28
31
32
+ "github.com/mendersoftware/mender/client"
29
33
cltest "github.com/mendersoftware/mender/client/test"
34
+ "github.com/mendersoftware/mender/conf"
30
35
)
31
36
32
- func prepareProxyWsTest (
33
- t * testing.T ,
34
- srv * cltest.ClientTestWsServer ,
35
- ) (* ProxyController , * websocket.Conn ) {
37
+ func prepareProxyWsTest (t * testing.T , srv * cltest.ClientTestWsServer ) * ProxyController {
38
+
39
+ wsDialer , err := client .NewWebsocketDialer (client.Config {})
40
+ require .NoError (t , err )
41
+
36
42
proxyController , err := NewProxyController (
37
43
& http.Client {},
38
- nil ,
44
+ wsDialer ,
39
45
srv .TestServer .URL ,
40
46
"SecretJwtToken" ,
41
47
)
42
48
require .NoError (t , err )
43
49
50
+ return proxyController
51
+ }
52
+
53
+ func connectProxyWsTest (
54
+ t * testing.T ,
55
+ srv * cltest.ClientTestWsServer ,
56
+ proxyController * ProxyController ,
57
+ ) * websocket.Conn {
58
+
44
59
proxyServerUrl := proxyController .GetServerUrl ()
45
60
require .Contains (t , proxyServerUrl , "http://localhost" )
46
61
@@ -51,14 +66,25 @@ func prepareProxyWsTest(
51
66
require .NoError (t , err )
52
67
require .Equal (t , http .StatusSwitchingProtocols , resp .StatusCode )
53
68
54
- return proxyController , conn
69
+ return conn
55
70
}
56
71
57
- func TestProxyWsConnect ( t * testing. T ) {
58
- srv := cltest . NewClientTestWsServer ()
59
- defer srv . StopWs ()
60
- defer srv . Close ()
72
+ func prepareAndConnectProxyWsTest (
73
+ t * testing. T ,
74
+ srv * cltest. ClientTestWsServer ,
75
+ ) ( * ProxyController , * websocket. Conn ) {
61
76
77
+ proxyController := prepareProxyWsTest (t , srv )
78
+ conn := connectProxyWsTest (t , srv , proxyController )
79
+
80
+ return proxyController , conn
81
+ }
82
+
83
+ func runTestSendReceiveWs (
84
+ t * testing.T ,
85
+ srv * cltest.ClientTestWsServer ,
86
+ proxyController * ProxyController ,
87
+ ) {
62
88
// Expectations for the test
63
89
srv .Connect .SendMessages = append (
64
90
srv .Connect .SendMessages ,
@@ -82,8 +108,8 @@ func TestProxyWsConnect(t *testing.T) {
82
108
{MsgType : websocket .TextMessage , Msg : []byte ("hello-world" )},
83
109
}
84
110
85
- proxyController , conn := prepareProxyWsTest (t , srv )
86
- defer proxyController . Stop ()
111
+ conn := connectProxyWsTest (t , srv , proxyController )
112
+
87
113
defer conn .Close ()
88
114
89
115
wg := sync.WaitGroup {}
@@ -150,6 +176,17 @@ func TestProxyWsConnect(t *testing.T) {
150
176
)
151
177
}
152
178
179
+ func TestProxyWsConnect (t * testing.T ) {
180
+ srv := cltest .NewClientTestWsServer ()
181
+ defer srv .StopWs ()
182
+ defer srv .Close ()
183
+
184
+ proxyController := prepareProxyWsTest (t , srv )
185
+ defer proxyController .Stop ()
186
+
187
+ runTestSendReceiveWs (t , srv , proxyController )
188
+ }
189
+
153
190
func TestProxyWsWebSocketProtocolHeader (t * testing.T ) {
154
191
srv := cltest .NewClientTestWsServer ()
155
192
defer srv .StopWs ()
@@ -195,7 +232,7 @@ func TestProxyWsTooMany(t *testing.T) {
195
232
defer srv .StopWs ()
196
233
defer srv .Close ()
197
234
198
- proxyController , conn := prepareProxyWsTest (t , srv )
235
+ proxyController , conn := prepareAndConnectProxyWsTest (t , srv )
199
236
defer proxyController .Stop ()
200
237
defer conn .Close ()
201
238
@@ -218,7 +255,7 @@ func TestProxyWsStop(t *testing.T) {
218
255
defer srv .StopWs ()
219
256
defer srv .Close ()
220
257
221
- proxyController , conn := prepareProxyWsTest (t , srv )
258
+ proxyController , conn := prepareAndConnectProxyWsTest (t , srv )
222
259
defer proxyController .Stop ()
223
260
defer conn .Close ()
224
261
@@ -309,3 +346,91 @@ func TestProxyWsGoroutines(t *testing.T) {
309
346
1 * time .Millisecond ,
310
347
)
311
348
}
349
+
350
+ func TestProxyWsConnectCustomCert (t * testing.T ) {
351
+ serverCert , err := tls .LoadX509KeyPair (
352
+ "../../client/test/server.crt" ,
353
+ "../../client/test/server.key" ,
354
+ )
355
+ require .NoError (t , err )
356
+
357
+ tc := tls.Config {
358
+ Certificates : []tls.Certificate {serverCert },
359
+ }
360
+
361
+ srv := cltest .NewClientTestWsServer (& tc )
362
+ defer srv .StopWs ()
363
+ defer srv .Close ()
364
+
365
+ conffromfile := conf.MenderConfigFromFile {
366
+ ServerCertificate : "../../client/test/server.crt" ,
367
+ }
368
+ testconf := & conf.MenderConfig {MenderConfigFromFile : conffromfile }
369
+ httpConfig := testconf .GetHttpConfig ()
370
+
371
+ api , err := client .New (httpConfig )
372
+ require .NoError (t , err )
373
+
374
+ wsDialer , err := client .NewWebsocketDialer (httpConfig )
375
+ require .NoError (t , err )
376
+
377
+ proxyController , err := NewProxyController (
378
+ api ,
379
+ wsDialer ,
380
+ srv .TestServer .URL ,
381
+ "SecretJwtToken" ,
382
+ )
383
+ require .NoError (t , err )
384
+ defer proxyController .Stop ()
385
+
386
+ runTestSendReceiveWs (t , srv , proxyController )
387
+ }
388
+ func TestProxyWsConnectMutualTLS (t * testing.T ) {
389
+ serverCert , err := tls .LoadX509KeyPair (
390
+ "../../client/test/server.crt" ,
391
+ "../../client/test/server.key" ,
392
+ )
393
+ require .NoError (t , err )
394
+
395
+ clientClientCertPool := x509 .NewCertPool ()
396
+ pb , err := ioutil .ReadFile ("../../client/testdata/client.crt" )
397
+ require .NoError (t , err )
398
+ clientClientCertPool .AppendCertsFromPEM (pb )
399
+
400
+ tc := tls.Config {
401
+ Certificates : []tls.Certificate {serverCert },
402
+ ClientAuth : tls .RequireAndVerifyClientCert ,
403
+ ClientCAs : clientClientCertPool ,
404
+ }
405
+
406
+ srv := cltest .NewClientTestWsServer (& tc )
407
+ defer srv .StopWs ()
408
+ defer srv .Close ()
409
+
410
+ conffromfile := conf.MenderConfigFromFile {
411
+ ServerCertificate : "../../client/test/server.crt" ,
412
+ HttpsClient : client.HttpsClient {
413
+ Certificate : "../../client/testdata/client.crt" ,
414
+ Key : "../../client/testdata/client-cert.key" ,
415
+ },
416
+ }
417
+ testconf := & conf.MenderConfig {MenderConfigFromFile : conffromfile }
418
+ httpConfig := testconf .GetHttpConfig ()
419
+
420
+ api , err := client .New (httpConfig )
421
+ require .NoError (t , err )
422
+
423
+ wsDialer , err := client .NewWebsocketDialer (httpConfig )
424
+ require .NoError (t , err )
425
+
426
+ proxyController , err := NewProxyController (
427
+ api ,
428
+ wsDialer ,
429
+ srv .TestServer .URL ,
430
+ "SecretJwtToken" ,
431
+ )
432
+ require .NoError (t , err )
433
+ defer proxyController .Stop ()
434
+
435
+ runTestSendReceiveWs (t , srv , proxyController )
436
+ }
0 commit comments