@@ -1175,6 +1175,49 @@ def test_alternating_threads_status_changes(self):
11751175 self .assertEqual (count , 100 )
11761176 self .assert_samples_equal (samples , collector )
11771177
1178+ def test_rle_alternating_status_batches_correctly (self ):
1179+ """A repeat record whose status alternates every sample replays as N
1180+ single-status batches with the right cumulative timestamps."""
1181+ class BatchCollector :
1182+ def __init__ (self ):
1183+ self .batches = []
1184+
1185+ def collect (self , stack_frames , timestamps_us ):
1186+ for interp in stack_frames :
1187+ for thread in interp .threads :
1188+ self .batches .append (
1189+ (thread .status , list (timestamps_us ))
1190+ )
1191+
1192+ def export (self , filename ):
1193+ pass
1194+
1195+ num_samples = 2000
1196+ frame = make_frame ("rle.py" , 42 , "rle_func" )
1197+ with tempfile .NamedTemporaryFile (suffix = ".bin" , delete = False ) as f :
1198+ filename = f .name
1199+ self .temp_files .append (filename )
1200+
1201+ writer = BinaryCollector (filename , 1000 , compression = "none" )
1202+ expected = []
1203+ for i in range (num_samples ):
1204+ status = THREAD_STATUS_HAS_GIL if i % 2 else 0
1205+ ts = 1000 + i
1206+ expected .append ((status , [ts ]))
1207+ sample = [
1208+ make_interpreter (0 , [make_thread (1 , [frame ], status )])
1209+ ]
1210+ writer .collect (sample , timestamp_us = ts )
1211+ writer .export (None )
1212+
1213+ collector = BatchCollector ()
1214+ with BinaryReader (filename ) as reader :
1215+ count = reader .replay_samples (collector )
1216+
1217+ self .assertEqual (count , num_samples )
1218+ self .assertEqual (len (collector .batches ), num_samples )
1219+ self .assertEqual (collector .batches , expected )
1220+
11781221
11791222class TestBinaryStress (BinaryFormatTestBase ):
11801223 """Randomized stress tests for binary format."""
0 commit comments