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  base::DictionaryValue options_;
37  content::TestBrowserThreadBundle browser_thread_bundle_;
38  scoped_refptr<content::BrowserMessageFilter> filter_;
39  net::IPAddressNumber receiver_address_;
40  net::IPEndPoint receive_endpoint_;
41};
42
43TEST_F(CastTransportHostFilterTest, NewDelete) {
44  const int kChannelId = 17;
45  CastHostMsg_New new_msg(kChannelId, receive_endpoint_, options_);
46  CastHostMsg_Delete delete_msg(kChannelId);
47
48  // New, then delete, as expected.
49  FakeSend(new_msg);
50  FakeSend(delete_msg);
51  FakeSend(new_msg);
52  FakeSend(delete_msg);
53  FakeSend(new_msg);
54  FakeSend(delete_msg);
55
56  // Now create/delete transport senders in the wrong order to make sure
57  // this doesn't crash.
58  FakeSend(new_msg);
59  FakeSend(new_msg);
60  FakeSend(new_msg);
61  FakeSend(delete_msg);
62  FakeSend(delete_msg);
63  FakeSend(delete_msg);
64}
65
66TEST_F(CastTransportHostFilterTest, NewMany) {
67  for (int i = 0; i < 100; i++) {
68    CastHostMsg_New new_msg(i, receive_endpoint_, options_);
69    FakeSend(new_msg);
70  }
71
72  for (int i = 0; i < 60; i++) {
73    CastHostMsg_Delete delete_msg(i);
74    FakeSend(delete_msg);
75  }
76
77  // Leave some open, see what happens.
78}
79
80TEST_F(CastTransportHostFilterTest, SimpleMessages) {
81  // Create a cast transport sender.
82  const int32 kChannelId = 42;
83  CastHostMsg_New new_msg(kChannelId, receive_endpoint_, options_);
84  FakeSend(new_msg);
85
86  media::cast::CastTransportRtpConfig audio_config;
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.ssrc = 11;
94  video_config.feedback_ssrc = 12;
95  CastHostMsg_InitializeVideo init_video_msg(kChannelId, video_config);
96  FakeSend(init_video_msg);
97
98  media::cast::EncodedFrame audio_frame;
99  audio_frame.dependency = media::cast::EncodedFrame::KEY;
100  audio_frame.frame_id = 1;
101  audio_frame.referenced_frame_id = 1;
102  audio_frame.rtp_timestamp = 47;
103  const int kSamples = 47;
104  const int kBytesPerSample = 2;
105  const int kChannels = 2;
106  audio_frame.data = std::string(kSamples * kBytesPerSample * kChannels, 'q');
107  CastHostMsg_InsertFrame insert_audio_frame(1, kChannelId, audio_frame);
108  FakeSend(insert_audio_frame);
109
110  media::cast::EncodedFrame video_frame;
111  video_frame.dependency = media::cast::EncodedFrame::KEY;
112  video_frame.frame_id = 1;
113  video_frame.referenced_frame_id = 1;
114  // Let's make sure we try a few kb so multiple packets
115  // are generated.
116  const int kVideoDataSize = 4711;
117  video_frame.data = std::string(kVideoDataSize, 'p');
118  CastHostMsg_InsertFrame insert_video_frame(11, kChannelId, video_frame);
119  FakeSend(insert_video_frame);
120
121  CastHostMsg_SendSenderReport rtcp_msg(
122      kChannelId, 1, base::TimeTicks(), 2);
123  FakeSend(rtcp_msg);
124
125  std::vector<uint32> frame_ids;
126  frame_ids.push_back(1);
127  CastHostMsg_CancelSendingFrames cancel_msg(kChannelId, 1, frame_ids);
128  FakeSend(cancel_msg);
129
130  CastHostMsg_ResendFrameForKickstart kickstart_msg(kChannelId, 1, 1);
131  FakeSend(kickstart_msg);
132
133  CastHostMsg_Delete delete_msg(kChannelId);
134  FakeSend(delete_msg);
135}
136
137}  // namespace
138