@@ -747,6 +747,113 @@ TEST_F(BasicUsage, TEST_NAME(TWriteSession_WriteEncoded)) {
747747 }
748748}
749749
750+ TEST_F (BasicUsage, TEST_NAME(TWriteSession_WriteEncoded_Broken)) {
751+ // Write a broken compressed message.
752+ // GetData should throw an exception.
753+ // GetBrokenData should return the broken data.
754+
755+ // Write a correct compressed message.
756+ // GetData should return the correct data.
757+ // GetBrokenData should throw an exception.
758+
759+ auto driver = MakeDriver ();
760+
761+ TTopicClient client (driver);
762+
763+ auto settings = TWriteSessionSettings ()
764+ .Path (GetTopicPath ())
765+ .MessageGroupId (TEST_MESSAGE_GROUP_ID);
766+
767+ auto writer = client.CreateWriteSession (settings);
768+ std::string brokenPacked = " some broken data" ;
769+
770+ {
771+ auto event = *writer->GetEvent (true );
772+ ASSERT_TRUE (std::holds_alternative<TWriteSessionEvent::TReadyToAcceptEvent>(event));
773+ writer->WriteEncoded (
774+ std::move (std::get<TWriteSessionEvent::TReadyToAcceptEvent>(event).ContinuationToken ),
775+ TWriteMessage::CompressedMessage (brokenPacked, ECodec::GZIP, 100 )
776+ );
777+ }
778+
779+ std::string correctMessage = " message" ;
780+ TString packed;
781+ {
782+ TStringOutput so (packed);
783+ TZLibCompress oss (&so, ZLib::GZip, 6 );
784+ oss << correctMessage;
785+ }
786+ {
787+ auto event = *writer->GetEvent (true );
788+ ASSERT_TRUE (std::holds_alternative<TWriteSessionEvent::TReadyToAcceptEvent>(event));
789+ writer->WriteEncoded (
790+ std::move (std::get<TWriteSessionEvent::TReadyToAcceptEvent>(event).ContinuationToken ),
791+ TWriteMessage::CompressedMessage (packed, ECodec::GZIP, correctMessage.size ())
792+ );
793+ }
794+
795+ std::uint32_t acks = 0 ;
796+ while (acks < 2 ) {
797+ auto event = *writer->GetEvent (true );
798+ if (auto e = std::get_if<TWriteSessionEvent::TAcksEvent>(&event)) {
799+ acks += e->Acks .size ();
800+ } else {
801+ continue ;
802+ }
803+ }
804+
805+ ASSERT_EQ (acks, 2u );
806+
807+ auto readSettings = TReadSessionSettings ()
808+ .ConsumerName (GetConsumerName ())
809+ .AppendTopics (GetTopicPath ())
810+ // .DirectRead(EnableDirectRead)
811+ ;
812+ std::shared_ptr<IReadSession> readSession = client.CreateReadSession (readSettings);
813+ std::uint32_t readMessageCount = 0 ;
814+ while (readMessageCount < 2 ) {
815+ std::cerr << " Get event on client\n " ;
816+ auto event = *readSession->GetEvent (true );
817+ std::visit (TOverloaded {
818+ [&](TReadSessionEvent::TDataReceivedEvent& event) {
819+ for (auto & message: event.GetMessages ()) {
820+ if (readMessageCount == 0 ) {
821+ ASSERT_THROW (message.GetData (), std::exception);
822+ std::string data = message.GetBrokenData ();
823+ ASSERT_TRUE (brokenPacked == data);
824+ } else {
825+ ASSERT_THROW (message.GetBrokenData (), std::exception);
826+ std::string data = message.GetData ();
827+ ASSERT_TRUE (correctMessage == data);
828+ }
829+ ++readMessageCount;
830+ }
831+ },
832+ [&](TReadSessionEvent::TCommitOffsetAcknowledgementEvent&) {
833+ FAIL ();
834+ },
835+ [&](TReadSessionEvent::TStartPartitionSessionEvent& event) {
836+ event.Confirm ();
837+ },
838+ [&](TReadSessionEvent::TStopPartitionSessionEvent& event) {
839+ event.Confirm ();
840+ },
841+ [&](TReadSessionEvent::TEndPartitionSessionEvent& event) {
842+ event.Confirm ();
843+ },
844+ [&](TReadSessionEvent::TPartitionSessionStatusEvent&) {
845+ FAIL () << " Test does not support lock sessions yet" ;
846+ },
847+ [&](TReadSessionEvent::TPartitionSessionClosedEvent&) {
848+ FAIL () << " Test does not support lock sessions yet" ;
849+ },
850+ [&](TSessionClosedEvent&) {
851+ FAIL () << " Session closed" ;
852+ }
853+ }, event);
854+ }
855+ }
856+
750857namespace {
751858 enum class EExpectedTestResult {
752859 SUCCESS,
0 commit comments