Add StopOutputOnWriteFailure to RtcEventLogImplTest

Bug: chromium:1288710
Change-Id: Ib913fb392077512d43ea408c95115129d3ff3425
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/295800
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Commit-Queue: Jianhui J Dai <jianhui.j.dai@intel.com>
Reviewed-by: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39509}
This commit is contained in:
Jianhui Dai 2023-03-08 14:14:19 +08:00 committed by WebRTC LUCI CQ
parent d4f2ccb7c0
commit 7d6b5b878f

View File

@ -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 {
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<FakeOutput>(written_data_),
kOutputPeriod.ms());
event_log_.StartLogging(std::move(output_), kOutputPeriod.ms());
event_log_.Log(std::make_unique<FakeConfigEvent>());
event_log_.Log(std::make_unique<FakeEvent>());
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<FakeOutput>(written_data_),
kOutputPeriod.ms());
event_log_.StartLogging(std::move(output_), kOutputPeriod.ms());
event_log_.Log(std::make_unique<FakeConfigEvent>());
for (size_t i = 0; i < kNumberOfEvents; i++) {
event_log_.Log(std::make_unique<FakeEvent>());
@ -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<FakeEvent>());
}
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<FakeEvent>());
}
time_controller_.AdvanceTime(kOutputPeriod);
event_log_.StopLogging();
EXPECT_EQ(number_of_encoded_events, kFailsWriteOnEventsCount);
Mock::VerifyAndClearExpectations(encoder_ptr_);
}
} // namespace
} // namespace webrtc