Index: webrtc/modules/audio_processing/aec3/block_processor_unittest.cc |
diff --git a/webrtc/modules/audio_processing/aec3/block_processor_unittest.cc b/webrtc/modules/audio_processing/aec3/block_processor_unittest.cc |
index 6e22b41879322c29e7b15b3342f83da31d1efc59..b5d6a1432f4a9d6891020d1d8a61d4e1cc5c0138 100644 |
--- a/webrtc/modules/audio_processing/aec3/block_processor_unittest.cc |
+++ b/webrtc/modules/audio_processing/aec3/block_processor_unittest.cc |
@@ -15,12 +15,24 @@ |
#include <string> |
#include <vector> |
+#include "webrtc/base/checks.h" |
+#include "webrtc/base/random.h" |
#include "webrtc/modules/audio_processing/aec3/aec3_constants.h" |
+#include "webrtc/modules/audio_processing/aec3/mock/mock_echo_remover.h" |
+#include "webrtc/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h" |
+#include "webrtc/modules/audio_processing/aec3/mock/mock_render_delay_controller.h" |
+#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h" |
+#include "webrtc/test/gmock.h" |
#include "webrtc/test/gtest.h" |
namespace webrtc { |
namespace { |
+using testing::AtLeast; |
+using testing::Return; |
+using testing::StrictMock; |
+using testing::_; |
+ |
// Verifies that the basic BlockProcessor functionality works and that the API |
// methods are callable. |
void RunBasicSetupAndApiCallTest(int sample_rate_hz) { |
@@ -29,9 +41,9 @@ void RunBasicSetupAndApiCallTest(int sample_rate_hz) { |
std::vector<std::vector<float>> block(NumBandsForRate(sample_rate_hz), |
std::vector<float>(kBlockSize, 0.f)); |
- EXPECT_FALSE(block_processor->BufferRender(&block)); |
+ EXPECT_TRUE(block_processor->BufferRender(&block)); |
block_processor->ProcessCapture(false, false, &block); |
- block_processor->ReportEchoLeakage(false); |
+ block_processor->UpdateEchoLeakageStatus(false); |
} |
#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
@@ -86,6 +98,110 @@ std::string ProduceDebugText(int sample_rate_hz) { |
} // namespace |
+// Verifies that the delay controller functionality is properly integrated with |
+// the render delay buffer inside block processor. |
+// TODO(peah): Activate the unittest once the required code has been landed. |
+TEST(BlockProcessor, DISABLED_DelayControllerIntegration) { |
+ constexpr size_t kNumBlocks = 310; |
+ constexpr size_t kDelayInSamples = 640; |
+ constexpr size_t kDelayHeadroom = 1; |
+ constexpr size_t kDelayInBlocks = |
+ kDelayInSamples / kBlockSize - kDelayHeadroom; |
+ Random random_generator(42U); |
+ for (auto rate : {8000, 16000, 32000, 48000}) { |
+ SCOPED_TRACE(ProduceDebugText(rate)); |
+ std::unique_ptr<testing::StrictMock<webrtc::test::MockRenderDelayBuffer>> |
+ render_delay_buffer_mock( |
+ new StrictMock<webrtc::test::MockRenderDelayBuffer>(rate)); |
+ EXPECT_CALL(*render_delay_buffer_mock, Insert(_)) |
+ .Times(kNumBlocks) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*render_delay_buffer_mock, IsBlockAvailable()) |
+ .Times(kNumBlocks) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*render_delay_buffer_mock, SetDelay(kDelayInBlocks)) |
+ .Times(AtLeast(1)); |
+ EXPECT_CALL(*render_delay_buffer_mock, MaxDelay()).WillOnce(Return(30)); |
+ EXPECT_CALL(*render_delay_buffer_mock, MaxApiJitter()).WillOnce(Return(30)); |
+ EXPECT_CALL(*render_delay_buffer_mock, Delay()) |
+ .Times(kNumBlocks + 1) |
+ .WillRepeatedly(Return(0)); |
+ std::unique_ptr<BlockProcessor> block_processor( |
+ BlockProcessor::Create(rate, std::move(render_delay_buffer_mock))); |
+ |
+ std::vector<std::vector<float>> render_block( |
+ NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
+ std::vector<std::vector<float>> capture_block( |
+ NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
+ DelayBuffer<float> signal_delay_buffer(kDelayInSamples); |
+ for (size_t k = 0; k < kNumBlocks; ++k) { |
+ RandomizeSampleVector(&random_generator, render_block[0]); |
+ signal_delay_buffer.Delay(render_block[0], capture_block[0]); |
+ EXPECT_TRUE(block_processor->BufferRender(&render_block)); |
+ block_processor->ProcessCapture(false, false, &capture_block); |
+ } |
+ } |
+} |
+ |
+// Verifies that BlockProcessor submodules are called in a proper manner. |
+TEST(BlockProcessor, SubmoduleIntegration) { |
+ constexpr size_t kNumBlocks = 310; |
+ Random random_generator(42U); |
+ for (auto rate : {8000, 16000, 32000, 48000}) { |
+ SCOPED_TRACE(ProduceDebugText(rate)); |
+ std::unique_ptr<testing::StrictMock<webrtc::test::MockRenderDelayBuffer>> |
+ render_delay_buffer_mock( |
+ new StrictMock<webrtc::test::MockRenderDelayBuffer>(rate)); |
+ std::unique_ptr< |
+ testing::StrictMock<webrtc::test::MockRenderDelayController>> |
+ render_delay_controller_mock( |
+ new StrictMock<webrtc::test::MockRenderDelayController>()); |
+ std::unique_ptr<testing::StrictMock<webrtc::test::MockEchoRemover>> |
+ echo_remover_mock(new StrictMock<webrtc::test::MockEchoRemover>()); |
+ |
+ EXPECT_CALL(*render_delay_buffer_mock, Insert(_)) |
+ .Times(kNumBlocks) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*render_delay_buffer_mock, IsBlockAvailable()) |
+ .Times(kNumBlocks) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*render_delay_buffer_mock, GetNext()).Times(kNumBlocks); |
+ EXPECT_CALL(*render_delay_buffer_mock, SetDelay(9)).Times(AtLeast(1)); |
+ EXPECT_CALL(*render_delay_buffer_mock, Delay()) |
+ .Times(kNumBlocks) |
+ .WillRepeatedly(Return(0)); |
+ EXPECT_CALL(*render_delay_controller_mock, GetDelay(_)) |
+ .Times(kNumBlocks) |
+ .WillRepeatedly(Return(9)); |
+ EXPECT_CALL(*render_delay_controller_mock, AnalyzeRender(_)) |
+ .Times(kNumBlocks) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*render_delay_controller_mock, AlignmentHeadroomSamples()) |
+ .Times(kNumBlocks); |
+ EXPECT_CALL(*echo_remover_mock, ProcessBlock(_, _, _, _, _)) |
+ .Times(kNumBlocks); |
+ EXPECT_CALL(*echo_remover_mock, UpdateEchoLeakageStatus(_)) |
+ .Times(kNumBlocks); |
+ |
+ std::unique_ptr<BlockProcessor> block_processor(BlockProcessor::Create( |
+ rate, std::move(render_delay_buffer_mock), |
+ std::move(render_delay_controller_mock), std::move(echo_remover_mock))); |
+ |
+ std::vector<std::vector<float>> render_block( |
+ NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
+ std::vector<std::vector<float>> capture_block( |
+ NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
+ DelayBuffer<float> signal_delay_buffer(640); |
+ for (size_t k = 0; k < kNumBlocks; ++k) { |
+ RandomizeSampleVector(&random_generator, render_block[0]); |
+ signal_delay_buffer.Delay(render_block[0], capture_block[0]); |
+ EXPECT_TRUE(block_processor->BufferRender(&render_block)); |
+ block_processor->ProcessCapture(false, false, &capture_block); |
+ block_processor->UpdateEchoLeakageStatus(false); |
+ } |
+ } |
+} |
+ |
TEST(BlockProcessor, BasicSetupAndApiCalls) { |
for (auto rate : {8000, 16000, 32000, 48000}) { |
SCOPED_TRACE(ProduceDebugText(rate)); |
@@ -94,30 +210,28 @@ TEST(BlockProcessor, BasicSetupAndApiCalls) { |
} |
#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
-// TODO(peah): Enable all DEATH tests below, or add suppressions, once clarity |
-// has been reached on why they fail on the trybots. |
-TEST(BlockProcessor, DISABLED_VerifyRenderBlockSizeCheck) { |
+TEST(BlockProcessor, VerifyRenderBlockSizeCheck) { |
for (auto rate : {8000, 16000, 32000, 48000}) { |
SCOPED_TRACE(ProduceDebugText(rate)); |
RunRenderBlockSizeVerificationTest(rate); |
} |
} |
-TEST(BlockProcessor, DISABLED_VerifyCaptureBlockSizeCheck) { |
+TEST(BlockProcessor, VerifyCaptureBlockSizeCheck) { |
for (auto rate : {8000, 16000, 32000, 48000}) { |
SCOPED_TRACE(ProduceDebugText(rate)); |
RunCaptureBlockSizeVerificationTest(rate); |
} |
} |
-TEST(BlockProcessor, DISABLED_VerifyRenderNumBandsCheck) { |
+TEST(BlockProcessor, VerifyRenderNumBandsCheck) { |
for (auto rate : {8000, 16000, 32000, 48000}) { |
SCOPED_TRACE(ProduceDebugText(rate)); |
RunRenderNumBandsVerificationTest(rate); |
} |
} |
-TEST(BlockProcessor, DISABLED_VerifyCaptureNumBandsCheck) { |
+TEST(BlockProcessor, VerifyCaptureNumBandsCheck) { |
for (auto rate : {8000, 16000, 32000, 48000}) { |
SCOPED_TRACE(ProduceDebugText(rate)); |
RunCaptureNumBandsVerificationTest(rate); |
@@ -125,14 +239,14 @@ TEST(BlockProcessor, DISABLED_VerifyCaptureNumBandsCheck) { |
} |
// Verifiers that the verification for null ProcessCapture input works. |
-TEST(BlockProcessor, DISABLED_NullProcessCaptureParameter) { |
+TEST(BlockProcessor, NullProcessCaptureParameter) { |
EXPECT_DEATH(std::unique_ptr<BlockProcessor>(BlockProcessor::Create(8000)) |
->ProcessCapture(false, false, nullptr), |
""); |
} |
// Verifiers that the verification for null BufferRender input works. |
-TEST(BlockProcessor, DISABLED_NullBufferRenderParameter) { |
+TEST(BlockProcessor, NullBufferRenderParameter) { |
EXPECT_DEATH(std::unique_ptr<BlockProcessor>(BlockProcessor::Create(8000)) |
->BufferRender(nullptr), |
""); |