use of com.hedera.mirror.grpc.domain.TopicMessage in project hedera-mirror-node by hashgraph.
the class PollingTopicMessageRetrieverTest method unthrottledShouldKeepPolling.
@Test
void unthrottledShouldKeepPolling() {
retrieverProperties.getUnthrottled().setMaxPolls(20);
Instant now = Instant.now();
Flux<TopicMessage> firstBatch = domainBuilder.topicMessages(5, now);
Flux<TopicMessage> secondBatch = domainBuilder.topicMessages(5, now.plusNanos(5));
TopicMessageFilter filter = TopicMessageFilter.builder().startTime(Instant.EPOCH).topicId(TOPIC_ID).build();
// in unthrottled mode, the retriever should query the db for up to MaxPolls + 1 times when no limit is set,
// regardless of whether a db query returns less rows than MaxPageSize
pollingTopicMessageRetriever.retrieve(filter, false).map(TopicMessage::getSequenceNumber).as(StepVerifier::create).thenAwait(Duration.ofMillis(20L)).then(firstBatch::blockLast).thenAwait(Duration.ofMillis(20L)).then(secondBatch::blockLast).expectNextSequence(LongStream.range(1, 11).boxed().collect(Collectors.toList())).expectComplete().verify(Duration.ofMillis(500));
}
use of com.hedera.mirror.grpc.domain.TopicMessage in project hedera-mirror-node by hashgraph.
the class PollingTopicMessageRetrieverTest method timeout.
@ParameterizedTest
@ValueSource(booleans = { true, false })
void timeout(boolean throttle) {
int maxPageSize = retrieverProperties.getMaxPageSize();
Duration timeout = retrieverProperties.getTimeout();
retrieverProperties.setMaxPageSize(1);
retrieverProperties.setTimeout(Duration.ofMillis(10));
domainBuilder.topicMessages(10, Instant.now()).blockLast();
TopicMessageFilter filter = TopicMessageFilter.builder().startTime(Instant.EPOCH).topicId(TOPIC_ID).build();
pollingTopicMessageRetriever.retrieve(filter, throttle).map(TopicMessage::getSequenceNumber).as(StepVerifier::create).thenConsumeWhile(i -> true).expectTimeout(Duration.ofMillis(500)).verify();
retrieverProperties.setMaxPageSize(maxPageSize);
retrieverProperties.setTimeout(timeout);
}
use of com.hedera.mirror.grpc.domain.TopicMessage in project hedera-mirror-node by hashgraph.
the class TopicMessageServiceTest method historicalMessagesWithEndTimeAfter.
@Test
void historicalMessagesWithEndTimeAfter() {
TopicMessage topicMessage1 = domainBuilder.topicMessage().block();
TopicMessage topicMessage2 = domainBuilder.topicMessage().block();
TopicMessage topicMessage3 = domainBuilder.topicMessage().block();
TopicMessageFilter filter = TopicMessageFilter.builder().startTime(Instant.EPOCH).endTime(topicMessage3.getConsensusTimestampInstant().plusNanos(1)).topicId(topicId).build();
topicMessageService.subscribeTopic(filter).as(StepVerifier::create).expectNext(topicMessage1, topicMessage2, topicMessage3).expectComplete().verify(Duration.ofMillis(500));
}
use of com.hedera.mirror.grpc.domain.TopicMessage in project hedera-mirror-node by hashgraph.
the class TopicMessageServiceTest method incomingMessagesWithEndTimeBefore.
@Test
void incomingMessagesWithEndTimeBefore() {
Instant endTime = Instant.now().plusMillis(500);
Flux<TopicMessage> generator = domainBuilder.topicMessages(2, endTime.minusNanos(2));
TopicMessageFilter filter = TopicMessageFilter.builder().startTime(Instant.EPOCH).endTime(endTime).topicId(topicId).build();
topicMessageService.subscribeTopic(filter).map(TopicMessage::getSequenceNumber).as(StepVerifier::create).thenAwait(Duration.ofMillis(50)).then(generator::blockLast).expectNext(1L, 2L).expectComplete().verify(Duration.ofMillis(1000));
}
use of com.hedera.mirror.grpc.domain.TopicMessage in project hedera-mirror-node by hashgraph.
the class TopicMessageServiceTest method missingMessagesFromListenerTest.
private void missingMessagesFromListenerTest(TopicMessageFilter filter, Flux<TopicMessage> missingMessages) {
TopicListener topicListener = Mockito.mock(TopicListener.class);
EntityRepository entityRepository = Mockito.mock(EntityRepository.class);
TopicMessageRetriever topicMessageRetriever = Mockito.mock(TopicMessageRetriever.class);
topicMessageService = new TopicMessageServiceImpl(new GrpcProperties(), topicListener, entityRepository, topicMessageRetriever, new SimpleMeterRegistry());
// historic messages
TopicMessage retrieved1 = topicMessage(1);
TopicMessage retrieved2 = topicMessage(2);
// incoming messages before gap
TopicMessage beforeMissing1 = topicMessage(3);
TopicMessage beforeMissing2 = topicMessage(4);
// incoming messages after gap
TopicMessage afterMissing1 = topicMessage(8);
TopicMessage afterMissing2 = topicMessage(9);
TopicMessage afterMissing3 = topicMessage(10);
// mock entity type check
Mockito.when(entityRepository.findById(filter.getTopicId().getId())).thenReturn(Optional.of(Entity.builder().type(EntityType.TOPIC).build()));
Mockito.when(topicMessageRetriever.retrieve(ArgumentMatchers.eq(filter), ArgumentMatchers.eq(true))).thenReturn(Flux.just(retrieved1, retrieved2));
TopicMessageFilter listenerFilter = TopicMessageFilter.builder().startTime(beforeMissing1.getConsensusTimestampInstant()).build();
Mockito.when(topicListener.listen(ArgumentMatchers.argThat(l -> l.getStartTime().equals(listenerFilter.getStartTime())))).thenReturn(Flux.just(beforeMissing1, beforeMissing2, afterMissing1, afterMissing2, afterMissing3));
Mockito.when(topicMessageRetriever.retrieve(ArgumentMatchers.argThat(t -> t.getLimit() == 3 && t.getStartTime().equals(beforeMissing2.getConsensusTimestampInstant().plusNanos(1)) && t.getEndTime().equals(afterMissing1.getConsensusTimestampInstant())), ArgumentMatchers.eq(false))).thenReturn(missingMessages);
}
Aggregations