This source file includes following definitions.
- source_
- ConsumeData
- RunOnAudioThread
- RunOnceOnAudioThread
- StopStartOnAudioThread
- TimeCallbacksOnAudioThread
- EndTest
- TEST_F
- TEST_F
- TEST_F
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "base/time/time.h"
#include "media/audio/audio_buffers_state.h"
#include "media/audio/audio_parameters.h"
#include "media/audio/fake_audio_consumer.h"
#include "media/audio/simple_sources.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
static const int kTestCallbacks = 5;
class FakeAudioConsumerTest : public testing::Test {
public:
FakeAudioConsumerTest()
: params_(
AudioParameters::AUDIO_FAKE, CHANNEL_LAYOUT_STEREO, 44100, 8, 128),
fake_consumer_(message_loop_.message_loop_proxy(), params_),
source_(params_.channels(), 200.0, params_.sample_rate()) {
time_between_callbacks_ = base::TimeDelta::FromMicroseconds(
params_.frames_per_buffer() * base::Time::kMicrosecondsPerSecond /
static_cast<float>(params_.sample_rate()));
}
virtual ~FakeAudioConsumerTest() {}
void ConsumeData(AudioBus* audio_bus) {
source_.OnMoreData(audio_bus, AudioBuffersState());
}
void RunOnAudioThread() {
ASSERT_TRUE(message_loop_.message_loop_proxy()->BelongsToCurrentThread());
fake_consumer_.Start(base::Bind(
&FakeAudioConsumerTest::ConsumeData, base::Unretained(this)));
}
void RunOnceOnAudioThread() {
ASSERT_TRUE(message_loop_.message_loop_proxy()->BelongsToCurrentThread());
RunOnAudioThread();
message_loop_.PostTask(FROM_HERE, base::Bind(
&FakeAudioConsumerTest::EndTest, base::Unretained(this), 1));
}
void StopStartOnAudioThread() {
ASSERT_TRUE(message_loop_.message_loop_proxy()->BelongsToCurrentThread());
fake_consumer_.Stop();
RunOnAudioThread();
}
void TimeCallbacksOnAudioThread(int callbacks) {
ASSERT_TRUE(message_loop_.message_loop_proxy()->BelongsToCurrentThread());
if (source_.callbacks() == 0) {
RunOnAudioThread();
start_time_ = base::TimeTicks::Now();
}
if (source_.callbacks() < callbacks) {
message_loop_.PostDelayedTask(FROM_HERE, base::Bind(
&FakeAudioConsumerTest::TimeCallbacksOnAudioThread,
base::Unretained(this), callbacks), time_between_callbacks_ / 2);
} else {
end_time_ = base::TimeTicks::Now();
EndTest(callbacks);
}
}
void EndTest(int callbacks) {
ASSERT_TRUE(message_loop_.message_loop_proxy()->BelongsToCurrentThread());
fake_consumer_.Stop();
EXPECT_LE(callbacks, source_.callbacks());
message_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
}
protected:
base::MessageLoop message_loop_;
AudioParameters params_;
FakeAudioConsumer fake_consumer_;
SineWaveAudioSource source_;
base::TimeTicks start_time_;
base::TimeTicks end_time_;
base::TimeDelta time_between_callbacks_;
private:
DISALLOW_COPY_AND_ASSIGN(FakeAudioConsumerTest);
};
TEST_F(FakeAudioConsumerTest, FakeStreamBasicCallback) {
message_loop_.PostTask(FROM_HERE, base::Bind(
&FakeAudioConsumerTest::RunOnceOnAudioThread,
base::Unretained(this)));
message_loop_.Run();
}
TEST_F(FakeAudioConsumerTest, TimeBetweenCallbacks) {
message_loop_.PostTask(FROM_HERE, base::Bind(
&FakeAudioConsumerTest::TimeCallbacksOnAudioThread,
base::Unretained(this), kTestCallbacks));
message_loop_.Run();
base::TimeDelta actual_time_between_callbacks =
(end_time_ - start_time_) / (source_.callbacks() - 1);
EXPECT_TRUE(actual_time_between_callbacks >= time_between_callbacks_);
if (actual_time_between_callbacks > 2 * time_between_callbacks_)
LOG(ERROR) << "Time between fake audio callbacks is too large!";
}
TEST_F(FakeAudioConsumerTest, StartStopClearsCallbacks) {
message_loop_.PostTask(FROM_HERE, base::Bind(
&FakeAudioConsumerTest::TimeCallbacksOnAudioThread,
base::Unretained(this), kTestCallbacks));
message_loop_.PostDelayedTask(FROM_HERE, base::Bind(
&FakeAudioConsumerTest::StopStartOnAudioThread,
base::Unretained(this)), time_between_callbacks_ / 2);
message_loop_.Run();
}
}