@@ -33,16 +33,29 @@ func startEchoServer(t *testing.T) string {
3333 return ln .Addr ().String ()
3434}
3535
36+ func waitForForwarder (t * testing.T , f * Forwarder ) string {
37+ t .Helper ()
38+ for i := 0 ; i < 100 ; i ++ {
39+ addr := f .ListenAddr ()
40+ if addr != "127.0.0.1:0" {
41+ return addr
42+ }
43+ time .Sleep (5 * time .Millisecond )
44+ }
45+ t .Fatal ("forwarder did not start listening in time" )
46+ return ""
47+ }
48+
3649func TestForwardBidirectional (t * testing.T ) {
3750 echoAddr := startEchoServer (t )
3851 ctx , cancel := context .WithCancel (context .Background ())
3952 defer cancel ()
4053
4154 f := New ("127.0.0.1:0" , echoAddr )
4255 go f .Start (ctx )
43- time . Sleep ( 50 * time . Millisecond )
56+ addr := waitForForwarder ( t , f )
4457
45- conn , err := net .Dial ("tcp" , f . ListenAddr () )
58+ conn , err := net .Dial ("tcp" , addr )
4659 if err != nil {
4760 t .Fatal (err )
4861 }
@@ -67,12 +80,12 @@ func TestForwardShutdown(t *testing.T) {
6780
6881 f := New ("127.0.0.1:0" , echoAddr )
6982 go f .Start (ctx )
70- time . Sleep ( 50 * time . Millisecond )
83+ addr := waitForForwarder ( t , f )
7184
7285 cancel ()
7386 time .Sleep (50 * time .Millisecond )
7487
75- _ , err := net .DialTimeout ("tcp" , f . ListenAddr () , 100 * time .Millisecond )
88+ _ , err := net .DialTimeout ("tcp" , addr , 100 * time .Millisecond )
7689 if err == nil {
7790 t .Error ("expected connection refused after shutdown" )
7891 }
@@ -85,10 +98,10 @@ func TestForwardMultipleConnections(t *testing.T) {
8598
8699 f := New ("127.0.0.1:0" , echoAddr )
87100 go f .Start (ctx )
88- time . Sleep ( 50 * time . Millisecond )
101+ addr := waitForForwarder ( t , f )
89102
90103 for i := 0 ; i < 5 ; i ++ {
91- conn , err := net .Dial ("tcp" , f . ListenAddr () )
104+ conn , err := net .Dial ("tcp" , addr )
92105 if err != nil {
93106 t .Fatal (err )
94107 }
@@ -112,10 +125,9 @@ func TestForwardPortConflict(t *testing.T) {
112125 f1 := New ("127.0.0.1:0" , echoAddr )
113126 errCh1 := make (chan error , 1 )
114127 go func () { errCh1 <- f1 .Start (ctx ) }()
115- time . Sleep ( 50 * time . Millisecond )
128+ boundAddr := waitForForwarder ( t , f1 )
116129
117130 // Sanity-check: the first forwarder should be working.
118- boundAddr := f1 .ListenAddr ()
119131 conn , err := net .Dial ("tcp" , boundAddr )
120132 if err != nil {
121133 t .Fatalf ("first forwarder unreachable: %v" , err )
@@ -170,9 +182,9 @@ func TestForwardHalfClose(t *testing.T) {
170182
171183 f := New ("127.0.0.1:0" , serverAddr )
172184 go f .Start (ctx )
173- time . Sleep ( 50 * time . Millisecond )
185+ addr := waitForForwarder ( t , f )
174186
175- conn , err := net .Dial ("tcp" , f . ListenAddr () )
187+ conn , err := net .Dial ("tcp" , addr )
176188 if err != nil {
177189 t .Fatal (err )
178190 }
0 commit comments