@@ -751,6 +751,121 @@ TEST_P(STDcpTest, test_consumer_add_stream) {
751751 EXPECT_TRUE (connMap.isDeadConnectionsEmpty ());
752752}
753753
754+ // Tests that the MutationResponse created for the deletion response is of the
755+ // correct size.
756+ TEST_P (STDcpTest, test_mb24424_deleteResponse) {
757+ setVBucketStateAndRunPersistTask (vbid, vbucket_state_replica);
758+ const void * cookie = create_mock_cookie (engine.get ());
759+ Vbid vbid = Vbid (0 );
760+
761+ auto & connMap = static_cast <MockDcpConnMap&>(engine->getDcpConnMap ());
762+ auto consumer =
763+ std::make_shared<MockDcpConsumer>(*engine, cookie, " test_consumer" );
764+ connMap.addConn (cookie, consumer);
765+
766+ ASSERT_EQ (ENGINE_SUCCESS,
767+ consumer->addStream (/* opaque*/ 0 ,
768+ vbid,
769+ /* flags*/ 0 ));
770+
771+ MockPassiveStream* stream = static_cast <MockPassiveStream*>(
772+ (consumer->getVbucketStream (vbid)).get ());
773+ ASSERT_TRUE (stream->isActive ());
774+
775+ std::string key = " key" ;
776+ const DocKey docKey{reinterpret_cast <const uint8_t *>(key.data ()),
777+ key.size (),
778+ DocKeyEncodesCollectionId::No};
779+ std::array<uint8_t , 1 > extMeta;
780+ extMeta[0 ] = uint8_t (PROTOCOL_BINARY_DATATYPE_JSON);
781+ cb::const_byte_buffer meta{extMeta.data (), extMeta.size ()};
782+
783+ consumer->deletion (/* opaque*/ 1 ,
784+ /* key*/ docKey,
785+ /* value*/ {},
786+ /* priv_bytes*/ 0 ,
787+ /* datatype*/ PROTOCOL_BINARY_RAW_BYTES,
788+ /* cas*/ 0 ,
789+ /* vbucket*/ vbid,
790+ /* bySeqno*/ 1 ,
791+ /* revSeqno*/ 0 ,
792+ /* meta*/ meta);
793+
794+ auto messageSize = MutationResponse::deletionBaseMsgBytes + key.size () +
795+ sizeof (extMeta);
796+
797+ EXPECT_EQ (messageSize, stream->responseMessageSize );
798+
799+ /* Close stream before deleting the connection */
800+ ASSERT_EQ (ENGINE_SUCCESS, consumer->closeStream (/* opaque*/ 0 , vbid));
801+
802+ connMap.disconnect (cookie);
803+ EXPECT_FALSE (connMap.isDeadConnectionsEmpty ());
804+ connMap.manageConnections ();
805+ EXPECT_TRUE (connMap.isDeadConnectionsEmpty ());
806+ }
807+
808+ // Tests that the MutationResponse created for the mutation response is of the
809+ // correct size.
810+ TEST_P (STDcpTest, test_mb24424_mutationResponse) {
811+ setVBucketStateAndRunPersistTask (vbid, vbucket_state_replica);
812+ const void * cookie = create_mock_cookie (engine.get ());
813+ Vbid vbid = Vbid (0 );
814+
815+ auto & connMap = static_cast <MockDcpConnMap&>(engine->getDcpConnMap ());
816+ auto consumer =
817+ std::make_shared<MockDcpConsumer>(*engine, cookie, " test_consumer" );
818+ connMap.addConn (cookie, consumer);
819+
820+ ASSERT_EQ (ENGINE_SUCCESS,
821+ consumer->addStream (/* opaque*/ 0 ,
822+ vbid,
823+ /* flags*/ 0 ));
824+
825+ MockPassiveStream* stream = static_cast <MockPassiveStream*>(
826+ (consumer->getVbucketStream (vbid)).get ());
827+ ASSERT_TRUE (stream->isActive ());
828+
829+ std::string key = " key" ;
830+ std::string data = R"( {"json":"yes"})" ;
831+ const DocKey docKey{reinterpret_cast <const uint8_t *>(key.data ()),
832+ key.size (),
833+ DocKeyEncodesCollectionId::No};
834+ cb::const_byte_buffer value{reinterpret_cast <const uint8_t *>(data.data ()),
835+ data.size ()};
836+ std::array<uint8_t , 1 > extMeta;
837+ extMeta[0 ] = uint8_t (PROTOCOL_BINARY_DATATYPE_JSON);
838+ cb::const_byte_buffer meta{extMeta.data (), extMeta.size ()};
839+
840+ consumer->mutation (/* opaque*/ 1 ,
841+ /* key*/ docKey,
842+ /* values*/ value,
843+ /* priv_bytes*/ 0 ,
844+ /* datatype*/ PROTOCOL_BINARY_DATATYPE_JSON,
845+ /* cas*/ 0 ,
846+ /* vbucket*/ vbid,
847+ /* flags*/ 0 ,
848+ /* bySeqno*/ 1 ,
849+ /* revSeqno*/ 0 ,
850+ /* exptime*/ 0 ,
851+ /* lock_time*/ 0 ,
852+ /* meta*/ meta,
853+ /* nru*/ 0 );
854+
855+ auto messageSize = MutationResponse::mutationBaseMsgBytes + key.size () +
856+ data.size () + sizeof (extMeta);
857+
858+ EXPECT_EQ (messageSize, stream->responseMessageSize );
859+
860+ /* Close stream before deleting the connection */
861+ ASSERT_EQ (ENGINE_SUCCESS, consumer->closeStream (/* opaque*/ 0 , vbid));
862+
863+ connMap.disconnect (cookie);
864+ EXPECT_FALSE (connMap.isDeadConnectionsEmpty ());
865+ connMap.manageConnections ();
866+ EXPECT_TRUE (connMap.isDeadConnectionsEmpty ());
867+ }
868+
754869void STDcpTest::sendConsumerMutationsNearThreshold (bool beyondThreshold) {
755870 setVBucketStateAndRunPersistTask (vbid, vbucket_state_replica);
756871
0 commit comments