Home | History | Annotate | Download | only in media
      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