X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/644f5de63e2b8b02e054fcbb3e9af39560cffae3..646ea4328be842f4baa194205618c01910ec49db:/services/keepstore/handler_test.go diff --git a/services/keepstore/handler_test.go b/services/keepstore/handler_test.go index 4d042a70dd..ad907ef101 100644 --- a/services/keepstore/handler_test.go +++ b/services/keepstore/handler_test.go @@ -28,8 +28,13 @@ import ( "git.curoverse.com/arvados.git/sdk/go/arvados" "git.curoverse.com/arvados.git/sdk/go/arvadostest" + "github.com/prometheus/client_golang/prometheus" ) +var testCluster = &arvados.Cluster{ + ClusterID: "zzzzz", +} + // A RequestTester represents the parameters for an HTTP request to // be issued on behalf of a unit test. type RequestTester struct { @@ -45,6 +50,7 @@ type RequestTester struct { // - permissions on, authenticated request, unsigned locator // - permissions on, unauthenticated request, signed locator // - permissions on, authenticated request, expired locator +// - permissions on, authenticated request, signed locator, transient error from backend // func TestGetHandler(t *testing.T) { defer teardown() @@ -147,6 +153,23 @@ func TestGetHandler(t *testing.T) { ExpectStatusCode(t, "Authenticated request, expired locator", ExpiredError.HTTPCode, response) + + // Authenticated request, signed locator + // => 503 Server busy (transient error) + + // Set up the block owning volume to respond with errors + vols[0].(*MockVolume).Bad = true + vols[0].(*MockVolume).BadVolumeError = VolumeBusyError + response = IssueRequest(&RequestTester{ + method: "GET", + uri: signedLocator, + apiToken: knownToken, + }) + // A transient error from one volume while the other doesn't find the block + // should make the service return a 503 so that clients can retry. + ExpectStatusCode(t, + "Volume backend busy", + 503, response) } // Test PutBlockHandler on the following situations: @@ -823,7 +846,7 @@ func IssueRequest(rt *RequestTester) *httptest.ResponseRecorder { if rt.apiToken != "" { req.Header.Set("Authorization", "OAuth2 "+rt.apiToken) } - loggingRouter := MakeRESTRouter() + loggingRouter := MakeRESTRouter(testCluster, prometheus.NewRegistry()) loggingRouter.ServeHTTP(response, req) return response } @@ -835,7 +858,7 @@ func IssueHealthCheckRequest(rt *RequestTester) *httptest.ResponseRecorder { if rt.apiToken != "" { req.Header.Set("Authorization", "Bearer "+rt.apiToken) } - loggingRouter := MakeRESTRouter() + loggingRouter := MakeRESTRouter(testCluster, prometheus.NewRegistry()) loggingRouter.ServeHTTP(response, req) return response } @@ -975,7 +998,7 @@ func TestGetHandlerClientDisconnect(t *testing.T) { ok := make(chan struct{}) go func() { req, _ := http.NewRequest("GET", fmt.Sprintf("/%s+%d", TestHash, len(TestBlock)), nil) - MakeRESTRouter().ServeHTTP(resp, req) + MakeRESTRouter(testCluster, prometheus.NewRegistry()).ServeHTTP(resp, req) ok <- struct{}{} }() @@ -1107,7 +1130,7 @@ func TestUntrashHandler(t *testing.T) { response = IssueRequest(datamanagerWrongMethodReq) ExpectStatusCode(t, "Only PUT method is supported for untrash", - http.StatusBadRequest, + http.StatusMethodNotAllowed, response) // datamanagerReq => StatusOK