cast_transport_host_filter_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
1// Copyright 2014 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 "base/callback.h"
6#include "base/message_loop/message_loop.h"
7#include "base/time/default_tick_clock.h"
8#include "chrome/browser/media/cast_transport_host_filter.h"
9#include "content/public/test/test_browser_thread_bundle.h"
10#include "media/cast/logging/logging_defines.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace {
14
15class CastTransportHostFilterTest : public testing::Test {
16 public:
17  CastTransportHostFilterTest()
18      : browser_thread_bundle_(
19            content::TestBrowserThreadBundle::IO_MAINLOOP) {
20    filter_ = new cast::CastTransportHostFilter();
21    // 127.0.0.1:7 is the local echo service port, which
22    // is probably not going to respond, but that's ok.
23    // TODO(hubbe): Open up an UDP port and make sure
24    // we can send and receive packets.
25    net::IPAddressNumber receiver_address(4, 0);
26    receiver_address[0] = 127;
27    receiver_address[3] = 1;
28    receive_endpoint_ = net::IPEndPoint(receiver_address, 7);
29  }
30
31 protected:
32  void FakeSend(const IPC::Message& message) {
33    EXPECT_TRUE(filter_->OnMessageReceived(message));
34  }
35
36  content::TestBrowserThreadBundle browser_thread_bundle_;
37  scoped_refptr<content::BrowserMessageFilter> filter_;
38  net::IPAddressNumber receiver_address_;
39  net::IPEndPoint receive_endpoint_;
40};
41
42TEST_F(CastTransportHostFilterTest, NewDelete) {
43  const int kChannelId = 17;
44  CastHostMsg_New new_msg(kChannelId, receive_endpoint_);
45  CastHostMsg_Delete delete_msg(kChannelId);
46
47  // New, then delete, as expected.
48  FakeSend(new_msg);
49  FakeSend(delete_msg);
50  FakeSend(new_msg);
51  FakeSend(delete_msg);
52  FakeSend(new_msg);
53  FakeSend(delete_msg);
54
55  // Now create/delete transport senders in the wrong order to make sure
56  // this doesn't crash.
57  FakeSend(new_msg);
58  FakeSend(new_msg);
59  FakeSend(new_msg);
60  FakeSend(delete_msg);
61  FakeSend(delete_msg);
62  FakeSend(delete_msg);
63}
64
65TEST_F(CastTransportHostFilterTest, NewMany) {
66  for (int i = 0; i < 100; i++) {
67    CastHostMsg_New new_msg(i, receive_endpoint_);
68    FakeSend(new_msg);
69  }
70
71  for (int i = 0; i < 60; i++) {
72    CastHostMsg_Delete delete_msg(i);
73    FakeSend(delete_msg);
74  }
75
76  // Leave some open, see what happens.
77}
78
79TEST_F(CastTransportHostFilterTest, SimpleMessages) {
80  // Create a cast transport sender.
81  const int32 kChannelId = 42;
82  CastHostMsg_New new_msg(kChannelId, receive_endpoint_);
83  FakeSend(new_msg);
84
85  media::cast::CastTransportRtpConfig audio_config;
86  audio_config.stored_frames = 10;
87  audio_config.ssrc = 1;
88  audio_config.feedback_ssrc = 2;
89  CastHostMsg_InitializeAudio init_audio_msg(kChannelId, audio_config);
90  FakeSend(init_audio_msg);
91
92  media::cast::CastTransportRtpConfig video_config;
93  video_config.stored_frames = 10;
94  video_config.ssrc = 11;
95  video_config.feedback_ssrc = 12;
96  CastHostMsg_InitializeVideo init_video_msg(kChannelId, video_config);
97  FakeSend(init_video_msg);
98
99  media::cast::EncodedFrame audio_frame;
100  audio_frame.dependency = media::cast::EncodedFrame::KEY;
101  audio_frame.frame_id = 1;
102  audio_frame.referenced_frame_id = 1;
103  audio_frame.rtp_timestamp = 47;
104  const int kSamples = 47;
105  const int kBytesPerSample = 2;
106  const int kChannels = 2;
107  audio_frame.data = std::string(kSamples * kBytesPerSample * kChannels, 'q');
108  CastHostMsg_InsertCodedAudioFrame insert_coded_audio_frame(
109      kChannelId, audio_frame);
110  FakeSend(insert_coded_audio_frame);
111
112  media::cast::EncodedFrame video_frame;
113  video_frame.dependency = media::cast::EncodedFrame::KEY;
114  video_frame.frame_id = 1;
115  video_frame.referenced_frame_id = 1;
116  // Let's make sure we try a few kb so multiple packets
117  // are generated.
118  const int kVideoDataSize = 4711;
119  video_frame.data = std::string(kVideoDataSize, 'p');
120  CastHostMsg_InsertCodedVideoFrame insert_coded_video_frame(
121      kChannelId, video_frame);
122  FakeSend(insert_coded_video_frame);
123
124  CastHostMsg_SendSenderReport rtcp_msg(
125      kChannelId, 1, base::TimeTicks(), 2);
126  FakeSend(rtcp_msg);
127
128  std::vector<uint32> frame_ids;
129  frame_ids.push_back(1);
130  CastHostMsg_CancelSendingFrames cancel_msg(kChannelId, 1, frame_ids);
131  FakeSend(cancel_msg);
132
133  CastHostMsg_ResendFrameForKickstart kickstart_msg(kChannelId, 1, 1);
134  FakeSend(kickstart_msg);
135
136  CastHostMsg_Delete delete_msg(kChannelId);
137  FakeSend(delete_msg);
138}
139
140}  // namespace
141