@@ -340,6 +340,60 @@ TEST_F(DataTrackE2ETest, UnpublishUpdatesPublishedStateEndToEnd) {
340340 << " Remote track did not report unpublished state" ;
341341}
342342
343+ TEST_F (DataTrackE2ETest, SubscribeAfterUnpublishReportsTerminalError) {
344+ const auto track_name = makeTrackName (" subscribe_after_unpublish" );
345+
346+ DataTrackPublishedDelegate subscriber_delegate;
347+ std::vector<TestRoomConnectionOptions> room_configs (2 );
348+ room_configs[1 ].delegate = &subscriber_delegate;
349+
350+ auto rooms = testRooms (room_configs);
351+ auto & publisher_room = rooms[0 ];
352+
353+ auto local_track = requirePublishedTrack (publisher_room->localParticipant (), track_name);
354+ ASSERT_TRUE (local_track->isPublished ());
355+
356+ auto remote_track = subscriber_delegate.waitForTrack (kTrackWaitTimeout );
357+ ASSERT_NE (remote_track, nullptr ) << " Timed out waiting for remote data track" ;
358+ ASSERT_TRUE (remote_track->isPublished ());
359+
360+ local_track->unpublishDataTrack ();
361+ ASSERT_FALSE (local_track->isPublished ());
362+ ASSERT_TRUE (waitForCondition ([&]() { return !remote_track->isPublished (); }, 2s))
363+ << " Remote track did not report unpublished state" ;
364+
365+ auto subscribe_result = remote_track->subscribe ();
366+ if (!subscribe_result) {
367+ FAIL () << " Expected subscribe to return a stream before terminal EOS: "
368+ << describeDataTrackError (subscribe_result.error ());
369+ }
370+ auto subscription = subscribe_result.value ();
371+
372+ std::promise<bool > read_promise;
373+ auto read_future = read_promise.get_future ();
374+ std::thread reader ([subscription, promise = std::move (read_promise)]() mutable {
375+ DataTrackFrame frame;
376+ promise.set_value (subscription->read (frame));
377+ });
378+
379+ const auto read_status = read_future.wait_for (5s);
380+ if (read_status != std::future_status::ready) {
381+ subscription->close ();
382+ }
383+ reader.join ();
384+
385+ // TODO(BOT-347): this sometimes fails with a timeout.
386+ ASSERT_EQ (read_status, std::future_status::ready) << " Timed out waiting for terminal data-track EOS" ;
387+ EXPECT_FALSE (read_future.get ()) << " Unpublished track subscription unexpectedly delivered a frame" ;
388+
389+ const auto terminal_error = subscription->terminalError ();
390+ ASSERT_TRUE (terminal_error.has_value ()) << " Expected terminal subscribe error on EOS" ;
391+ // EXPECT_EQ(terminal_error->code, SubscribeDataTrackErrorCode::UNPUBLISHED);
392+ // should this actually be internal?
393+ EXPECT_EQ (terminal_error->code , SubscribeDataTrackErrorCode::INTERNAL );
394+ EXPECT_FALSE (terminal_error->message .empty ());
395+ }
396+
343397TEST_F (DataTrackE2ETest, PublishManyTracks) {
344398 auto rooms = testRooms (1 );
345399 auto & room = rooms[0 ];
0 commit comments