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.
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"
14 const int kRenderViewId = 1;
15 const int kRenderFrameId = 2;
17 class MockAudioDelegate : public media::AudioOutputIPCDelegate {
23 virtual void OnStateChanged(
24 media::AudioOutputIPCDelegate::State state) OVERRIDE {
25 state_changed_received_ = true;
29 virtual void OnStreamCreated(base::SharedMemoryHandle handle,
30 base::SyncSocket::Handle,
31 int length) OVERRIDE {
32 created_received_ = true;
37 virtual void OnIPCClosed() OVERRIDE {}
40 state_changed_received_ = false;
41 state_ = media::AudioOutputIPCDelegate::kError;
43 created_received_ = false;
44 handle_ = base::SharedMemory::NULLHandle();
47 volume_received_ = false;
51 bool state_changed_received() { return state_changed_received_; }
52 media::AudioOutputIPCDelegate::State state() { return state_; }
54 bool created_received() { return created_received_; }
55 base::SharedMemoryHandle handle() { return handle_; }
56 uint32 length() { return length_; }
59 bool state_changed_received_;
60 media::AudioOutputIPCDelegate::State state_;
62 bool created_received_;
63 base::SharedMemoryHandle handle_;
66 bool volume_received_;
69 DISALLOW_COPY_AND_ASSIGN(MockAudioDelegate);
74 TEST(AudioMessageFilterTest, Basic) {
75 base::MessageLoopForIO message_loop;
77 scoped_refptr<AudioMessageFilter> filter(new AudioMessageFilter(
78 message_loop.message_loop_proxy()));
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));
88 // AudioMsg_NotifyStreamCreated
90 base::SyncSocket::Handle socket_handle;
92 base::FileDescriptor socket_handle;
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());
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());
114 message_loop.RunUntilIdle();
117 EXPECT_EQ(static_cast<media::AudioOutputIPCDelegate*>(NULL),
118 filter->delegates_.Lookup(kStreamId));
121 TEST(AudioMessageFilterTest, Delegates) {
122 base::MessageLoopForIO message_loop;
124 scoped_refptr<AudioMessageFilter> filter(new AudioMessageFilter(
125 message_loop.message_loop_proxy()));
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));
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());
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());
160 message_loop.RunUntilIdle();
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));
170 } // namespace content