@@ -25,13 +25,15 @@ import (
2525 "net"
2626 "strconv"
2727 "testing"
28+ "time"
2829
2930 "github.com/google/uuid"
3031 "google.golang.org/grpc"
3132 "google.golang.org/grpc/codes"
3233 "google.golang.org/grpc/credentials/insecure"
3334 xdscreds "google.golang.org/grpc/credentials/xds"
3435 "google.golang.org/grpc/internal"
36+ "google.golang.org/grpc/internal/grpcsync"
3537 "google.golang.org/grpc/internal/testutils"
3638 "google.golang.org/grpc/internal/testutils/xds/e2e"
3739 "google.golang.org/grpc/internal/testutils/xds/e2e/setup"
@@ -78,6 +80,19 @@ func testModeChangeServerOption(t *testing.T) grpc.ServerOption {
7880 })
7981}
8082
83+ // acceptNotifyingListener wraps a listener and notifies users when a server
84+ // calls the Listener.Accept() method. This can be used to ensure that the
85+ // server is ready before requests are sent to it.
86+ type acceptNotifyingListener struct {
87+ net.Listener
88+ serverReady grpcsync.Event
89+ }
90+
91+ func (l * acceptNotifyingListener ) Accept () (net.Conn , error ) {
92+ l .serverReady .Fire ()
93+ return l .Listener .Accept ()
94+ }
95+
8196// setupGRPCServer performs the following:
8297// - spin up an xDS-enabled gRPC server, configure it with xdsCredentials and
8398// register the test service on it
@@ -110,12 +125,24 @@ func setupGRPCServer(t *testing.T, bootstrapContents []byte) (net.Listener, func
110125 t .Fatalf ("testutils.LocalTCPListener() failed: %v" , err )
111126 }
112127
128+ readyLis := & acceptNotifyingListener {
129+ Listener : lis ,
130+ serverReady : * grpcsync .NewEvent (),
131+ }
132+
113133 go func () {
114- if err := server .Serve (lis ); err != nil {
134+ if err := server .Serve (readyLis ); err != nil {
115135 t .Errorf ("Serve() failed: %v" , err )
116136 }
117137 }()
118138
139+ // Wait for the server to start running.
140+ select {
141+ case <- readyLis .serverReady .Done ():
142+ case <- time .After (defaultTestTimeout ):
143+ t .Fatalf ("Timed out while waiting for the back end server to start" )
144+ }
145+
119146 return lis , func () {
120147 server .Stop ()
121148 }
0 commit comments