cast_transport_host_filter_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 "testing/gtest/include/gtest/gtest.h" 11 12namespace { 13 14class CastTransportHostFilterTest : public testing::Test { 15 public: 16 CastTransportHostFilterTest() 17 : browser_thread_bundle_( 18 content::TestBrowserThreadBundle::IO_MAINLOOP) { 19 } 20 protected: 21 virtual void SetUp() OVERRIDE { 22 filter_ = new cast::CastTransportHostFilter(); 23 } 24 25 void FakeSend(const IPC::Message& message) { 26 bool message_was_ok; 27 EXPECT_TRUE(filter_->OnMessageReceived(message, &message_was_ok)); 28 EXPECT_TRUE(message_was_ok); 29 } 30 31 net::IPEndPoint GetLocalEndPoint() { 32 return net::IPEndPoint(net::IPAddressNumber(4, 0), 0); 33 } 34 35 net::IPEndPoint GetRemoteEndPoint() { 36 // 127.0.0.1:7 is the local echo service port, which 37 // is probably not going to respond, but that's ok. 38 // TODO(hubbe): Open up an UDP port and make sure 39 // we can send and receive packets. 40 net::IPAddressNumber receiver_address(4, 0); 41 receiver_address[0] = 127; 42 receiver_address[3] = 1; 43 return net::IPEndPoint(receiver_address, 7); 44 } 45 46 content::TestBrowserThreadBundle browser_thread_bundle_; 47 scoped_refptr<content::BrowserMessageFilter> filter_; 48 net::IPAddressNumber receiver_address_; 49}; 50 51TEST_F(CastTransportHostFilterTest, NewDelete) { 52 media::cast::transport::CastTransportConfig config; 53 config.local_endpoint = GetLocalEndPoint(); 54 config.receiver_endpoint = GetRemoteEndPoint(); 55 const int kChannelId = 17; 56 CastHostMsg_New new_msg(kChannelId, config); 57 CastHostMsg_Delete delete_msg(kChannelId); 58 59 // New, then delete, as expected. 60 FakeSend(new_msg); 61 FakeSend(delete_msg); 62 FakeSend(new_msg); 63 FakeSend(delete_msg); 64 FakeSend(new_msg); 65 FakeSend(delete_msg); 66 67 // Now create/delete transport senders in the wrong order to make sure 68 // this doesn't crash. 69 FakeSend(new_msg); 70 FakeSend(new_msg); 71 FakeSend(new_msg); 72 FakeSend(delete_msg); 73 FakeSend(delete_msg); 74 FakeSend(delete_msg); 75} 76 77TEST_F(CastTransportHostFilterTest, NewMany) { 78 media::cast::transport::CastTransportConfig config; 79 config.local_endpoint = GetLocalEndPoint(); 80 config.receiver_endpoint = GetRemoteEndPoint(); 81 82 for (int i = 0; i < 100; i++) { 83 CastHostMsg_New new_msg(i, config); 84 FakeSend(new_msg); 85 } 86 87 for (int i = 0; i < 60; i++) { 88 CastHostMsg_Delete delete_msg(i); 89 FakeSend(delete_msg); 90 } 91 92 // Leave some open, see what happens. 93} 94 95TEST_F(CastTransportHostFilterTest, SimpleMessages) { 96 // Create a cast transport sender. 97 media::cast::transport::CastTransportConfig config; 98 config.local_endpoint = GetLocalEndPoint(); 99 config.receiver_endpoint = GetRemoteEndPoint(); 100 const int32 kChannelId = 42; 101 CastHostMsg_New new_msg(kChannelId, config); 102 FakeSend(new_msg); 103 104 media::cast::transport::EncodedAudioFrame audio_frame; 105 audio_frame.codec = media::cast::transport::kPcm16; 106 audio_frame.frame_id = 1; 107 audio_frame.rtp_timestamp = 47; 108 const int kSamples = 47; 109 const int kBytesPerSample = 2; 110 const int kChannels = 2; 111 audio_frame.data = std::string(kSamples * kBytesPerSample * kChannels, 'q'); 112 CastHostMsg_InsertCodedAudioFrame insert_coded_audio_frame( 113 kChannelId, audio_frame, base::TimeTicks::Now()); 114 FakeSend(new_msg); 115 116 media::cast::transport::EncodedVideoFrame video_frame; 117 video_frame.codec = media::cast::transport::kVp8; 118 video_frame.key_frame = true; 119 video_frame.frame_id = 1; 120 video_frame.last_referenced_frame_id = 0; 121 // Let's make sure we try a few kb so multiple packets 122 // are generated. 123 const int kVideoDataSize = 4711; 124 video_frame.data = std::string(kVideoDataSize, 'p'); 125 CastHostMsg_InsertCodedVideoFrame insert_coded_video_frame( 126 kChannelId, video_frame, base::TimeTicks::Now()); 127 FakeSend(new_msg); 128 129 media::cast::transport::SendRtcpFromRtpSenderData rtcp_data; 130 rtcp_data.packet_type_flags = 0; 131 rtcp_data.sending_ssrc = 0; 132 rtcp_data.c_name = "FNRD"; 133 media::cast::transport::RtcpSenderInfo sender_info; 134 sender_info.ntp_seconds = 1; 135 sender_info.ntp_fraction = 2; 136 sender_info.rtp_timestamp = 3; 137 sender_info.send_packet_count = 4; 138 sender_info.send_octet_count = 5; 139 media::cast::transport::RtcpDlrrReportBlock dlrr; 140 dlrr.last_rr = 7; 141 dlrr.delay_since_last_rr = 8; 142 media::cast::transport::RtcpSenderLogMessage sender_log(1); 143 sender_log[0].frame_status = 144 media::cast::transport::kRtcpSenderFrameStatusSentToNetwork; 145 sender_log[0].rtp_timestamp = 9; 146 CastHostMsg_SendRtcpFromRtpSender rtcp_msg( 147 kChannelId, rtcp_data, sender_info, dlrr, sender_log); 148 FakeSend(rtcp_msg); 149 150 media::cast::MissingFramesAndPacketsMap missing_packets; 151 missing_packets[1].insert(4); 152 missing_packets[3].insert(7); 153 CastHostMsg_ResendPackets resend_msg( 154 kChannelId, false, missing_packets); 155 FakeSend(resend_msg); 156 157 CastHostMsg_Delete delete_msg(kChannelId); 158 FakeSend(delete_msg); 159} 160 161} // namespace 162