Call `OnSubscribeAccepted` when adding a listener to `MoqtRelayTrackPublisher`. The second subscriber to a track was not receiving SUBSCRIBE_OK or objects because this was missing. PiperOrigin-RevId: 827561493
diff --git a/quiche/quic/moqt/moqt_relay_track_publisher.cc b/quiche/quic/moqt/moqt_relay_track_publisher.cc index 129d9cd..ef6802e 100644 --- a/quiche/quic/moqt/moqt_relay_track_publisher.cc +++ b/quiche/quic/moqt/moqt_relay_track_publisher.cc
@@ -50,6 +50,7 @@ next_location_ = ok_data.largest_location.has_value() ? ok_data.largest_location->Next() : Location(0, 0); + got_response_ = true; // TODO(martinduke): Handle parameters. for (MoqtObjectListener* listener : listeners_) { listener->OnSubscribeAccepted(); @@ -288,6 +289,9 @@ session->SubscribeCurrentObject(track_, this, VersionSpecificParameters()); } listeners_.insert(listener); + if (got_response_) { + listener->OnSubscribeAccepted(); + } } void MoqtRelayTrackPublisher::RemoveObjectListener(
diff --git a/quiche/quic/moqt/moqt_relay_track_publisher.h b/quiche/quic/moqt/moqt_relay_track_publisher.h index 12e74dc..0aa2c0c 100644 --- a/quiche/quic/moqt/moqt_relay_track_publisher.h +++ b/quiche/quic/moqt/moqt_relay_track_publisher.h
@@ -138,6 +138,7 @@ }; bool is_closing_ = false; + bool got_response_ = false; const quic::QuicClock* clock_; FullTrackName track_; quiche::QuicheWeakPtr<MoqtSessionInterface> upstream_;
diff --git a/quiche/quic/moqt/moqt_relay_track_publisher_test.cc b/quiche/quic/moqt/moqt_relay_track_publisher_test.cc index 360175f..aaf1d88 100644 --- a/quiche/quic/moqt/moqt_relay_track_publisher_test.cc +++ b/quiche/quic/moqt/moqt_relay_track_publisher_test.cc
@@ -332,7 +332,15 @@ .WillOnce(testing::Return(true)); publisher_.AddObjectListener(&listener_); EXPECT_CALL(*session_, SubscribeCurrentObject).Times(0); - publisher_.AddObjectListener(&listener_); + EXPECT_CALL(listener_, OnSubscribeAccepted).Times(0); + MockMoqtObjectListener listener2; + publisher_.AddObjectListener(&listener2); + EXPECT_CALL(listener_, OnSubscribeAccepted); + EXPECT_CALL(listener2, OnSubscribeAccepted); + publisher_.OnReply( + kTrackName, + SubscribeOkData{quic::QuicTimeDelta::Infinite(), + MoqtDeliveryOrder::kAscending, kLargestLocation}); } TEST_F(MoqtRelayTrackPublisherTest, OnMalformedObject) { @@ -369,6 +377,14 @@ publisher_.OnStreamReset(kTrackName, DataStreamIndex{2, 0}); } +TEST_F(MoqtRelayTrackPublisherTest, SecondSubscribeAfterOk) { + SubscribeAndOk(); + EXPECT_CALL(*session_, SubscribeCurrentObject).Times(0); + MockMoqtObjectListener listener2; + EXPECT_CALL(listener2, OnSubscribeAccepted); + publisher_.AddObjectListener(&listener2); +} + } // namespace } // namespace moqt::test