@@ -367,6 +367,78 @@ TEST_P(DataTrackTransportTest, PublishesAndReceivesFramesEndToEnd) {
367367 EXPECT_TRUE (remote_track_published_after_read);
368368}
369369
370+ TEST_F (DataTrackE2ETest, ReceivesFramesWithCustomPipelineOptionsEndToEnd) {
371+ constexpr std::size_t payload_len = 1024 ;
372+ const auto track_name = makeTrackName (" pipeline_options" );
373+
374+ std::vector<TestRoomConnectionOptions> room_configs (2 );
375+ room_configs[0 ].room_options .single_peer_connection = false ;
376+ room_configs[1 ].room_options .single_peer_connection = false ;
377+
378+ DataTrackPublishedDelegate subscriber_delegate;
379+ room_configs[1 ].delegate = &subscriber_delegate;
380+
381+ auto rooms = testRooms (room_configs);
382+ auto & publisher_room = rooms[0 ];
383+ const auto publisher_identity = lockLocalParticipant (*publisher_room)->identity ();
384+
385+ auto local_track = requirePublishedTrack (publisher_room->localParticipant (), track_name);
386+ ASSERT_TRUE (local_track->isPublished ());
387+ EXPECT_FALSE (local_track->info ().uses_e2ee );
388+ EXPECT_EQ (local_track->info ().name , track_name);
389+
390+ auto remote_track = subscriber_delegate.waitForTrack (kTrackWaitTimeout );
391+ ASSERT_NE (remote_track, nullptr ) << " Timed out waiting for remote data track" ;
392+ EXPECT_TRUE (remote_track->isPublished ());
393+ EXPECT_FALSE (remote_track->info ().uses_e2ee );
394+ EXPECT_EQ (remote_track->info ().name , track_name);
395+ EXPECT_EQ (remote_track->publisherIdentity (), publisher_identity);
396+
397+ DataTrackPipelineOptions pipeline_options;
398+ pipeline_options.max_partial_frames = 4 ;
399+ remote_track->setPipelineOptions (pipeline_options);
400+
401+ auto subscribe_result = remote_track->subscribe ();
402+ if (!subscribe_result) {
403+ FAIL () << describeDataTrackError (subscribe_result.error ());
404+ }
405+ auto subscription = subscribe_result.value ();
406+
407+ std::atomic<bool > keep_publishing{true };
408+ auto publisher = std::async (std::launch::async, [&]() {
409+ DataTrackFrame frame;
410+ frame.payload .assign (payload_len, kTransportPayloadValue );
411+ while (keep_publishing.load ()) {
412+ requirePushSuccess (local_track->tryPush (frame), " Failed to push data frame" );
413+ std::this_thread::sleep_for (50ms);
414+ }
415+ });
416+
417+ DataTrackFrame frame;
418+ std::exception_ptr read_error;
419+ try {
420+ frame = readFrameWithTimeout (subscription, kTransportFrameTimeout );
421+ } catch (...) {
422+ read_error = std::current_exception ();
423+ }
424+
425+ const bool remote_track_published_after_read = remote_track->isPublished ();
426+ keep_publishing.store (false );
427+ subscription->close ();
428+ local_track->unpublishDataTrack ();
429+
430+ publisher.get ();
431+ if (read_error) {
432+ std::rethrow_exception (read_error);
433+ }
434+
435+ ASSERT_EQ (frame.payload .size (), payload_len);
436+ EXPECT_TRUE (std::all_of (frame.payload .begin (), frame.payload .end (),
437+ [](std::uint8_t byte) { return byte == kTransportPayloadValue ; }));
438+ EXPECT_FALSE (frame.user_timestamp .has_value ());
439+ EXPECT_TRUE (remote_track_published_after_read);
440+ }
441+
370442TEST_F (DataTrackE2ETest, UnpublishUpdatesPublishedStateEndToEnd) {
371443 const auto track_name = makeTrackName (" published_state" );
372444
0 commit comments