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 13 namespace { 14 15 class 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 43 TEST_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 66 TEST_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 80 TEST_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