|
24 | 24 |
|
25 | 25 | #include <atomic> |
26 | 26 | #include <chrono> |
| 27 | +#include <cstdint> |
27 | 28 | #include <functional> |
28 | 29 | #include <future> |
| 30 | +#include <limits> |
29 | 31 | #include <set> |
30 | 32 | #include <string> |
31 | 33 | #include <thread> |
@@ -865,13 +867,7 @@ TEST_P(ReaderSeekTest, testHasMessageAvailableAfterSeekToEnd) { |
865 | 867 | } |
866 | 868 |
|
867 | 869 | ASSERT_EQ(ResultOk, reader.seek(MessageId::latest())); |
868 | | - // After seek-to-end the broker may close the consumer and trigger reconnect; allow a short |
869 | | - // delay for hasMessageAvailable to become false (avoids flakiness when reconnect completes). |
870 | | - for (int i = 0; i < 50; i++) { |
871 | | - ASSERT_EQ(ResultOk, reader.hasMessageAvailable(hasMessageAvailable)); |
872 | | - if (!hasMessageAvailable) break; |
873 | | - std::this_thread::sleep_for(std::chrono::milliseconds(100)); |
874 | | - } |
| 870 | + ASSERT_EQ(ResultOk, reader.hasMessageAvailable(hasMessageAvailable)); |
875 | 871 | ASSERT_FALSE(hasMessageAvailable); |
876 | 872 |
|
877 | 873 | producer.send(MessageBuilder().setContent("msg-2").build()); |
@@ -983,6 +979,28 @@ TEST_F(ReaderSeekTest, testSeekInclusiveChunkMessage) { |
983 | 979 | assertStartMessageId(false, secondMsgId); |
984 | 980 | } |
985 | 981 |
|
| 982 | +TEST_P(ReaderSeekTest, testSeekToEndByTimestamp) { |
| 983 | + auto topic = "test-seek-to-end-by-timestamp-" + std::to_string(time(nullptr)); |
| 984 | + Producer producer; |
| 985 | + ASSERT_EQ(ResultOk, client.createProducer(topic, producer)); |
| 986 | + |
| 987 | + ReaderConfiguration readerConf; |
| 988 | + readerConf.setStartMessageIdInclusive(GetParam()); |
| 989 | + |
| 990 | + Reader reader; |
| 991 | + ASSERT_EQ(ResultOk, client.createReader(topic, MessageId::earliest(), readerConf, reader)); |
| 992 | + |
| 993 | + ASSERT_EQ(ResultOk, producer.send(MessageBuilder().setContent("msg").build())); |
| 994 | + // Server side (Java) uses signal 64 bits integers to represent the timestamp, so use max int64_t here to |
| 995 | + // seek to the end of topic. |
| 996 | + auto now = std::numeric_limits<int64_t>::max(); |
| 997 | + ASSERT_EQ(ResultOk, reader.seek(now)); |
| 998 | + |
| 999 | + bool hasMessageAvailable; |
| 1000 | + ASSERT_EQ(ResultOk, reader.hasMessageAvailable(hasMessageAvailable)); |
| 1001 | + ASSERT_FALSE(hasMessageAvailable); |
| 1002 | +} |
| 1003 | + |
986 | 1004 | // Regression test for segfault when Reader is used with messageListenerThreads=0. |
987 | 1005 | // Verifies ExecutorServiceProvider(0) does not cause undefined behavior and |
988 | 1006 | // ConsumerImpl::messageReceived does not dereference null listenerExecutor_. |
|
0 commit comments