diff --git a/logging/rtc_event_log/rtc_event_log_impl_unittest.cc b/logging/rtc_event_log/rtc_event_log_impl_unittest.cc index aea6c7974e..05f7e55308 100644 --- a/logging/rtc_event_log/rtc_event_log_impl_unittest.cc +++ b/logging/rtc_event_log/rtc_event_log_impl_unittest.cc @@ -20,7 +20,9 @@ namespace webrtc { namespace { +using ::testing::_; using ::testing::InSequence; +using ::testing::Invoke; using ::testing::Mock; using ::testing::Property; using ::testing::Ref; @@ -54,15 +56,26 @@ class FakeOutput : public RtcEventLogOutput { public: explicit FakeOutput(std::string& written_data) : written_data_(written_data) {} - bool IsActive() const { return true; } + bool IsActive() const { return is_active_; } bool Write(absl::string_view data) override { - written_data_.append(std::string(data)); - return true; + RTC_DCHECK(is_active_); + if (fails_write_) { + is_active_ = false; + fails_write_ = false; + return false; + } else { + written_data_.append(std::string(data)); + return true; + } } void Flush() override {} + void FailsNextWrite() { fails_write_ = true; } + private: std::string& written_data_; + bool is_active_ = true; + bool fails_write_ = false; }; class FakeEvent : public RtcEvent { @@ -219,8 +232,7 @@ TEST_F(RtcEventLogImplTest, RewritesAllConfigEventsOnlyOnRestart) { } TEST_F(RtcEventLogImplTest, SchedulesWriteAfterOutputDurationPassed) { - event_log_.StartLogging(std::make_unique(written_data_), - kOutputPeriod.ms()); + event_log_.StartLogging(std::move(output_), kOutputPeriod.ms()); event_log_.Log(std::make_unique()); event_log_.Log(std::make_unique()); EXPECT_CALL(*encoder_ptr_, @@ -232,10 +244,9 @@ TEST_F(RtcEventLogImplTest, SchedulesWriteAfterOutputDurationPassed) { } TEST_F(RtcEventLogImplTest, DoNotDropEventsIfHistoryFullAfterStarted) { - const size_t kNumberOfEvents = 10 * kMaxEventsInHistory; + constexpr size_t kNumberOfEvents = 10 * kMaxEventsInHistory; - event_log_.StartLogging(std::make_unique(written_data_), - kOutputPeriod.ms()); + event_log_.StartLogging(std::move(output_), kOutputPeriod.ms()); event_log_.Log(std::make_unique()); for (size_t i = 0; i < kNumberOfEvents; i++) { event_log_.Log(std::make_unique()); @@ -249,5 +260,38 @@ TEST_F(RtcEventLogImplTest, DoNotDropEventsIfHistoryFullAfterStarted) { Mock::VerifyAndClearExpectations(encoder_ptr_); } +TEST_F(RtcEventLogImplTest, StopOutputOnWriteFailure) { + constexpr size_t kNumberOfEvents = 10; + constexpr size_t kFailsWriteOnEventsCount = 5; + + size_t number_of_encoded_events = 0; + EXPECT_CALL(*encoder_ptr_, OnEncode(_)) + .WillRepeatedly(Invoke([this, &number_of_encoded_events]() { + ++number_of_encoded_events; + if (number_of_encoded_events == kFailsWriteOnEventsCount) { + output_ptr_->FailsNextWrite(); + } + return std::string(); + })); + + event_log_.StartLogging(std::move(output_), kOutputPeriod.ms()); + + // Fails `RtcEventLogOutput` on the last event. + for (size_t i = 0; i < kFailsWriteOnEventsCount; i++) { + event_log_.Log(std::make_unique()); + } + time_controller_.AdvanceTime(kOutputPeriod); + // Expect that the remainder events are not encoded. + for (size_t i = kFailsWriteOnEventsCount; i < kNumberOfEvents; i++) { + event_log_.Log(std::make_unique()); + } + time_controller_.AdvanceTime(kOutputPeriod); + event_log_.StopLogging(); + + EXPECT_EQ(number_of_encoded_events, kFailsWriteOnEventsCount); + + Mock::VerifyAndClearExpectations(encoder_ptr_); +} + } // namespace } // namespace webrtc