1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 #include "base/bind_helpers.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/test/simple_test_tick_clock.h"
11 #include "media/base/media.h"
12 #include "media/cast/audio_sender/audio_sender.h"
13 #include "media/cast/cast_config.h"
14 #include "media/cast/cast_environment.h"
15 #include "media/cast/rtcp/rtcp.h"
16 #include "media/cast/test/fake_single_thread_task_runner.h"
17 #include "media/cast/test/utility/audio_utility.h"
18 #include "media/cast/transport/cast_transport_config.h"
19 #include "media/cast/transport/cast_transport_sender_impl.h"
20 #include "testing/gtest/include/gtest/gtest.h"
25 static const int64 kStartMillisecond = INT64_C(12345678900000);
27 class TestPacketSender : public transport::PacketSender {
29 TestPacketSender() : number_of_rtp_packets_(0), number_of_rtcp_packets_(0) {}
31 virtual bool SendPacket(transport::PacketRef packet,
32 const base::Closure& cb) OVERRIDE {
33 if (Rtcp::IsRtcpPacket(&packet->data[0], packet->data.size())) {
34 ++number_of_rtcp_packets_;
36 ++number_of_rtp_packets_;
41 int number_of_rtp_packets() const { return number_of_rtp_packets_; }
43 int number_of_rtcp_packets() const { return number_of_rtcp_packets_; }
46 int number_of_rtp_packets_;
47 int number_of_rtcp_packets_;
49 DISALLOW_COPY_AND_ASSIGN(TestPacketSender);
52 class AudioSenderTest : public ::testing::Test {
55 InitializeMediaLibraryForTesting();
56 testing_clock_ = new base::SimpleTestTickClock();
57 testing_clock_->Advance(
58 base::TimeDelta::FromMilliseconds(kStartMillisecond));
59 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_);
61 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(),
65 audio_config_.codec = transport::kOpus;
66 audio_config_.use_external_encoder = false;
67 audio_config_.frequency = kDefaultAudioSamplingRate;
68 audio_config_.channels = 2;
69 audio_config_.bitrate = kDefaultAudioEncoderBitrate;
70 audio_config_.rtp_config.payload_type = 127;
72 net::IPEndPoint dummy_endpoint;
74 transport_sender_.reset(new transport::CastTransportSenderImpl(
78 base::Bind(&UpdateCastTransportStatus),
79 transport::BulkRawEventsCallback(),
83 audio_sender_.reset(new AudioSender(
84 cast_environment_, audio_config_, transport_sender_.get()));
85 task_runner_->RunTasks();
88 virtual ~AudioSenderTest() {}
90 static void UpdateCastTransportStatus(transport::CastTransportStatus status) {
91 EXPECT_EQ(status, transport::TRANSPORT_AUDIO_INITIALIZED);
94 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
95 TestPacketSender transport_;
96 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_;
97 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
98 scoped_ptr<AudioSender> audio_sender_;
99 scoped_refptr<CastEnvironment> cast_environment_;
100 AudioSenderConfig audio_config_;
103 TEST_F(AudioSenderTest, Encode20ms) {
104 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(20);
105 scoped_ptr<AudioBus> bus(
106 TestAudioBusFactory(audio_config_.channels,
107 audio_config_.frequency,
108 TestAudioBusFactory::kMiddleANoteFreq,
109 0.5f).NextAudioBus(kDuration));
111 base::TimeTicks recorded_time = base::TimeTicks::Now();
112 audio_sender_->InsertAudio(bus.Pass(), recorded_time);
113 task_runner_->RunTasks();
115 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets(),
119 TEST_F(AudioSenderTest, RtcpTimer) {
120 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(20);
121 scoped_ptr<AudioBus> bus(
122 TestAudioBusFactory(audio_config_.channels,
123 audio_config_.frequency,
124 TestAudioBusFactory::kMiddleANoteFreq,
125 0.5f).NextAudioBus(kDuration));
127 base::TimeTicks recorded_time = base::TimeTicks::Now();
128 audio_sender_->InsertAudio(bus.Pass(), recorded_time);
129 task_runner_->RunTasks();
131 // Make sure that we send at least one RTCP packet.
132 base::TimeDelta max_rtcp_timeout =
133 base::TimeDelta::FromMilliseconds(1 + kDefaultRtcpIntervalMs * 3 / 2);
134 testing_clock_->Advance(max_rtcp_timeout);
135 task_runner_->RunTasks();
136 EXPECT_GE(transport_.number_of_rtp_packets(), 1);
137 EXPECT_EQ(transport_.number_of_rtcp_packets(), 1);