1+ //go:build !race
2+
3+ // note race detection on this test progressively slows down the test until it stops working
4+ //
15package main
26
37import (
@@ -11,6 +15,8 @@ import (
1115 "encoding/json"
1216 "fmt"
1317 "io"
18+ "os/exec"
19+ "sync"
1420 "time"
1521
1622 // "strings"
@@ -41,9 +47,24 @@ func testConnectProxy(t *testing.T) {
4147 ctx , cancel := context .WithCancel (context .Background ())
4248 defer cancel ()
4349
50+ func () {
51+ fmt .Printf (`
52+
53+ ** This test requires many file descriptions.
54+ ** Setting "ulimit -n 1048576".
55+ ** The value will not be reset when the test ends.
56+
57+ ` )
58+ _ , err := exec .Command ("/bin/sh" , "-c" , "ulimit -n 1048576" ).CombinedOutput ()
59+ if err != nil {
60+ panic (err )
61+ }
62+ }()
63+
4464 maxMessageContentSize := model .ByteCount (4096 )
4565
46- // sequenceIdleTimeout := 100 * time.Millisecond
66+ // clean up lingering residents at this timeout
67+ // idleTimeout := 5 * time.Minute
4768 // receiveTimeout := 900 * time.Second
4869 // minResendInterval := 10 * time.Millisecond
4970 // standardContractTransferByteCount := 4 * maxMessageContentSize
@@ -123,8 +144,8 @@ func testConnectProxy(t *testing.T) {
123144
124145 settings := DefaultExchangeSettings ()
125146 settings .ExchangeBufferSize = 0
126- // settings.ResidentIdleTimeout = sequenceIdleTimeout
127- // settings.ForwardIdleTimeout = sequenceIdleTimeout
147+ // settings.ResidentIdleTimeout = idleTimeout
148+ // settings.ForwardIdleTimeout = idleTimeout
128149 settings .FramerSettings .MaxMessageLen = int (2 * maxMessageContentSize )
129150 settings .ForwardEnforceActiveContracts = true
130151 settings .IngressSecurityPolicyGenerator = connect .DisableSecurityPolicyWithStats
@@ -244,7 +265,6 @@ func testConnectProxy(t *testing.T) {
244265
245266 platformUrl , port := randServerUrl ()
246267 providerTransportSettings := connect .DefaultPlatformTransportSettings ()
247- providerTransportSettings .QuicTlsConfig .InsecureSkipVerify = true
248268 providerTransportSettings .H3Port = port + 443
249269 providerTransportSettings .DnsPort = port + 53
250270 providerTransportSettings .FramerSettings .MaxMessageLen = int (2 * maxMessageContentSize )
@@ -273,7 +293,7 @@ func testConnectProxy(t *testing.T) {
273293 }
274294
275295 providerClientIds := []server.Id {}
276- for range 2 {
296+ for range 32 {
277297 providerClientId := runProvider ()
278298 // providerClientId := server.NewId()
279299 providerClientIds = append (providerClientIds , providerClientId )
@@ -283,7 +303,7 @@ func testConnectProxy(t *testing.T) {
283303 case <- time .After (2 * time .Second ):
284304 }
285305
286- for range 2 {
306+ for i := range 1024 {
287307 // create a proxy client, connect to a random server, and route to a random provider
288308
289309 providerClientId := providerClientIds [mathrand .Intn (len (providerClientIds ))]
@@ -353,10 +373,10 @@ func testConnectProxy(t *testing.T) {
353373 // TODO for some reason go does not pass the host header in the proxy
354374 // TODO force the auth token
355375 // FIXME see ProxyConnectHeader
356- addr , _ := randHttpsPoxyServerHostPort ()
357- httpsProxyUrlStr := fmt .Sprintf ("https://%s" , addr )
358- httpsProxyUrl , err := url .Parse (httpsProxyUrlStr )
359- assert .Equal (t , err , nil )
376+ // addr, _ := randHttpsPoxyServerHostPort()
377+ // httpsProxyUrlStr := fmt.Sprintf("https://%s", addr)
378+ // httpsProxyUrl, err := url.Parse(httpsProxyUrlStr)
379+ // assert.Equal(t, err, nil)
360380
361381 // proxyDialer := &net.Dialer{
362382 // Timeout: 15 * time.Second,
@@ -369,26 +389,34 @@ func testConnectProxy(t *testing.T) {
369389 proxyConnectHeader .Add ("Proxy-Authorization" , fmt .Sprintf ("Bearer %s" , result .ProxyConfigResult .AuthToken ))
370390
371391 proxyHttpClient := & http.Client {
372- Timeout : 60 * time .Second ,
392+ Timeout : 120 * time .Second ,
373393 Transport : & http.Transport {
394+ // MaxIdleConns: 1, // Max idle connections in the pool
395+ // IdleConnTimeout: 30 * time.Second, // Max time an idle connection stays open
396+ // DisableKeepAlives: true,
374397 // TLSHandshakeTimeout: 15 * time.Second,
375- Proxy : http .ProxyURL (httpsProxyUrl ),
398+ // Proxy: http.ProxyURL(httpsProxyUrl),
399+ Proxy : func (r * http.Request ) (* url.URL , error ) {
400+ addr , _ := randHttpsPoxyServerHostPort ()
401+ httpsProxyUrlStr := fmt .Sprintf ("https://%s" , addr )
402+ return url .Parse (httpsProxyUrlStr )
403+ },
376404 // DialContext: func(ctx context.Context, network string, addr string) (net.Conn, error) {
377405 // addr, _ = randServerHostPort()
378406 // fmt.Printf("DIAL %s VIA %s %s\n", httpsProxyUrl, network, addr)
379407 // return proxyDialer.DialContext(ctx, network, addr)
380408 // },
381409 ProxyConnectHeader : proxyConnectHeader ,
382- TLSClientConfig : & tls.Config {
383- InsecureSkipVerify : true ,
384- },
385410 },
386411 }
387412
388- for range 2 {
413+ runOne := func () {
414+ // var err error
415+ // for range 2 {
389416 addr , _ := randServerHostPort ()
390417 targetUrlString := fmt .Sprintf ("https://%s/status" , addr )
391418 // targetUrlString := "https://api.bringyour.com/hello"
419+ // var r *http.Response
392420 r , err := proxyHttpClient .Get (targetUrlString )
393421 assert .Equal (t , err , nil )
394422 if err == nil {
@@ -399,8 +427,33 @@ func testConnectProxy(t *testing.T) {
399427 err = json .Unmarshal (b , & m )
400428 assert .Equal (t , err , nil )
401429 assert .NotEqual (t , m ["client_address" ], nil )
430+ return
402431 }
432+ // FIXME
433+ // else something flaky about the proxy connection
434+ // try again
435+ // }
436+ // assert.Equal(t, err, nil)
437+ }
438+
439+ // run in serial
440+ for j := range 32 {
441+ fmt .Printf ("[%d][%d][s]start\n " , i , j )
442+ runOne ()
443+ }
444+
445+ // run in parallel
446+ var wg sync.WaitGroup
447+ for j := range 32 {
448+ wg .Add (1 )
449+ go func () {
450+ defer wg .Done ()
451+
452+ fmt .Printf ("[%d][%d][p]start\n " , i , j )
453+ runOne ()
454+ }()
403455 }
456+ wg .Wait ()
404457
405458 proxyHttpClient .CloseIdleConnections ()
406459
0 commit comments