func TestClientPollAsNeededPollsForDuration(t *testing.T) { c := Client{} c.PollingMode = PollUntilDuration c.PollingDuration = 10 * time.Millisecond s := mocks.NewSender() s.EmitStatus("202 Accepted", http.StatusAccepted) c.Sender = s r := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(r) s.SetResponse(r) d1 := 10 * time.Millisecond start := time.Now() resp, _ := c.PollAsNeeded(r) d2 := time.Now().Sub(start) if d2 < d1 { t.Errorf("autorest: Client#PollAsNeeded did not poll for the expected duration -- expected %v, actual %v", d1.Seconds(), d2.Seconds()) } Respond(resp, ByClosing()) }
func TestDoPollForStatusCodes_CanBeCanceled(t *testing.T) { cancel := make(chan struct{}) delay := 5 * time.Second r := mocks.NewResponse() mocks.SetAcceptedHeaders(r) client := mocks.NewSender() client.AppendAndRepeatResponse(r, 100) var wg sync.WaitGroup wg.Add(1) start := time.Now() go func() { wg.Done() r, _ := SendWithSender(client, mocks.NewRequest(), DoPollForStatusCodes(time.Millisecond, time.Millisecond, http.StatusAccepted)) Respond(r, ByClosing()) }() wg.Wait() close(cancel) time.Sleep(5 * time.Millisecond) if time.Since(start) >= delay { t.Fatalf("autorest: Sender#DoPollForStatusCodes failed to cancel") } }
func TestResponseRequiresPollingReturnsFalseForUnexpectedStatusCodes(t *testing.T) { resp := mocks.NewResponseWithStatus("500 InternalServerError", http.StatusInternalServerError) mocks.SetAcceptedHeaders(resp) if ResponseRequiresPolling(resp) { t.Error("autorest: ResponseRequiresPolling did not return false when ignoring a status code") } }
func TestResponseRequiresPollingDefaultsToAcceptedStatusCode(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) if !ResponseRequiresPolling(resp) { t.Error("autorest: ResponseRequiresPolling failed to create a request for default 202 Accepted status code") } }
func TestNewPollingRequestReturnsAnErrorWhenPrepareFails(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) _, err := NewPollingRequest(resp, mockFailingAuthorizer{}) if err == nil { t.Error("autorest: NewPollingRequest failed to return an error when Prepare fails") } }
func TestNewPollingRequestReturnsAGetRequest(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) req, _ := NewPollingRequest(resp, nil) if req.Method != "GET" { t.Fatalf("autorest: NewPollingRequest did not create an HTTP GET request -- actual method %v", req.Method) } }
func TestNewPollingRequestProvidesTheURL(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) req, _ := NewPollingRequest(resp, nil) if req.URL.String() != mocks.TestURL { t.Fatalf("autorest: NewPollingRequest did not create an HTTP with the expected URL -- received %v, expected %v", req.URL, mocks.TestURL) } }
func TestGetLocation(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) l := GetLocation(resp) if len(l) == 0 { t.Fatalf("autorest: GetLocation failed to return Location header -- expected %v, received %v", mocks.TestURL, l) } }
func TestGetRetryAfter(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) d := GetRetryAfter(resp, DefaultPollingDelay) if d != mocks.TestDelay { t.Fatalf("autorest: GetRetryAfter failed to returned the expected delay -- expected %v, received %v", mocks.TestDelay, d) } }
func TestNewPollingRequestClosesTheResponseBody(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) NewPollingRequest(resp, NullAuthorizer{}) if resp.Body.(*mocks.Body).IsOpen() { t.Error("autorest: NewPollingRequest failed to close the response body when creating a new request") } }
func TestNewPollingRequestLeavesBodyOpenWhenPrepareFails(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) resp.Header.Set(http.CanonicalHeaderKey(headerLocation), testBadURL) _, err := NewPollingRequest(resp, NullAuthorizer{}) if !resp.Body.(*mocks.Body).IsOpen() { t.Errorf("autorest: NewPollingRequest closed the http.Request Body when Prepare returned an error (%v)", err) } }
func TestNewPollingRequestReturnsAnErrorWhenPrepareFails(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) resp.Header.Set(http.CanonicalHeaderKey(HeaderLocation), mocks.TestBadURL) _, err := NewPollingRequest(resp, nil) if err == nil { t.Fatal("autorest: NewPollingRequest failed to return an error when Prepare fails") } }
func TestNewPollingRequestDoesNotReturnARequestWhenPrepareFails(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) resp.Header.Set(http.CanonicalHeaderKey(HeaderLocation), mocks.TestBadURL) req, _ := NewPollingRequest(resp, nil) if req != nil { t.Fatal("autorest: NewPollingRequest returned an http.Request when Prepare failed") } }
func TestNewPollingRequestAppliesAuthorization(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) req, _ := NewPollingRequest(resp, mockAuthorizer{}) if req.Header.Get(http.CanonicalHeaderKey(headerAuthorization)) != testAuthorizationHeader { t.Errorf("autorest: NewPollingRequest did not apply authorization -- received %v, expected %v", req.Header.Get(http.CanonicalHeaderKey(headerAuthorization)), testAuthorizationHeader) } }
func TestGetRetryAfterReturnsDefaultDelayIfRetryHeaderIsMalformed(t *testing.T) { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) resp.Header.Set(http.CanonicalHeaderKey(HeaderRetryAfter), "a very bad non-integer value") d := GetRetryAfter(resp, DefaultPollingDelay) if d != DefaultPollingDelay { t.Fatalf("autorest: GetRetryAfter failed to returned the default delay for a malformed Retry-After header -- expected %v, received %v", DefaultPollingDelay, d) } }
func TestPollingReturnsNoErrorForUnexpectedStatusCode(t *testing.T) { client := mocks.NewSender() client.EmitStatus("500 InternalServerError", http.StatusInternalServerError) resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) resp, err := PollForAttempts(client, req, time.Duration(0), 1, http.StatusAccepted) if err != nil { t.Error("autorest: Polling emitted error for unknown status code") } }
func TestPollForAttemptsStops(t *testing.T) { client := mocks.NewSender() client.EmitErrors(-1) resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) PollForAttempts(client, req, time.Duration(0), 5) if client.Attempts() < 5 || client.Attempts() > 5 { t.Errorf("autorest: PollForAttempts stopped incorrectly -- expected %v attempts, actual attempts were %v", 5, client.Attempts()) } }
func TestPollingReturnsDefaultsToAcceptedStatusCode(t *testing.T) { client := mocks.NewSender() resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) client.SetResponse(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) resp, err := PollForAttempts(client, req, time.Duration(0), 1) if err == nil { t.Error("autorest: Polling failed to default to HTTP 202") } }
func TestPollingLeavesFinalBodyOpen(t *testing.T) { client := mocks.NewSender() client.EmitStatus("500 InternalServerError", http.StatusInternalServerError) resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) resp, _ = PollForAttempts(client, req, time.Duration(0), 1) if !resp.Body.(*mocks.Body).IsOpen() { t.Error("autorest: Polling unexpectedly closed the response body") } }
func TestDecorateForPollingCloseBodyOnEachAttempt(t *testing.T) { client := mocks.NewSender() resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) client.SetResponse(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) resp, _ = PollForAttempts(client, req, time.Duration(0), 5) if resp.Body.(*mocks.Body).CloseAttempts() < 5 { t.Errorf("autorest: decorateForPolling failed to close the response Body between requests -- expected %v, received %v", 5, resp.Body.(*mocks.Body).CloseAttempts()) } }
func TestPollForDurationsStops(t *testing.T) { client := mocks.NewSender() client.EmitErrors(-1) d := 10 * time.Millisecond resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) start := time.Now() PollForDuration(client, req, time.Duration(0), d) if time.Now().Sub(start) < d { t.Error("autorest: PollForDuration stopped too soon") } }
func TestClientPollAsNeededReturnsErrorWhenPollingDisabled(t *testing.T) { c := Client{} c.Sender = mocks.NewSender() c.PollingMode = DoNotPoll r := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(r) _, err := c.PollAsNeeded(r) if err == nil { t.Error("autorest: Client#PollAsNeeded failed to return an error when polling was disabled but required") } Respond(r, ByClosing()) }
func TestClientPollAsNeededReturnsErrorIfUnableToCreateRequest(t *testing.T) { c := Client{} c.Authorizer = mockFailingAuthorizer{} c.Sender = mocks.NewSender() c.PollingMode = PollUntilAttempts c.PollingAttempts = 1 r := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(r) _, err := c.PollAsNeeded(r) if err == nil { t.Error("autorest: Client#PollAsNeeded failed to return error when unable to create request") } Respond(r, ByClosing()) }
func TestPollForDurationsStopsWithinReason(t *testing.T) { client := mocks.NewSender() client.EmitErrors(-1) d := 10 * time.Millisecond resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) mocks.SetRetryHeader(resp, d) client.SetResponse(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) start := time.Now() PollForDuration(client, req, time.Duration(0), d) if time.Now().Sub(start) > (time.Duration(5.0) * d) { t.Error("autorest: PollForDuration took too long to stop -- exceeded 5 times expected duration") } }
func TestPollingHonorsDelay(t *testing.T) { client := mocks.NewSender() client.EmitErrors(-1) d1 := 10 * time.Millisecond resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) mocks.SetRetryHeader(resp, d1) client.SetResponse(resp) req, _ := NewPollingRequest(resp, NullAuthorizer{}) start := time.Now() PollForAttempts(client, req, time.Duration(0), 2) d2 := time.Now().Sub(start) if d2 < d1 { t.Errorf("autorest: Polling failed to honor delay -- expected %v, actual %v", d1.Seconds(), d2.Seconds()) } }
func TestClientPollAsNeededAllowsInspectionOfRequest(t *testing.T) { c := Client{} c.Sender = mocks.NewSender() c.PollingMode = PollUntilAttempts c.PollingAttempts = 1 mi := &mockInspector{} c.RequestInspector = mi.WithInspection() r := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(r) c.PollAsNeeded(r) if !mi.wasInvoked { t.Error("autorest: Client#PollAsNeeded failed to allow inspection of polling request") } Respond(r, ByClosing()) }
func TestClientPollAsNeededPollsForAttempts(t *testing.T) { c := Client{} c.PollingMode = PollUntilAttempts c.PollingAttempts = 5 s := mocks.NewSender() s.EmitStatus("202 Accepted", http.StatusAccepted) c.Sender = s r := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(r) s.SetResponse(r) resp, _ := c.PollAsNeeded(r) if s.Attempts() != 5 { t.Errorf("autorest: Client#PollAsNeeded did not poll the expected number of attempts -- expected %v, actual %v", c.PollingAttempts, s.Attempts()) } Respond(resp, ByClosing()) }
func ExampleSendWithSender() { r := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(r) client := mocks.NewSender() client.AppendAndRepeatResponse(r, 10) logger := log.New(os.Stdout, "autorest: ", 0) na := NullAuthorizer{} req, _ := Prepare(&http.Request{}, AsGet(), WithBaseURL("https://microsoft.com/a/b/c/"), na.WithAuthorization()) r, _ = SendWithSender(client, req, WithLogging(logger), DoErrorIfStatusCode(http.StatusAccepted), DoCloseIfError(), DoRetryForAttempts(5, time.Duration(0))) Respond(r, ByClosing()) // Output: // autorest: Sending GET https://microsoft.com/a/b/c/ // autorest: GET https://microsoft.com/a/b/c/ received 202 Accepted // autorest: Sending GET https://microsoft.com/a/b/c/ // autorest: GET https://microsoft.com/a/b/c/ received 202 Accepted // autorest: Sending GET https://microsoft.com/a/b/c/ // autorest: GET https://microsoft.com/a/b/c/ received 202 Accepted // autorest: Sending GET https://microsoft.com/a/b/c/ // autorest: GET https://microsoft.com/a/b/c/ received 202 Accepted // autorest: Sending GET https://microsoft.com/a/b/c/ // autorest: GET https://microsoft.com/a/b/c/ received 202 Accepted }
func newAcceptedResponse() *http.Response { resp := mocks.NewResponseWithStatus("202 Accepted", http.StatusAccepted) mocks.SetAcceptedHeaders(resp) return resp }