func newAsynchronousResponse() *http.Response { r := mocks.NewResponseWithStatus("201 Created", http.StatusCreated) r.Body = mocks.NewBody(fmt.Sprintf(pollingStateFormat, operationInProgress)) mocks.SetResponseHeader(r, http.CanonicalHeaderKey(headerAsyncOperation), mocks.TestAzureAsyncURL) mocks.SetResponseHeader(r, http.CanonicalHeaderKey(autorest.HeaderLocation), mocks.TestLocationURL) mocks.SetRetryHeader(r, retryDelay) r.Request = mocks.NewRequestForURL(mocks.TestURL) return r }
func TestRequestErrorString_WithError(t *testing.T) { j := `{ "error": { "code": "InternalError", "message": "Conflict", "details": [{"code": "conflict1", "message":"error message1"}] } }` uuid := "71FDB9F4-5E49-4C12-B266-DE7B4FD999A6" r := mocks.NewResponseWithContent(j) mocks.SetResponseHeader(r, HeaderRequestID, uuid) r.Request = mocks.NewRequest() r.StatusCode = http.StatusInternalServerError r.Status = http.StatusText(r.StatusCode) err := autorest.Respond(r, WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) if err == nil { t.Fatalf("azure: returned nil error for proper error response") } azErr, _ := err.(*RequestError) expected := "autorest/azure: Service returned an error. Status=500 Code=\"InternalError\" Message=\"Conflict\" Details=[{\"code\":\"conflict1\",\"message\":\"error message1\"}]" if expected != azErr.Error() { t.Fatalf("azure: send wrong RequestError.\nexpected=%v\ngot=%v", expected, azErr.Error()) } }
func TestWithErrorUnlessStatusCode_FoundAzureErrorWithDetails(t *testing.T) { j := `{ "error": { "code": "InternalError", "message": "Azure is having trouble right now.", "details": [{"code": "conflict1", "message":"error message1"}, {"code": "conflict2", "message":"error message2"}] } }` uuid := "71FDB9F4-5E49-4C12-B266-DE7B4FD999A6" r := mocks.NewResponseWithContent(j) mocks.SetResponseHeader(r, HeaderRequestID, uuid) r.Request = mocks.NewRequest() r.StatusCode = http.StatusInternalServerError r.Status = http.StatusText(r.StatusCode) err := autorest.Respond(r, WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) if err == nil { t.Fatalf("azure: returned nil error for proper error response") } azErr, ok := err.(*RequestError) if !ok { t.Fatalf("azure: returned error is not azure.RequestError: %T", err) } if expected := "InternalError"; azErr.ServiceError.Code != expected { t.Fatalf("azure: wrong error code. expected=%q; got=%q", expected, azErr.ServiceError.Code) } if azErr.ServiceError.Message == "" { t.Fatalf("azure: error message is not unmarshaled properly") } b, _ := json.Marshal(*azErr.ServiceError.Details) if string(b) != `[{"code":"conflict1","message":"error message1"},{"code":"conflict2","message":"error message2"}]` { t.Fatalf("azure: error details is not unmarshaled properly") } if expected := http.StatusInternalServerError; azErr.StatusCode != expected { t.Fatalf("azure: got wrong StatusCode=%v Expected=%d", azErr.StatusCode, expected) } if expected := uuid; azErr.RequestID != expected { t.Fatalf("azure: wrong request ID in error. expected=%q; got=%q", expected, azErr.RequestID) } _ = azErr.Error() // the error body should still be there defer r.Body.Close() b, err = ioutil.ReadAll(r.Body) if err != nil { t.Fatal(err) } if string(b) != j { t.Fatalf("response body is wrong. got=%q expected=%q", string(b), j) } }
func TestExtractRequestID(t *testing.T) { uuid := "71FDB9F4-5E49-4C12-B266-DE7B4FD999A6" resp := mocks.NewResponse() mocks.SetResponseHeader(resp, HeaderRequestID, uuid) if ExtractRequestID(resp) != uuid { t.Errorf("azure: ExtractRequestID failed to extract the %s -- expected %s, received %s", HeaderRequestID, uuid, ExtractRequestID(resp)) } }
func TestExtractHeaderValue(t *testing.T) { r := mocks.NewResponse() v := "v1" mocks.SetResponseHeader(r, mocks.TestHeader, v) if ExtractHeaderValue(mocks.TestHeader, r) != v { t.Errorf("autorest: ExtractHeader failed to retrieve the expected header -- expected [%s]%v, received [%s]%v", mocks.TestHeader, v, mocks.TestHeader, ExtractHeaderValue(mocks.TestHeader, r)) } }
func TestWithErrorUnlessStatusCode_NoAzureError(t *testing.T) { j := `{ "Status":"NotFound" }` uuid := "71FDB9F4-5E49-4C12-B266-DE7B4FD999A6" r := mocks.NewResponseWithContent(j) mocks.SetResponseHeader(r, HeaderRequestID, uuid) r.Request = mocks.NewRequest() r.StatusCode = http.StatusInternalServerError r.Status = http.StatusText(r.StatusCode) err := autorest.Respond(r, WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) if err == nil { t.Fatalf("azure: returned nil error for proper error response") } azErr, ok := err.(*RequestError) if !ok { t.Fatalf("azure: returned error is not azure.RequestError: %T", err) } expected := &ServiceError{ Code: "Unknown", Message: "Unknown service error", } if !reflect.DeepEqual(expected, azErr.ServiceError) { t.Fatalf("azure: service error is not unmarshaled properly. expected=%q\ngot=%q", expected, azErr.ServiceError) } if expected := http.StatusInternalServerError; azErr.StatusCode != expected { t.Fatalf("azure: got wrong StatusCode=%v Expected=%d", azErr.StatusCode, expected) } if expected := uuid; azErr.RequestID != expected { t.Fatalf("azure: wrong request ID in error. expected=%q; got=%q", expected, azErr.RequestID) } _ = azErr.Error() // the error body should still be there defer r.Body.Close() b, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatal(err) } if string(b) != j { t.Fatalf("response body is wrong. got=%q expected=%q", string(b), j) } }
func TestWithErrorUnlessStatusCode_FoundAzureErrorWithoutDetails(t *testing.T) { j := `{ "error": { "code": "InternalError", "message": "Azure is having trouble right now." } }` uuid := "71FDB9F4-5E49-4C12-B266-DE7B4FD999A6" r := mocks.NewResponseWithContent(j) mocks.SetResponseHeader(r, HeaderRequestID, uuid) r.Request = mocks.NewRequest() r.StatusCode = http.StatusInternalServerError r.Status = http.StatusText(r.StatusCode) err := autorest.Respond(r, WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) if err == nil { t.Fatalf("azure: returned nil error for proper error response") } azErr, ok := err.(*RequestError) if !ok { t.Fatalf("azure: returned error is not azure.RequestError: %T", err) } expected := "autorest/azure: Service returned an error. Status=500 Code=\"InternalError\" Message=\"Azure is having trouble right now.\"" if !reflect.DeepEqual(expected, azErr.Error()) { t.Fatalf("azure: service error is not unmarshaled properly.\nexpected=%v\ngot=%v", expected, azErr.Error()) } if expected := http.StatusInternalServerError; azErr.StatusCode != expected { t.Fatalf("azure: got wrong StatusCode=%d Expected=%d", azErr.StatusCode, expected) } if expected := uuid; azErr.RequestID != expected { t.Fatalf("azure: wrong request ID in error. expected=%q; got=%q", expected, azErr.RequestID) } _ = azErr.Error() // the error body should still be there defer r.Body.Close() b, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatal(err) } if string(b) != j { t.Fatalf("response body is wrong. got=%q expected=%q", string(b), j) } }
func TestDoPollForAsynchronous_DoesNotPollIfCreatingOperationRequestFails(t *testing.T) { r1 := newAsynchronousResponse() mocks.SetResponseHeader(r1, http.CanonicalHeaderKey(headerAsyncOperation), mocks.TestBadURL) r2 := newOperationResourceResponse("busy") client := mocks.NewSender() client.AppendResponse(r1) client.AppendAndRepeatResponse(r2, 2) r, _ := autorest.SendWithSender(client, mocks.NewRequest(), DoPollForAsynchronous(time.Millisecond)) if client.Attempts() > 1 { t.Fatalf("azure: DoPollForAsynchronous polled with an invalidly formed operation request") } autorest.Respond(r, autorest.ByClosing()) }
func setRetryHeader(resp *http.Response, delay time.Duration) { mocks.SetResponseHeader(resp, http.CanonicalHeaderKey(headerRetryAfter), fmt.Sprintf("%v", delay.Seconds())) }
func setLocationHeader(resp *http.Response, location string) { mocks.SetResponseHeader(resp, http.CanonicalHeaderKey(headerLocation), location) }