use of com.google.cloud.pubsublite.internal.CheckedApiException in project beam by apache.
the class PubsubLiteSinkTest method exceptionMixedWithOK.
@Test
public void exceptionMixedWithOK() throws Exception {
Message message1 = Message.builder().build();
Message message2 = Message.builder().setKey(ByteString.copyFromUtf8("abc")).build();
Message message3 = Message.builder().setKey(ByteString.copyFromUtf8("def")).build();
SettableApiFuture<MessageMetadata> future1 = SettableApiFuture.create();
SettableApiFuture<MessageMetadata> future2 = SettableApiFuture.create();
SettableApiFuture<MessageMetadata> future3 = SettableApiFuture.create();
CountDownLatch startedLatch = new CountDownLatch(3);
when(publisher.publish(message1)).then(invocation -> {
startedLatch.countDown();
return future1;
});
when(publisher.publish(message2)).then(invocation -> {
startedLatch.countDown();
return future2;
});
when(publisher.publish(message3)).then(invocation -> {
startedLatch.countDown();
return future3;
});
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(() -> {
try {
startedLatch.await();
future1.set(MessageMetadata.of(Partition.of(1), Offset.of(2)));
future2.setException(new CheckedApiException(Code.INTERNAL).underlying);
future3.set(MessageMetadata.of(Partition.of(1), Offset.of(3)));
} catch (InterruptedException e) {
fail();
throw new RuntimeException(e);
}
});
PipelineExecutionException e = assertThrows(PipelineExecutionException.class, () -> runWith(message1, message2, message3));
verify(publisher, times(3)).publish(publishedMessageCaptor.capture());
assertThat(publishedMessageCaptor.getAllValues(), containsInAnyOrder(message1, message2, message3));
Optional<CheckedApiException> statusOr = ExtractStatus.extract(e.getCause());
assertTrue(statusOr.isPresent());
assertThat(statusOr.get().code(), equalTo(Code.INTERNAL));
exec.shutdownNow();
}
use of com.google.cloud.pubsublite.internal.CheckedApiException in project beam by apache.
the class SubscriptionPartitionProcessorImplTest method allowFlowFailureFails.
@Test
public void allowFlowFailureFails() throws Exception {
when(tracker.currentRestriction()).thenReturn(initialRange());
when(tracker.tryClaim(any())).thenReturn(true);
doThrow(new CheckedApiException(Code.OUT_OF_RANGE)).when(subscriber).allowFlow(any());
SystemExecutors.getFuturesExecutor().execute(() -> leakedConsumer.accept(ImmutableList.of(messageWithOffset(1))));
ApiException e = assertThrows(ApiException.class, () -> processor.runFor(Duration.standardHours(10)));
assertEquals(Code.OUT_OF_RANGE, e.getStatusCode().getCode());
}
use of com.google.cloud.pubsublite.internal.CheckedApiException in project beam by apache.
the class SubscriptionPartitionProcessorImplTest method lifecycleFlowControlThrows.
@Test
public void lifecycleFlowControlThrows() throws Exception {
when(tracker.currentRestriction()).thenReturn(initialRange());
doThrow(new CheckedApiException(Code.OUT_OF_RANGE)).when(subscriber).allowFlow(any());
assertThrows(ApiException.class, () -> processor.runFor(Duration.ZERO));
}
use of com.google.cloud.pubsublite.internal.CheckedApiException in project beam by apache.
the class SubscriptionPartitionProcessorImplTest method subscriberFailureFails.
@Test
public void subscriberFailureFails() throws Exception {
when(tracker.currentRestriction()).thenReturn(initialRange());
doAnswer((Answer<Void>) args -> {
subscriber.fail(new CheckedApiException(Code.OUT_OF_RANGE));
return null;
}).when(subscriber).awaitRunning();
ApiException e = assertThrows(// Longer wait is needed due to listener asynchrony, but should never wait this long.
ApiException.class, () -> processor.runFor(Duration.standardMinutes(2)));
assertEquals(Code.OUT_OF_RANGE, e.getStatusCode().getCode());
}
use of com.google.cloud.pubsublite.internal.CheckedApiException in project beam by apache.
the class PubsubLiteSinkTest method singleExceptionWhenProcessing.
@Test
public void singleExceptionWhenProcessing() {
Message message1 = Message.builder().build();
when(publisher.publish(message1)).thenReturn(ApiFutures.immediateFailedFuture(new CheckedApiException(Code.INTERNAL).underlying));
PipelineExecutionException e = assertThrows(PipelineExecutionException.class, () -> runWith(message1));
verify(publisher).publish(message1);
Optional<CheckedApiException> statusOr = ExtractStatus.extract(e.getCause());
assertTrue(statusOr.isPresent());
assertThat(statusOr.get().code(), equalTo(Code.INTERNAL));
}
Aggregations