func (gateway Gateway) waitForJob(jobUrl, accessToken string, timeout time.Duration) (err error) { startTime := gateway.Clock() for true { if gateway.Clock().Sub(startTime) > timeout && timeout != 0 { return errors.NewAsyncTimeoutError(jobUrl) } var request *Request request, err = gateway.NewRequest("GET", jobUrl, accessToken, nil) response := &JobResource{} _, err = gateway.PerformRequestForJSONResponse(request, response) if err != nil { return } switch response.Entity.Status { case JOB_FINISHED: return case JOB_FAILED: err = errors.New(response.Entity.ErrorDetails.Description) return } accessToken = request.HttpReq.Header.Get("Authorization") time.Sleep(gateway.PollingThrottle) } return }
}) AfterEach(func() { apiServer.Close() }) It("deletes a resource", func() { err := ccGateway.DeleteResource(apiServer.URL + "/v2/foobars/SOME_GUID") Expect(err).ToNot(HaveOccurred()) }) Context("when the request would take longer than the async timeout", func() { It("returns an error", func() { apiErr := ccGateway.DeleteResource(apiServer.URL + "/v2/foobars/TIMEOUT") Expect(apiErr).To(HaveOccurred()) Expect(apiErr).To(BeAssignableToTypeOf(errors.NewAsyncTimeoutError("http://some.url"))) }) }) }) }) }) Describe("making an async request", func() { var ( jobStatus string apiServer *httptest.Server authServer *httptest.Server statusChannel chan string ) BeforeEach(func() {