blob: 222600ad830fc7020c6334dcc9113928740f1826 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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
Ben Murdochca12bfa2013-07-23 11:17:05 +01005#include "base/memory/shared_memory.h"
Ben Murdoch9ab55632013-07-18 11:57:30 +01006#include "base/message_loop/message_loop.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +00007#include "content/common/media/video_capture_messages.h"
8#include "content/renderer/media/video_capture_message_filter.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace content {
12namespace {
13
14class MockVideoCaptureDelegate : public VideoCaptureMessageFilter::Delegate {
15 public:
16 MockVideoCaptureDelegate() {
17 Reset();
18 device_id_received_ = false;
19 device_id_ = 0;
20 }
21
22 virtual void OnBufferCreated(base::SharedMemoryHandle handle,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000023 int length, int buffer_id) OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000024 buffer_created_ = true;
25 handle_ = handle;
26 }
27
28 // Called when a video frame buffer is received from the browser process.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000029 virtual void OnBufferReceived(int buffer_id, base::Time timestamp) OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000030 buffer_received_ = true;
31 buffer_id_ = buffer_id;
32 timestamp_ = timestamp;
33 }
34
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000035 virtual void OnStateChanged(VideoCaptureState state) OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000036 state_changed_received_ = true;
37 state_ = state;
38 }
39
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000040 virtual void OnDeviceInfoReceived(
41 const media::VideoCaptureParams& params) OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000042 device_info_received_ = true;
43 params_.width = params.width;
44 params_.height = params.height;
45 params_.frame_per_second = params.frame_per_second;
46 }
47
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000048 virtual void OnDelegateAdded(int32 device_id) OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000049 device_id_received_ = true;
50 device_id_ = device_id;
51 }
52
53 void Reset() {
54 buffer_created_ = false;
55 handle_ = base::SharedMemory::NULLHandle();
56
57 buffer_received_ = false;
58 buffer_id_ = -1;
59 timestamp_ = base::Time();
60
61 state_changed_received_ = false;
62 state_ = VIDEO_CAPTURE_STATE_ERROR;
63
64 device_info_received_ = false;
65 params_.width = 0;
66 params_.height = 0;
67 params_.frame_per_second = 0;
68 }
69
70 bool buffer_created() { return buffer_created_; }
71 base::SharedMemoryHandle received_buffer_handle() { return handle_; }
72
73 bool buffer_received() { return buffer_received_; }
74 int received_buffer_id() { return buffer_id_; }
75 base::Time received_buffer_ts() { return timestamp_; }
76
77 bool state_changed_received() { return state_changed_received_; }
78 VideoCaptureState state() { return state_; }
79
80 bool device_info_receive() { return device_info_received_; }
81 const media::VideoCaptureParams& received_device_info() { return params_; }
82
83 int32 device_id() { return device_id_; }
84
85 private:
86 bool buffer_created_;
87 base::SharedMemoryHandle handle_;
88
89 bool buffer_received_;
90 int buffer_id_;
91 base::Time timestamp_;
92
93 bool state_changed_received_;
94 VideoCaptureState state_;
95
96 bool device_info_received_;
97 media::VideoCaptureParams params_;
98
99 bool device_id_received_;
100 int32 device_id_;
101
102 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureDelegate);
103};
104
105} // namespace
106
107TEST(VideoCaptureMessageFilterTest, Basic) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100108 base::MessageLoop message_loop(base::MessageLoop::TYPE_IO);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000109
110 scoped_refptr<VideoCaptureMessageFilter> filter(
111 new VideoCaptureMessageFilter());
112 filter->channel_ = reinterpret_cast<IPC::Channel*>(1);
113
114 MockVideoCaptureDelegate delegate;
115 filter->AddDelegate(&delegate);
116
117 // VideoCaptureMsg_StateChanged
118 EXPECT_FALSE(delegate.state_changed_received());
119 filter->OnMessageReceived(
120 VideoCaptureMsg_StateChanged(delegate.device_id(),
121 VIDEO_CAPTURE_STATE_STARTED));
122 EXPECT_TRUE(delegate.state_changed_received());
123 EXPECT_TRUE(VIDEO_CAPTURE_STATE_STARTED == delegate.state());
124 delegate.Reset();
125
126 // VideoCaptureMsg_NewBuffer
127 const base::SharedMemoryHandle handle =
128#if defined(OS_WIN)
129 reinterpret_cast<base::SharedMemoryHandle>(10);
130#else
131 base::SharedMemoryHandle(10, true);
132#endif
133 EXPECT_FALSE(delegate.buffer_created());
134 filter->OnMessageReceived(VideoCaptureMsg_NewBuffer(
135 delegate.device_id(), handle, 1, 1));
136 EXPECT_TRUE(delegate.buffer_created());
137 EXPECT_EQ(handle, delegate.received_buffer_handle());
138 delegate.Reset();
139
140 // VideoCaptureMsg_BufferReady
141 int buffer_id = 1;
142 base::Time timestamp = base::Time::FromInternalValue(1);
143
144 EXPECT_FALSE(delegate.buffer_received());
145 filter->OnMessageReceived(VideoCaptureMsg_BufferReady(
146 delegate.device_id(), buffer_id, timestamp));
147 EXPECT_TRUE(delegate.buffer_received());
148 EXPECT_EQ(buffer_id, delegate.received_buffer_id());
149 EXPECT_TRUE(timestamp == delegate.received_buffer_ts());
150 delegate.Reset();
151
152 // VideoCaptureMsg_DeviceInfo
153 media::VideoCaptureParams params;
154 params.width = 320;
155 params.height = 240;
156 params.frame_per_second = 30;
157
158 EXPECT_FALSE(delegate.device_info_receive());
159 filter->OnMessageReceived(VideoCaptureMsg_DeviceInfo(
160 delegate.device_id(), params));
161 EXPECT_TRUE(delegate.device_info_receive());
162 EXPECT_EQ(params.width, delegate.received_device_info().width);
163 EXPECT_EQ(params.height, delegate.received_device_info().height);
164 EXPECT_EQ(params.frame_per_second,
165 delegate.received_device_info().frame_per_second);
166 delegate.Reset();
167
168 message_loop.RunUntilIdle();
169}
170
171TEST(VideoCaptureMessageFilterTest, Delegates) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100172 base::MessageLoop message_loop(base::MessageLoop::TYPE_IO);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000173
174 scoped_refptr<VideoCaptureMessageFilter> filter(
175 new VideoCaptureMessageFilter());
176 filter->channel_ = reinterpret_cast<IPC::Channel*>(1);
177
178 MockVideoCaptureDelegate delegate1;
179 MockVideoCaptureDelegate delegate2;
180
181 filter->AddDelegate(&delegate1);
182 filter->AddDelegate(&delegate2);
183
184 // Send an IPC message. Make sure the correct delegate gets called.
185 EXPECT_FALSE(delegate1.state_changed_received());
186 EXPECT_FALSE(delegate2.state_changed_received());
187 filter->OnMessageReceived(
188 VideoCaptureMsg_StateChanged(delegate1.device_id(),
189 VIDEO_CAPTURE_STATE_STARTED));
190 EXPECT_TRUE(delegate1.state_changed_received());
191 EXPECT_FALSE(delegate2.state_changed_received());
192 delegate1.Reset();
193
194 EXPECT_FALSE(delegate1.state_changed_received());
195 EXPECT_FALSE(delegate2.state_changed_received());
196 filter->OnMessageReceived(
197 VideoCaptureMsg_StateChanged(delegate2.device_id(),
198 VIDEO_CAPTURE_STATE_STARTED));
199 EXPECT_FALSE(delegate1.state_changed_received());
200 EXPECT_TRUE(delegate2.state_changed_received());
201 delegate2.Reset();
202
203 // Remove the delegates. Make sure they won't get called.
204 filter->RemoveDelegate(&delegate1);
205 EXPECT_FALSE(delegate1.state_changed_received());
206 filter->OnMessageReceived(
207 VideoCaptureMsg_StateChanged(delegate1.device_id(),
208 VIDEO_CAPTURE_STATE_STARTED));
209 EXPECT_FALSE(delegate1.state_changed_received());
210
211 filter->RemoveDelegate(&delegate2);
212 EXPECT_FALSE(delegate2.state_changed_received());
213 filter->OnMessageReceived(
214 VideoCaptureMsg_StateChanged(delegate2.device_id(),
215 VIDEO_CAPTURE_STATE_STARTED));
216 EXPECT_FALSE(delegate2.state_changed_received());
217
218 message_loop.RunUntilIdle();
219}
220
221} // namespace content