@@ -1069,21 +1069,7 @@ TEST(ReaderTest, testReadCompactedWithNullValue) {
10691069 ASSERT_EQ (ResultOk,
10701070 producer.send (MessageBuilder ().setPartitionKey (" key1" ).setContent (" value1-updated" ).build ()));
10711071
1072- // Trigger compaction via admin API
1073- {
1074- // Build compaction URL directly from topicName to avoid mismatches
1075- // topicName is "persistent://public/default/..." -> need "persistent/public/default/..."
1076- std::string topicPath = topicName;
1077- std::size_t schemePos = topicPath.find (" ://" );
1078- if (schemePos != std::string::npos) {
1079- topicPath.erase (schemePos, 3 );
1080- }
1081- std::string compactUrl = adminUrl + " admin/v2/" + topicPath + " /compaction" ;
1082- int res = makePutRequest (compactUrl, " " );
1083- ASSERT_TRUE (res == 204 || res == 409 ) << " Failed to trigger compaction, res: " << res;
1084- }
1085-
1086- // Create a reader with readCompacted enabled
1072+ // Create a reader with readCompacted enabled to read all messages (before compaction runs)
10871073 ReaderConfiguration readerConf;
10881074 readerConf.setReadCompacted (true );
10891075 Reader reader;
@@ -1092,12 +1078,14 @@ TEST(ReaderTest, testReadCompactedWithNullValue) {
10921078 // Read all messages and verify we can detect null values
10931079 std::map<std::string, std::string> keyValues;
10941080 std::set<std::string> nullValueKeys;
1081+ int messageCount = 0 ;
10951082
10961083 bool hasMessageAvailable = false ;
10971084 ASSERT_EQ (ResultOk, reader.hasMessageAvailable (hasMessageAvailable));
10981085 while (hasMessageAvailable) {
10991086 Message msg;
11001087 ASSERT_EQ (ResultOk, reader.readNext (msg, 3000 ));
1088+ messageCount++;
11011089
11021090 std::string key = msg.getPartitionKey ();
11031091 if (msg.hasNullValue ()) {
@@ -1111,19 +1099,16 @@ TEST(ReaderTest, testReadCompactedWithNullValue) {
11111099 ASSERT_EQ (ResultOk, reader.hasMessageAvailable (hasMessageAvailable));
11121100 }
11131101
1114- // Verify we actually read messages (test should not silently succeed with no messages)
1115- ASSERT_FALSE (keyValues.empty () && nullValueKeys.empty ()) << " Expected to read at least one message" ;
1102+ // Verify we read all 5 messages
1103+ ASSERT_EQ (messageCount, 5 ) << " Expected to read 5 messages" ;
1104+
1105+ // Verify the null value message was received and detected
1106+ ASSERT_EQ (nullValueKeys.size (), 1 ) << " Expected exactly one null value message" ;
1107+ ASSERT_TRUE (nullValueKeys.count (" key2" ) > 0 ) << " key2 should have a null value (tombstone)" ;
11161108
1117- // Verify concrete outcomes:
1118- // - key1 should have the updated value "value1-updated"
1119- // - key2 should either be a tombstone (null value) or absent after compaction
1120- // - key3 should have value "value3"
1121- ASSERT_TRUE (keyValues.count (" key1" ) > 0 ) << " key1 should be present" ;
1109+ // Verify key1 has the latest value (value1-updated overwrites value1)
11221110 ASSERT_EQ (keyValues[" key1" ], " value1-updated" ) << " key1 should have the updated value" ;
1123- ASSERT_TRUE (keyValues.count (" key3" ) > 0 ) << " key3 should be present" ;
11241111 ASSERT_EQ (keyValues[" key3" ], " value3" ) << " key3 should have value3" ;
1125- ASSERT_TRUE (nullValueKeys.count (" key2" ) > 0 || keyValues.count (" key2" ) == 0 )
1126- << " key2 should either have a null value or be absent after compaction" ;
11271112
11281113 producer.close ();
11291114 reader.close ();
0 commit comments