@@ -700,9 +700,16 @@ TEST_P(ReaderTest, testReceiveAfterSeek) {
700700 client.close ();
701701}
702702
703- TEST (ReaderSeekTest, testSeekForMessageId) {
704- Client client (serviceUrl);
703+ class ReaderSeekTest : public ::testing::TestWithParam<bool > {
704+ public:
705+ void SetUp () override { client = Client{serviceUrl}; }
705706
707+ void TearDown () override { client.close (); }
708+
709+ Client client{serviceUrl};
710+ };
711+
712+ TEST_F (ReaderSeekTest, testSeekForMessageId) {
706713 const std::string topic = " test-seek-for-message-id-" + std::to_string (time (nullptr ));
707714
708715 Producer producer;
@@ -752,18 +759,24 @@ TEST(ReaderSeekTest, testSeekForMessageId) {
752759 producer.close ();
753760}
754761
755- class ReaderSeekTest : public ::testing::TestWithParam<bool > {};
756-
757- TEST (ReaderSeekTest, testStartAtLatestMessageId) {
758- Client client (serviceUrl);
762+ #define EXPECT_HAS_MESSAGE_AVAILABLE (reader, expected ) \
763+ { \
764+ bool actual; \
765+ ASSERT_EQ (ResultOk, reader.hasMessageAvailable (actual)); \
766+ EXPECT_EQ (actual, (expected)); \
767+ }
759768
769+ TEST_F (ReaderSeekTest, testStartAtLatestMessageId) {
760770 const std::string topic = " test-seek-latest-message-id-" + std::to_string (time (nullptr ));
761771
762772 Producer producer;
763773 ASSERT_EQ (ResultOk, client.createProducer (topic, producer));
764774
765775 MessageId id;
766- ASSERT_EQ (ResultOk, producer.send (MessageBuilder ().setContent (" msg" ).build (), id));
776+ for (int i = 0 ; i < 10 ; i++) {
777+ ASSERT_EQ (ResultOk,
778+ producer.send (MessageBuilder ().setContent (" msg-" + std::to_string (i)).build (), id));
779+ }
767780
768781 Reader readerExclusive;
769782 ASSERT_EQ (ResultOk,
@@ -774,20 +787,24 @@ TEST(ReaderSeekTest, testStartAtLatestMessageId) {
774787 client.createReader (topic, MessageId::latest (),
775788 ReaderConfiguration ().setStartMessageIdInclusive (true ), readerInclusive));
776789
790+ EXPECT_HAS_MESSAGE_AVAILABLE (readerExclusive, false );
791+ EXPECT_HAS_MESSAGE_AVAILABLE (readerInclusive, true );
792+
777793 Message msg;
778- bool hasMsgAvaliable = false ;
779- readerInclusive.hasMessageAvailable (hasMsgAvaliable);
780- ASSERT_TRUE (hasMsgAvaliable);
781794 ASSERT_EQ (ResultOk, readerInclusive.readNext (msg, 3000 ));
782- ASSERT_EQ (ResultTimeout, readerExclusive.readNext (msg, 3000 ));
795+ ASSERT_EQ (msg.getDataAsString (), " msg-9" );
796+
797+ readerInclusive.seek (0L );
798+ EXPECT_HAS_MESSAGE_AVAILABLE (readerInclusive, true );
799+ ASSERT_EQ (ResultOk, readerInclusive.readNext (msg, 3000 ));
800+ ASSERT_EQ (msg.getDataAsString (), " msg-0" );
783801
784802 readerExclusive.close ();
785803 readerInclusive.close ();
786804 producer.close ();
787805}
788806
789- TEST (ReaderTest, testSeekInProgress) {
790- Client client (serviceUrl);
807+ TEST_F (ReaderSeekTest, testSeekInProgress) {
791808 const auto topic = " test-seek-in-progress-" + std::to_string (time (nullptr ));
792809 Reader reader;
793810 ASSERT_EQ (ResultOk, client.createReader (topic, MessageId::earliest (), {}, reader));
@@ -798,11 +815,9 @@ TEST(ReaderTest, testSeekInProgress) {
798815 Result result;
799816 promise.getFuture ().get (result);
800817 ASSERT_EQ (result, ResultNotAllowedError);
801- client.close ();
802818}
803819
804820TEST_P (ReaderSeekTest, testHasMessageAvailableAfterSeekToEnd) {
805- Client client (serviceUrl);
806821 const auto topic = " test-has-message-available-after-seek-to-end-" + std::to_string (time (nullptr ));
807822 Producer producer;
808823 ASSERT_EQ (ResultOk, client.createProducer (topic, producer));
@@ -814,7 +829,6 @@ TEST_P(ReaderSeekTest, testHasMessageAvailableAfterSeekToEnd) {
814829
815830 bool hasMessageAvailable;
816831 if (GetParam ()) {
817- // Test the case when `ConsumerImpl.lastMessageIdInBroker_` has been initialized
818832 ASSERT_EQ (ResultOk, reader.hasMessageAvailable (hasMessageAvailable));
819833 }
820834
@@ -834,8 +848,44 @@ TEST_P(ReaderSeekTest, testHasMessageAvailableAfterSeekToEnd) {
834848 ASSERT_EQ (ResultOk, reader.seek (MessageId::latest ()));
835849 ASSERT_EQ (ResultOk, reader.hasMessageAvailable (hasMessageAvailable));
836850 ASSERT_FALSE (hasMessageAvailable);
851+ }
837852
838- client.close ();
853+ TEST_P (ReaderSeekTest, testHasMessageAvailableAfterSeekTimestamp) {
854+ using namespace std ::chrono;
855+ const auto topic = " test-has-message-available-after-seek-timestamp-" + std::to_string (time (nullptr ));
856+ Producer producer;
857+ ASSERT_EQ (ResultOk, client.createProducer (topic, producer));
858+ MessageId sentMsgId;
859+ const auto timestampBeforeSend =
860+ duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count ();
861+ ASSERT_EQ (ResultOk, producer.send (MessageBuilder ().setContent (" msg" ).build (), sentMsgId));
862+
863+ auto createReader = [this , &topic](Reader& reader, const MessageId& msgId) {
864+ ASSERT_EQ (ResultOk, client.createReader (topic, msgId, {}, reader));
865+ if (GetParam ()) {
866+ if (msgId == MessageId::earliest ()) {
867+ EXPECT_HAS_MESSAGE_AVAILABLE (reader, true );
868+ } else {
869+ EXPECT_HAS_MESSAGE_AVAILABLE (reader, false );
870+ }
871+ }
872+ };
873+
874+ std::vector<MessageId> msgIds{MessageId::earliest (), sentMsgId, MessageId::latest ()};
875+
876+ for (auto && msgId : msgIds) {
877+ Reader reader;
878+ createReader (reader, msgId);
879+ ASSERT_EQ (ResultOk,
880+ reader.seek (duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count ()));
881+ EXPECT_HAS_MESSAGE_AVAILABLE (reader, false );
882+ }
883+ for (auto && msgId : msgIds) {
884+ Reader reader;
885+ createReader (reader, msgId);
886+ ASSERT_EQ (ResultOk, reader.seek (timestampBeforeSend));
887+ EXPECT_HAS_MESSAGE_AVAILABLE (reader, true );
888+ }
839889}
840890
841891INSTANTIATE_TEST_SUITE_P (Pulsar, ReaderTest, ::testing::Values(true , false ));
0 commit comments