[go: nahoru, domu]

blob: ba69a21a745d39b7934e79a1bb2f96aa533293a3 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/audio/input_glitch_counter.h"
#include <memory>
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace audio {
namespace {
const std::string kDroppedData10sIntervals =
"Media.AudioCapturerDroppedData10sIntervals";
const std::string kMissedReadDeadline10sIntervals =
"Media.AudioCapturerMissedReadDeadline10sIntervals";
const std::string kDroppedDataBelow10s =
"Media.AudioCapturerDroppedDataBelow10s";
const std::string kMissedReadDeadlineBelow10s =
"Media.AudioCapturerMissedReadDeadlineBelow10s";
class InputGlitchCounterTest : public ::testing::Test {
public:
InputGlitchCounterTest() = default;
InputGlitchCounterTest(const InputGlitchCounterTest&) = delete;
InputGlitchCounterTest& operator=(const InputGlitchCounterTest&) = delete;
base::HistogramTester histogram_tester_;
std::unique_ptr<InputGlitchCounter> input_glitch_counter_ =
std::make_unique<InputGlitchCounter>(
base::BindLambdaForTesting([](const std::string& s) {}));
};
TEST_F(InputGlitchCounterTest, IntervalHistograms) {
for (int i = 0; i < 1000; i++) {
// Miss 5 of the first 1000 deadlines.
input_glitch_counter_->ReportMissedReadDeadline(i % (1000 / 5) == 0);
// Drop 2 of the first 1000 data blocks.
input_glitch_counter_->ReportDroppedData(i % (1000 / 2) == 0);
}
histogram_tester_.ExpectUniqueSample(kDroppedData10sIntervals, 2, 1);
histogram_tester_.ExpectUniqueSample(kMissedReadDeadline10sIntervals, 5, 1);
for (int i = 0; i < 1000; i++) {
// Miss 10 of the second 1000 deadlines.
input_glitch_counter_->ReportMissedReadDeadline(i % (1000 / 10) == 0);
// Drop 4 of the second 1000 data blocks.
input_glitch_counter_->ReportDroppedData(i % (1000 / 4) == 0);
}
histogram_tester_.ExpectTotalCount(kDroppedData10sIntervals, 2);
histogram_tester_.ExpectBucketCount(kDroppedData10sIntervals, 4, 1);
histogram_tester_.ExpectTotalCount(kMissedReadDeadline10sIntervals, 2);
histogram_tester_.ExpectBucketCount(kMissedReadDeadline10sIntervals, 10, 1);
// Since the stream lasted for longer than 10 seconds, we do not expect it to
// upload data for the histograms for less than 10 seconds.
input_glitch_counter_.reset();
histogram_tester_.ExpectTotalCount(kDroppedDataBelow10s, 0);
histogram_tester_.ExpectTotalCount(kMissedReadDeadlineBelow10s, 0);
}
TEST_F(InputGlitchCounterTest, Below10sHistograms) {
for (int i = 0; i < 100; i++) {
// Miss 5 of the first 100 deadlines.
input_glitch_counter_->ReportMissedReadDeadline(i % (100 / 5) == 0);
// Drop 2 of the first 100 data blocks.
input_glitch_counter_->ReportDroppedData(i % (100 / 2) == 0);
}
// Report 30 seconds of trailing errors. We expect these not to be reflected
// in the histograms.
for (int i = 0; i < 3000; i++) {
input_glitch_counter_->ReportDroppedData(true);
input_glitch_counter_->ReportMissedReadDeadline(true);
}
// This histograms should be uploaded upon destruction of
// input_glitch_counter_.
histogram_tester_.ExpectTotalCount(kDroppedDataBelow10s, 0);
histogram_tester_.ExpectTotalCount(kMissedReadDeadlineBelow10s, 0);
input_glitch_counter_.reset();
histogram_tester_.ExpectUniqueSample(kDroppedDataBelow10s, 2, 1);
histogram_tester_.ExpectUniqueSample(kMissedReadDeadlineBelow10s, 5, 1);
// Since the stream was shorter than 10 seconds, no 10 second interval data
// should be logged.
histogram_tester_.ExpectTotalCount(kDroppedData10sIntervals, 0);
histogram_tester_.ExpectTotalCount(kMissedReadDeadline10sIntervals, 0);
}
TEST_F(InputGlitchCounterTest, BinaryGlitchMetricTrue) {
input_glitch_counter_->ReportDroppedData(true);
input_glitch_counter_->ReportDroppedData(false);
input_glitch_counter_.reset();
histogram_tester_.ExpectUniqueSample("Media.AudioCapturerAudioGlitches", 1,
1);
}
TEST_F(InputGlitchCounterTest, BinaryGlitchMetricFalse) {
// This drop will be considered trailing.
input_glitch_counter_->ReportDroppedData(true);
input_glitch_counter_.reset();
histogram_tester_.ExpectUniqueSample("Media.AudioCapturerAudioGlitches", 0,
1);
}
} // namespace
} // namespace audio