@@ -16,6 +16,7 @@ package healthcheck_test
1616
1717import (
1818 "context"
19+ "errors"
1920 "fmt"
2021 "io"
2122 "net"
@@ -104,7 +105,7 @@ func TestHandleStartupWhenNotNotified(t *testing.T) {
104105 t .Logf ("failed to close proxy client: %v" , err )
105106 }
106107 }()
107- check := healthcheck .NewCheck (p , logger )
108+ check := healthcheck .NewCheck (p , logger , false )
108109
109110 rec := httptest .NewRecorder ()
110111 check .HandleStartup (rec , & http.Request {URL : & url.URL {}})
@@ -124,7 +125,7 @@ func TestHandleStartupWhenNotified(t *testing.T) {
124125 t .Logf ("failed to close proxy client: %v" , err )
125126 }
126127 }()
127- check := healthcheck .NewCheck (p , logger )
128+ check := healthcheck .NewCheck (p , logger , false )
128129
129130 check .NotifyStarted ()
130131
@@ -144,7 +145,7 @@ func TestHandleReadinessWhenNotNotified(t *testing.T) {
144145 t .Logf ("failed to close proxy client: %v" , err )
145146 }
146147 }()
147- check := healthcheck .NewCheck (p , logger )
148+ check := healthcheck .NewCheck (p , logger , false )
148149
149150 rec := httptest .NewRecorder ()
150151 check .HandleReadiness (rec , & http.Request {URL : & url.URL {}})
@@ -162,7 +163,7 @@ func TestHandleReadinessWhenStopped(t *testing.T) {
162163 t .Logf ("failed to close proxy client: %v" , err )
163164 }
164165 }()
165- check := healthcheck .NewCheck (p , logger )
166+ check := healthcheck .NewCheck (p , logger , false )
166167
167168 check .NotifyStarted () // The Proxy has started.
168169 check .NotifyStopped () // And now the Proxy is shutting down.
@@ -184,7 +185,7 @@ func TestHandleReadinessForMaxConns(t *testing.T) {
184185 }
185186 }()
186187 started := make (chan struct {})
187- check := healthcheck .NewCheck (p , logger )
188+ check := healthcheck .NewCheck (p , logger , false )
188189 go p .Serve (context .Background (), func () {
189190 check .NotifyStarted ()
190191 close (started )
@@ -224,3 +225,51 @@ func TestHandleReadinessForMaxConns(t *testing.T) {
224225 t .Fatalf ("want max connections error, got = %v" , string (body ))
225226 }
226227}
228+
229+ type errorDialer struct {
230+ fakeDialer
231+ }
232+
233+ func (* errorDialer ) Dial (_ context.Context , _ string , _ ... alloydbconn.DialOption ) (net.Conn , error ) {
234+ return nil , errors .New ("dial error" )
235+ }
236+
237+ func TestHandleReadinessWithBackendCheck (t * testing.T ) {
238+ t .Run ("when backend check passes" , func (t * testing.T ) {
239+ p := newTestProxy (t )
240+ defer p .Close ()
241+ check := healthcheck .NewCheck (p , logger , true )
242+ check .NotifyStarted ()
243+
244+ rec := httptest .NewRecorder ()
245+ check .HandleReadiness (rec , & http.Request {URL : & url.URL {}})
246+
247+ resp := rec .Result ()
248+ if got , want := resp .StatusCode , http .StatusOK ; got != want {
249+ t .Fatalf ("want = %v, got = %v" , want , got )
250+ }
251+ })
252+ t .Run ("when backend check fails" , func (t * testing.T ) {
253+ p := newProxyWithParams (t , 0 , & errorDialer {}, []proxy.InstanceConnConfig {
254+ {Name : "projects/proj/locations/region/clusters/clust/instances/inst" },
255+ })
256+ defer p .Close ()
257+ check := healthcheck .NewCheck (p , logger , true )
258+ check .NotifyStarted ()
259+
260+ rec := httptest .NewRecorder ()
261+ ctx , cancel := context .WithTimeout (context .Background (), 2 * time .Second )
262+ defer cancel ()
263+ req , _ := http .NewRequestWithContext (ctx , "GET" , "/readiness" , nil )
264+ check .HandleReadiness (rec , req )
265+
266+ resp := rec .Result ()
267+ if got , want := resp .StatusCode , http .StatusServiceUnavailable ; got != want {
268+ t .Fatalf ("want = %v, got = %v" , want , got )
269+ }
270+ body , _ := io .ReadAll (resp .Body )
271+ if ! strings .Contains (string (body ), "context deadline exceeded" ) || ! strings .Contains (string (body ), "dial error" ) {
272+ t .Fatalf ("want context deadline exceeded and dial error, got = %v" , string (body ))
273+ }
274+ })
275+ }
0 commit comments