@@ -698,6 +698,115 @@ Y_UNIT_TEST_SUITE(BasicUsage) {
698698 UNIT_ASSERT_VALUES_EQUAL (stats->GetEndOffset (), count);
699699
700700 }
701+
702+ Y_UNIT_TEST (TWriteSession_WriteEncoded) {
703+ // This test was adapted from ydb_persqueue tests.
704+ // It writes 4 messages: 2 with default codec, 1 with explicitly set GZIP codec, 1 with RAW codec.
705+ // The last message MUST be sent in a separate WriteRequest, as it has a codec field applied for all messages in the request.
706+ // This separation currently happens in TWriteSessionImpl::SendImpl method.
707+
708+ auto setup = std::make_shared<TTopicSdkTestSetup>(TEST_CASE_NAME);
709+ auto client = setup->MakeClient ();
710+ auto settings = TWriteSessionSettings ()
711+ .Path (TEST_TOPIC)
712+ .MessageGroupId (TEST_MESSAGE_GROUP_ID);
713+
714+ size_t batchSize = 100000000 ;
715+ settings.BatchFlushInterval (TDuration::Seconds (1000 )); // Batch on size, not on time.
716+ settings.BatchFlushSizeBytes (batchSize);
717+ auto writer = client.CreateWriteSession (settings);
718+ TString message = " message" ;
719+ TString packed;
720+ {
721+ TStringOutput so (packed);
722+ TZLibCompress oss (&so, ZLib::GZip, 6 );
723+ oss << message;
724+ }
725+
726+ Cerr << message << " " << packed << " \n " ;
727+
728+ {
729+ auto event = *writer->GetEvent (true );
730+ UNIT_ASSERT (!writer->WaitEvent ().Wait (TDuration::Seconds (1 )));
731+ auto ev = writer->WaitEvent ();
732+ UNIT_ASSERT (std::holds_alternative<TWriteSessionEvent::TReadyToAcceptEvent>(event));
733+ auto continueToken = std::move (std::get<TWriteSessionEvent::TReadyToAcceptEvent>(event).ContinuationToken );
734+ writer->Write (std::move (continueToken), message);
735+ UNIT_ASSERT (ev.Wait (TDuration::Seconds (1 )));
736+ }
737+ {
738+ auto event = *writer->GetEvent (true );
739+ UNIT_ASSERT (std::holds_alternative<TWriteSessionEvent::TReadyToAcceptEvent>(event));
740+ auto continueToken = std::move (std::get<TWriteSessionEvent::TReadyToAcceptEvent>(event).ContinuationToken );
741+ writer->Write (std::move (continueToken), " " );
742+ }
743+ {
744+ auto event = *writer->GetEvent (true );
745+ UNIT_ASSERT (std::holds_alternative<TWriteSessionEvent::TReadyToAcceptEvent>(event));
746+ auto continueToken = std::move (std::get<TWriteSessionEvent::TReadyToAcceptEvent>(event).ContinuationToken );
747+ writer->WriteEncoded (std::move (continueToken), packed, ECodec::GZIP, message.size ());
748+ }
749+
750+ ui32 acks = 0 , tokens = 0 ;
751+ while (acks < 4 || tokens < 2 ) {
752+ auto event = *writer->GetEvent (true );
753+ if (std::holds_alternative<TWriteSessionEvent::TAcksEvent>(event)) {
754+ acks += std::get<TWriteSessionEvent::TAcksEvent>(event).Acks .size ();
755+ }
756+ if (std::holds_alternative<TWriteSessionEvent::TReadyToAcceptEvent>(event)) {
757+ if (tokens == 0 ) {
758+ auto continueToken = std::move (std::get<TWriteSessionEvent::TReadyToAcceptEvent>(event).ContinuationToken );
759+ writer->WriteEncoded (std::move (continueToken), " " , ECodec::RAW, 0 );
760+ }
761+ ++tokens;
762+ }
763+ Cerr << " GOT EVENT " << acks << " " << tokens << " \n " ;
764+ }
765+ UNIT_ASSERT (!writer->WaitEvent ().Wait (TDuration::Seconds (5 )));
766+
767+ UNIT_ASSERT_VALUES_EQUAL (acks, 4 );
768+ UNIT_ASSERT_VALUES_EQUAL (tokens, 2 );
769+
770+ auto readSettings = TReadSessionSettings ()
771+ .ConsumerName (TEST_CONSUMER)
772+ .AppendTopics (TEST_TOPIC);
773+ std::shared_ptr<IReadSession> readSession = client.CreateReadSession (readSettings);
774+ ui32 readMessageCount = 0 ;
775+ while (readMessageCount < 4 ) {
776+ Cerr << " Get event on client\n " ;
777+ auto event = *readSession->GetEvent (true );
778+ std::visit (TOverloaded {
779+ [&](TReadSessionEvent::TDataReceivedEvent& event) {
780+ for (auto & message: event.GetMessages ()) {
781+ TString sourceId = message.GetMessageGroupId ();
782+ ui32 seqNo = message.GetSeqNo ();
783+ UNIT_ASSERT_VALUES_EQUAL (readMessageCount + 1 , seqNo);
784+ ++readMessageCount;
785+ UNIT_ASSERT_VALUES_EQUAL (message.GetData (), (seqNo % 2 ) == 1 ? " message" : " " );
786+ }
787+ },
788+ [&](TReadSessionEvent::TCommitOffsetAcknowledgementEvent&) {
789+ UNIT_FAIL (" no commits in test" );
790+ },
791+ [&](TReadSessionEvent::TStartPartitionSessionEvent& event) {
792+ event.Confirm ();
793+ },
794+ [&](TReadSessionEvent::TStopPartitionSessionEvent& event) {
795+ event.Confirm ();
796+ },
797+ [&](TReadSessionEvent::TPartitionSessionStatusEvent&) {
798+ UNIT_FAIL (" Test does not support lock sessions yet" );
799+ },
800+ [&](TReadSessionEvent::TPartitionSessionClosedEvent&) {
801+ UNIT_FAIL (" Test does not support lock sessions yet" );
802+ },
803+ [&](TSessionClosedEvent&) {
804+ UNIT_FAIL (" Session closed" );
805+ }
806+
807+ }, event);
808+ }
809+ }
701810} // Y_UNIT_TEST_SUITE(BasicUsage)
702811
703812Y_UNIT_TEST_SUITE (TSettingsValidation) {
0 commit comments