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.
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"
15 class CastTransportHostFilterTest : public testing::Test {
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);
32 void FakeSend(const IPC::Message& message) {
33 EXPECT_TRUE(filter_->OnMessageReceived(message));
36 content::TestBrowserThreadBundle browser_thread_bundle_;
37 scoped_refptr<content::BrowserMessageFilter> filter_;
38 net::IPAddressNumber receiver_address_;
39 net::IPEndPoint receive_endpoint_;
42 TEST_F(CastTransportHostFilterTest, NewDelete) {
43 const int kChannelId = 17;
44 CastHostMsg_New new_msg(kChannelId, receive_endpoint_);
45 CastHostMsg_Delete delete_msg(kChannelId);
47 // New, then delete, as expected.
55 // Now create/delete transport senders in the wrong order to make sure
56 // this doesn't crash.
65 TEST_F(CastTransportHostFilterTest, NewMany) {
66 for (int i = 0; i < 100; i++) {
67 CastHostMsg_New new_msg(i, receive_endpoint_);
71 for (int i = 0; i < 60; i++) {
72 CastHostMsg_Delete delete_msg(i);
76 // Leave some open, see what happens.
79 TEST_F(CastTransportHostFilterTest, SimpleMessages) {
80 // Create a cast transport sender.
81 const int32 kChannelId = 42;
82 CastHostMsg_New new_msg(kChannelId, receive_endpoint_);
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);
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);
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);
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
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);
124 CastHostMsg_SendSenderReport rtcp_msg(
125 kChannelId, 1, base::TimeTicks(), 2);
128 media::cast::MissingFramesAndPacketsMap missing_packets;
129 missing_packets[1].insert(4);
130 missing_packets[1].insert(7);
131 CastHostMsg_ResendPackets resend_msg(
132 kChannelId, false, missing_packets, true, base::TimeDelta());
133 FakeSend(resend_msg);
135 CastHostMsg_Delete delete_msg(kChannelId);
136 FakeSend(delete_msg);