use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.
the class RetryPolicyTests method fixedDelayRetry.
@Test
public void fixedDelayRetry() {
final int maxRetries = 5;
final long delayMillis = 500;
final HttpPipeline pipeline = new HttpPipelineBuilder().httpClient(new NoOpHttpClient() {
int count = -1;
long previousAttemptMadeAt = -1;
@Override
public void send(HttpRequest httpRequest, CancellationToken cancellationToken, HttpCallback httpCallback) {
if (count > 0) {
Assertions.assertTrue(System.currentTimeMillis() >= previousAttemptMadeAt + delayMillis);
}
Assertions.assertTrue(count++ < maxRetries);
previousAttemptMadeAt = System.currentTimeMillis();
httpCallback.onSuccess(new MockHttpResponse(httpRequest, 500));
}
}).policies(new RetryPolicy(new FixedDelay(maxRetries, Duration.ofMillis(delayMillis)))).build();
CountDownLatch latch = new CountDownLatch(1);
pipeline.send(new HttpRequest(HttpMethod.GET, "http://localhost/"), RequestContext.NONE, CancellationToken.NONE, new HttpCallback() {
@Override
public void onSuccess(HttpResponse response) {
latch.countDown();
}
@Override
public void onError(Throwable error) {
latch.countDown();
}
});
awaitOnLatch(latch, "fixedDelayRetry");
}
use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.
the class RetryPolicyTests method exponentialDelayRetry.
@Test
public void exponentialDelayRetry() {
final int maxRetries = 5;
final long baseDelayMillis = 100;
final long maxDelayMillis = 1000;
ExponentialBackoff exponentialBackoff = new ExponentialBackoff(maxRetries, Duration.ofMillis(baseDelayMillis), Duration.ofMillis(maxDelayMillis));
final HttpPipeline pipeline = new HttpPipelineBuilder().httpClient(new NoOpHttpClient() {
int count = -1;
long previousAttemptMadeAt = -1;
@Override
public void send(HttpRequest httpRequest, CancellationToken cancellationToken, HttpCallback httpCallback) {
if (count > 0) {
long requestMadeAt = System.currentTimeMillis();
long expectedToBeMadeAt = previousAttemptMadeAt + ((1 << (count - 1)) * (long) (baseDelayMillis * 0.95));
Assertions.assertTrue(requestMadeAt >= expectedToBeMadeAt);
}
Assertions.assertTrue(count++ < maxRetries);
previousAttemptMadeAt = System.currentTimeMillis();
httpCallback.onSuccess(new MockHttpResponse(httpRequest, 503));
}
}).policies(new RetryPolicy(exponentialBackoff)).build();
CountDownLatch latch = new CountDownLatch(1);
pipeline.send(new HttpRequest(HttpMethod.GET, "http://localhost/"), RequestContext.NONE, CancellationToken.NONE, new HttpCallback() {
@Override
public void onSuccess(HttpResponse response) {
latch.countDown();
}
@Override
public void onError(Throwable error) {
latch.countDown();
}
});
awaitOnLatch(latch, "exponentialDelayRetry");
}
use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.
the class RetryPolicyTests method retryEndOn501.
@Test
public void retryEndOn501() {
final HttpPipeline pipeline = new HttpPipelineBuilder().httpClient(new NoOpHttpClient() {
// Send 408, 500, 502, all retried, with a 501 ending
private final int[] codes = new int[] { 408, 500, 502, 501 };
private int count = 0;
@Override
public void send(HttpRequest httpRequest, CancellationToken cancellationToken, HttpCallback httpCallback) {
httpCallback.onSuccess(new MockHttpResponse(httpRequest, codes[count++]));
}
}).policies(new RetryPolicy(new FixedDelay(3, Duration.of(0, ChronoUnit.MILLIS)))).build();
final HttpResponse[] httpResponse = new HttpResponse[1];
CountDownLatch latch = new CountDownLatch(1);
pipeline.send(new HttpRequest(HttpMethod.GET, "http://localhost/"), RequestContext.NONE, CancellationToken.NONE, new HttpCallback() {
@Override
public void onSuccess(HttpResponse response) {
httpResponse[0] = response;
latch.countDown();
}
@Override
public void onError(Throwable error) {
try {
throw new RuntimeException(error);
} finally {
latch.countDown();
}
}
});
awaitOnLatch(latch, "retryEndOn501");
assertNotNull(httpResponse[0]);
assertEquals(501, httpResponse[0].getStatusCode());
}
use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.
the class CFBackedPageAsyncStream method forEach.
@Override
public CancellationToken forEach(AsyncStreamHandler<PagedResponse<T>> handler) {
final CancellationToken token = new CancellationToken();
handler.onInit(token);
if (token.isCancellationRequested()) {
handler.onError(new CancellationException());
return token;
}
final CompletableFuture<Void> completableFuture = this.enumeratePages(startPageId, token, handler);
token.registerOnCancel(() -> {
completableFuture.cancel(true);
});
completableFuture.whenCompleteAsync((ignored, throwable) -> {
if (throwable != null) {
if (throwable instanceof CompletionException && throwable.getCause() != null) {
// unwrap CF's CompletionException.
handler.onError(throwable.getCause());
} else {
handler.onError(throwable);
}
} else {
handler.onComplete();
}
});
return token;
}
Aggregations