audio_message_filter_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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/message_loop/message_loop.h" 6#include "content/common/media/audio_messages.h" 7#include "content/renderer/media/audio_message_filter.h" 8#include "media/audio/audio_output_ipc.h" 9#include "testing/gtest/include/gtest/gtest.h" 10 11namespace content { 12namespace { 13 14const int kRenderViewId = 1; 15const int kRenderFrameId = 2; 16 17class MockAudioDelegate : public media::AudioOutputIPCDelegate { 18 public: 19 MockAudioDelegate() { 20 Reset(); 21 } 22 23 virtual void OnStateChanged( 24 media::AudioOutputIPCDelegate::State state) OVERRIDE { 25 state_changed_received_ = true; 26 state_ = state; 27 } 28 29 virtual void OnStreamCreated(base::SharedMemoryHandle handle, 30 base::SyncSocket::Handle, 31 int length) OVERRIDE { 32 created_received_ = true; 33 handle_ = handle; 34 length_ = length; 35 } 36 37 virtual void OnIPCClosed() OVERRIDE {} 38 39 void Reset() { 40 state_changed_received_ = false; 41 state_ = media::AudioOutputIPCDelegate::kError; 42 43 created_received_ = false; 44 handle_ = base::SharedMemory::NULLHandle(); 45 length_ = 0; 46 47 volume_received_ = false; 48 volume_ = 0; 49 } 50 51 bool state_changed_received() { return state_changed_received_; } 52 media::AudioOutputIPCDelegate::State state() { return state_; } 53 54 bool created_received() { return created_received_; } 55 base::SharedMemoryHandle handle() { return handle_; } 56 uint32 length() { return length_; } 57 58 private: 59 bool state_changed_received_; 60 media::AudioOutputIPCDelegate::State state_; 61 62 bool created_received_; 63 base::SharedMemoryHandle handle_; 64 int length_; 65 66 bool volume_received_; 67 double volume_; 68 69 DISALLOW_COPY_AND_ASSIGN(MockAudioDelegate); 70}; 71 72} // namespace 73 74TEST(AudioMessageFilterTest, Basic) { 75 base::MessageLoopForIO message_loop; 76 77 scoped_refptr<AudioMessageFilter> filter(new AudioMessageFilter( 78 message_loop.message_loop_proxy())); 79 80 MockAudioDelegate delegate; 81 const scoped_ptr<media::AudioOutputIPC> ipc = 82 filter->CreateAudioOutputIPC(kRenderViewId, kRenderFrameId); 83 static const int kSessionId = 0; 84 ipc->CreateStream(&delegate, media::AudioParameters(), kSessionId); 85 static const int kStreamId = 1; 86 EXPECT_EQ(&delegate, filter->delegates_.Lookup(kStreamId)); 87 88 // AudioMsg_NotifyStreamCreated 89#if defined(OS_WIN) 90 base::SyncSocket::Handle socket_handle; 91#else 92 base::FileDescriptor socket_handle; 93#endif 94 const uint32 kLength = 1024; 95 EXPECT_FALSE(delegate.created_received()); 96 filter->OnMessageReceived( 97 AudioMsg_NotifyStreamCreated( 98 kStreamId, base::SharedMemory::NULLHandle(), 99 socket_handle, kLength)); 100 EXPECT_TRUE(delegate.created_received()); 101 EXPECT_FALSE(base::SharedMemory::IsHandleValid(delegate.handle())); 102 EXPECT_EQ(kLength, delegate.length()); 103 delegate.Reset(); 104 105 // AudioMsg_NotifyStreamStateChanged 106 EXPECT_FALSE(delegate.state_changed_received()); 107 filter->OnMessageReceived( 108 AudioMsg_NotifyStreamStateChanged( 109 kStreamId, media::AudioOutputIPCDelegate::kPlaying)); 110 EXPECT_TRUE(delegate.state_changed_received()); 111 EXPECT_EQ(media::AudioOutputIPCDelegate::kPlaying, delegate.state()); 112 delegate.Reset(); 113 114 message_loop.RunUntilIdle(); 115 116 ipc->CloseStream(); 117 EXPECT_EQ(static_cast<media::AudioOutputIPCDelegate*>(NULL), 118 filter->delegates_.Lookup(kStreamId)); 119} 120 121TEST(AudioMessageFilterTest, Delegates) { 122 base::MessageLoopForIO message_loop; 123 124 scoped_refptr<AudioMessageFilter> filter(new AudioMessageFilter( 125 message_loop.message_loop_proxy())); 126 127 MockAudioDelegate delegate1; 128 MockAudioDelegate delegate2; 129 const scoped_ptr<media::AudioOutputIPC> ipc1 = 130 filter->CreateAudioOutputIPC(kRenderViewId, kRenderFrameId); 131 const scoped_ptr<media::AudioOutputIPC> ipc2 = 132 filter->CreateAudioOutputIPC(kRenderViewId, kRenderFrameId); 133 static const int kSessionId = 0; 134 ipc1->CreateStream(&delegate1, media::AudioParameters(), kSessionId); 135 ipc2->CreateStream(&delegate2, media::AudioParameters(), kSessionId); 136 static const int kStreamId1 = 1; 137 static const int kStreamId2 = 2; 138 EXPECT_EQ(&delegate1, filter->delegates_.Lookup(kStreamId1)); 139 EXPECT_EQ(&delegate2, filter->delegates_.Lookup(kStreamId2)); 140 141 // Send an IPC message. Make sure the correct delegate gets called. 142 EXPECT_FALSE(delegate1.state_changed_received()); 143 EXPECT_FALSE(delegate2.state_changed_received()); 144 filter->OnMessageReceived( 145 AudioMsg_NotifyStreamStateChanged( 146 kStreamId1, media::AudioOutputIPCDelegate::kPlaying)); 147 EXPECT_TRUE(delegate1.state_changed_received()); 148 EXPECT_FALSE(delegate2.state_changed_received()); 149 delegate1.Reset(); 150 151 EXPECT_FALSE(delegate1.state_changed_received()); 152 EXPECT_FALSE(delegate2.state_changed_received()); 153 filter->OnMessageReceived( 154 AudioMsg_NotifyStreamStateChanged( 155 kStreamId2, media::AudioOutputIPCDelegate::kPlaying)); 156 EXPECT_FALSE(delegate1.state_changed_received()); 157 EXPECT_TRUE(delegate2.state_changed_received()); 158 delegate2.Reset(); 159 160 message_loop.RunUntilIdle(); 161 162 ipc1->CloseStream(); 163 ipc2->CloseStream(); 164 EXPECT_EQ(static_cast<media::AudioOutputIPCDelegate*>(NULL), 165 filter->delegates_.Lookup(kStreamId1)); 166 EXPECT_EQ(static_cast<media::AudioOutputIPCDelegate*>(NULL), 167 filter->delegates_.Lookup(kStreamId2)); 168} 169 170} // namespace content 171