Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / media / cast / audio_sender / audio_sender_unittest.cc
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.
4
5 #include <stdint.h>
6
7 #include "base/bind.h"
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"
21
22 namespace media {
23 namespace cast {
24
25 static const int64 kStartMillisecond = INT64_C(12345678900000);
26
27 class TestPacketSender : public transport::PacketSender {
28  public:
29   TestPacketSender() : number_of_rtp_packets_(0), number_of_rtcp_packets_(0) {}
30
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_;
35     } else {
36       ++number_of_rtp_packets_;
37     }
38     return true;
39   }
40
41   int number_of_rtp_packets() const { return number_of_rtp_packets_; }
42
43   int number_of_rtcp_packets() const { return number_of_rtcp_packets_; }
44
45  private:
46   int number_of_rtp_packets_;
47   int number_of_rtcp_packets_;
48
49   DISALLOW_COPY_AND_ASSIGN(TestPacketSender);
50 };
51
52 class AudioSenderTest : public ::testing::Test {
53  protected:
54   AudioSenderTest() {
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_);
60     cast_environment_ =
61         new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(),
62                             task_runner_,
63                             task_runner_,
64                             task_runner_);
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;
71
72     net::IPEndPoint dummy_endpoint;
73
74     transport_sender_.reset(new transport::CastTransportSenderImpl(
75         NULL,
76         testing_clock_,
77         dummy_endpoint,
78         base::Bind(&UpdateCastTransportStatus),
79         transport::BulkRawEventsCallback(),
80         base::TimeDelta(),
81         task_runner_,
82         &transport_));
83     audio_sender_.reset(new AudioSender(
84         cast_environment_, audio_config_, transport_sender_.get()));
85     task_runner_->RunTasks();
86   }
87
88   virtual ~AudioSenderTest() {}
89
90   static void UpdateCastTransportStatus(transport::CastTransportStatus status) {
91     EXPECT_EQ(status, transport::TRANSPORT_AUDIO_INITIALIZED);
92   }
93
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_;
101 };
102
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));
110
111   base::TimeTicks recorded_time = base::TimeTicks::Now();
112   audio_sender_->InsertAudio(bus.Pass(), recorded_time);
113   task_runner_->RunTasks();
114   EXPECT_GE(
115       transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets(),
116       1);
117 }
118
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));
126
127   base::TimeTicks recorded_time = base::TimeTicks::Now();
128   audio_sender_->InsertAudio(bus.Pass(), recorded_time);
129   task_runner_->RunTasks();
130
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);
138 }
139
140 }  // namespace cast
141 }  // namespace media