Index: content/renderer/media/webrtc/processed_local_audio_source_unittest.cc |
diff --git a/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc b/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc |
deleted file mode 100644 |
index 0abec8ea56dd6deea7cbc541260bd3d793c1cf8a..0000000000000000000000000000000000000000 |
--- a/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc |
+++ /dev/null |
@@ -1,227 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/logging.h" |
-#include "build/build_config.h" |
-#include "content/public/renderer/media_stream_audio_sink.h" |
-#include "content/renderer/media/media_stream_audio_track.h" |
-#include "content/renderer/media/mock_audio_device_factory.h" |
-#include "content/renderer/media/mock_constraint_factory.h" |
-#include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h" |
-#include "content/renderer/media/webrtc/processed_local_audio_source.h" |
-#include "media/base/audio_bus.h" |
-#include "media/base/audio_parameters.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/WebKit/public/platform/WebMediaConstraints.h" |
-#include "third_party/WebKit/public/web/WebHeap.h" |
- |
-using ::testing::_; |
-using ::testing::AtLeast; |
-using ::testing::Invoke; |
-using ::testing::WithArg; |
- |
-namespace content { |
- |
-namespace { |
- |
-// Audio parameters for the VerifyAudioFlowWithoutAudioProcessing test. |
-constexpr int kSampleRate = 48000; |
-constexpr media::ChannelLayout kChannelLayout = media::CHANNEL_LAYOUT_STEREO; |
-constexpr int kRequestedBufferSize = 512; |
- |
-// On Android, ProcessedLocalAudioSource forces a 20ms buffer size from the |
-// input device. |
-#if defined(OS_ANDROID) |
-constexpr int kExpectedSourceBufferSize = kSampleRate / 50; |
-#else |
-constexpr int kExpectedSourceBufferSize = kRequestedBufferSize; |
-#endif |
- |
-// On both platforms, even though audio processing is turned off, the |
-// MediaStreamAudioProcessor will force the use of 10ms buffer sizes on the |
-// output end of its FIFO. |
-constexpr int kExpectedOutputBufferSize = kSampleRate / 100; |
- |
-class MockMediaStreamAudioSink : public MediaStreamAudioSink { |
- public: |
- MockMediaStreamAudioSink() {} |
- ~MockMediaStreamAudioSink() override {} |
- |
- void OnData(const media::AudioBus& audio_bus, |
- base::TimeTicks estimated_capture_time) override { |
- EXPECT_EQ(audio_bus.channels(), params_.channels()); |
- EXPECT_EQ(audio_bus.frames(), params_.frames_per_buffer()); |
- EXPECT_FALSE(estimated_capture_time.is_null()); |
- OnDataCallback(); |
- } |
- MOCK_METHOD0(OnDataCallback, void()); |
- |
- void OnSetFormat(const media::AudioParameters& params) override { |
- params_ = params; |
- FormatIsSet(params_); |
- } |
- MOCK_METHOD1(FormatIsSet, void(const media::AudioParameters& params)); |
- |
- private: |
- media::AudioParameters params_; |
-}; |
- |
-} // namespace |
- |
-class ProcessedLocalAudioSourceTest : public testing::Test { |
- protected: |
- ProcessedLocalAudioSourceTest() {} |
- |
- ~ProcessedLocalAudioSourceTest() override {} |
- |
- void SetUp() override { |
- blink_audio_source_.initialize(blink::WebString::fromUTF8("audio_label"), |
- blink::WebMediaStreamSource::TypeAudio, |
- blink::WebString::fromUTF8("audio_track"), |
- false /* remote */); |
- blink_audio_track_.initialize(blink_audio_source_.id(), |
- blink_audio_source_); |
- } |
- |
- void TearDown() override { |
- blink_audio_track_.reset(); |
- blink_audio_source_.reset(); |
- blink::WebHeap::collectAllGarbageForTesting(); |
- } |
- |
- void CreateProcessedLocalAudioSource( |
- const blink::WebMediaConstraints& constraints) { |
- ProcessedLocalAudioSource* const source = |
- new ProcessedLocalAudioSource( |
- -1 /* consumer_render_frame_id is N/A for non-browser tests */, |
- StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "Mock audio device", |
- "mock_audio_device_id", kSampleRate, |
- kChannelLayout, kRequestedBufferSize), |
- &mock_dependency_factory_); |
- source->SetAllowInvalidRenderFrameIdForTesting(true); |
- source->SetSourceConstraints(constraints); |
- blink_audio_source_.setExtraData(source); // Takes ownership. |
- } |
- |
- void CheckSourceFormatMatches(const media::AudioParameters& params) { |
- EXPECT_EQ(kSampleRate, params.sample_rate()); |
- EXPECT_EQ(kChannelLayout, params.channel_layout()); |
- EXPECT_EQ(kExpectedSourceBufferSize, params.frames_per_buffer()); |
- } |
- |
- void CheckOutputFormatMatches(const media::AudioParameters& params) { |
- EXPECT_EQ(kSampleRate, params.sample_rate()); |
- EXPECT_EQ(kChannelLayout, params.channel_layout()); |
- EXPECT_EQ(kExpectedOutputBufferSize, params.frames_per_buffer()); |
- } |
- |
- MockAudioDeviceFactory* mock_audio_device_factory() { |
- return &mock_audio_device_factory_; |
- } |
- |
- media::AudioCapturerSource::CaptureCallback* capture_source_callback() const { |
- return static_cast<media::AudioCapturerSource::CaptureCallback*>( |
- ProcessedLocalAudioSource::From(audio_source())); |
- } |
- |
- MediaStreamAudioSource* audio_source() const { |
- return MediaStreamAudioSource::From(blink_audio_source_); |
- } |
- |
- const blink::WebMediaStreamTrack& blink_audio_track() { |
- return blink_audio_track_; |
- } |
- |
- private: |
- MockAudioDeviceFactory mock_audio_device_factory_; |
- MockPeerConnectionDependencyFactory mock_dependency_factory_; |
- blink::WebMediaStreamSource blink_audio_source_; |
- blink::WebMediaStreamTrack blink_audio_track_; |
-}; |
- |
-// Tests a basic end-to-end start-up, track+sink connections, audio flow, and |
-// shut-down. The unit tests in media_stream_audio_unittest.cc provide more |
-// comprehensive testing of the object graph connections and multi-threading |
-// concerns. |
-TEST_F(ProcessedLocalAudioSourceTest, VerifyAudioFlowWithoutAudioProcessing) { |
- using ThisTest = |
- ProcessedLocalAudioSourceTest_VerifyAudioFlowWithoutAudioProcessing_Test; |
- |
- // Turn off the default constraints so the sink will get audio in chunks of |
- // the native buffer size. |
- MockConstraintFactory constraint_factory; |
- constraint_factory.DisableDefaultAudioConstraints(); |
- |
- CreateProcessedLocalAudioSource( |
- constraint_factory.CreateWebMediaConstraints()); |
- |
- // Connect the track, and expect the MockCapturerSource to be initialized and |
- // started by ProcessedLocalAudioSource. |
- EXPECT_CALL(*mock_audio_device_factory()->mock_capturer_source(), |
- Initialize(_, capture_source_callback(), -1)) |
- .WillOnce(WithArg<0>(Invoke(this, &ThisTest::CheckSourceFormatMatches))); |
- EXPECT_CALL(*mock_audio_device_factory()->mock_capturer_source(), |
- SetAutomaticGainControl(true)); |
- EXPECT_CALL(*mock_audio_device_factory()->mock_capturer_source(), Start()); |
- ASSERT_TRUE(audio_source()->ConnectToTrack(blink_audio_track())); |
- CheckOutputFormatMatches(audio_source()->GetAudioParameters()); |
- |
- // Connect a sink to the track. |
- std::unique_ptr<MockMediaStreamAudioSink> sink( |
- new MockMediaStreamAudioSink()); |
- EXPECT_CALL(*sink, FormatIsSet(_)) |
- .WillOnce(Invoke(this, &ThisTest::CheckOutputFormatMatches)); |
- MediaStreamAudioTrack::From(blink_audio_track())->AddSink(sink.get()); |
- |
- // Feed audio data into the ProcessedLocalAudioSource and expect it to reach |
- // the sink. |
- int delay_ms = 65; |
- bool key_pressed = true; |
- double volume = 0.9; |
- std::unique_ptr<media::AudioBus> audio_bus = |
- media::AudioBus::Create(2, kExpectedSourceBufferSize); |
- audio_bus->Zero(); |
- EXPECT_CALL(*sink, OnDataCallback()).Times(AtLeast(1)); |
- capture_source_callback()->Capture(audio_bus.get(), delay_ms, volume, |
- key_pressed); |
- |
- // Expect the ProcessedLocalAudioSource to auto-stop the MockCapturerSource |
- // when the track is stopped. |
- EXPECT_CALL(*mock_audio_device_factory()->mock_capturer_source(), Stop()); |
- MediaStreamAudioTrack::From(blink_audio_track())->Stop(); |
-} |
- |
-// Tests that the source is not started when invalid audio constraints are |
-// present. |
-TEST_F(ProcessedLocalAudioSourceTest, FailToStartWithWrongConstraints) { |
- MockConstraintFactory constraint_factory; |
- const std::string dummy_constraint = "dummy"; |
- // Set a non-audio constraint. |
- constraint_factory.basic().width.setExact(240); |
- |
- CreateProcessedLocalAudioSource( |
- constraint_factory.CreateWebMediaConstraints()); |
- |
- // Expect the MockCapturerSource is never initialized/started and the |
- // ConnectToTrack() operation fails due to the invalid constraint. |
- EXPECT_CALL(*mock_audio_device_factory()->mock_capturer_source(), |
- Initialize(_, capture_source_callback(), -1)) |
- .Times(0); |
- EXPECT_CALL(*mock_audio_device_factory()->mock_capturer_source(), |
- SetAutomaticGainControl(true)).Times(0); |
- EXPECT_CALL(*mock_audio_device_factory()->mock_capturer_source(), Start()) |
- .Times(0); |
- EXPECT_FALSE(audio_source()->ConnectToTrack(blink_audio_track())); |
- |
- // Even though ConnectToTrack() failed, there should still have been a new |
- // MediaStreamAudioTrack instance created, owned by the |
- // blink::WebMediaStreamTrack. |
- EXPECT_TRUE(MediaStreamAudioTrack::From(blink_audio_track())); |
-} |
- |
-// TODO(miu): There's a lot of logic in ProcessedLocalAudioSource around |
-// constraints processing and validation that should have unit testing. |
- |
-} // namespace content |