OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Unit test for VideoCaptureController. | 5 // Unit test for VideoCaptureController. |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 scoped_ptr<media::VideoCaptureDevice::Client> device_; | 106 scoped_ptr<media::VideoCaptureDevice::Client> device_; |
107 | 107 |
108 private: | 108 private: |
109 DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest); | 109 DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest); |
110 }; | 110 }; |
111 | 111 |
112 // A simple test of VideoCaptureController's ability to add, remove, and keep | 112 // A simple test of VideoCaptureController's ability to add, remove, and keep |
113 // track of clients. | 113 // track of clients. |
114 TEST_F(VideoCaptureControllerTest, AddAndRemoveClients) { | 114 TEST_F(VideoCaptureControllerTest, AddAndRemoveClients) { |
115 media::VideoCaptureParams session_100; | 115 media::VideoCaptureParams session_100; |
| 116 session_100.session_id = 100; |
116 session_100.requested_format = media::VideoCaptureFormat( | 117 session_100.requested_format = media::VideoCaptureFormat( |
117 gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420); | 118 320, 240, 30, media::ConstantResolutionVideoCaptureDevice); |
| 119 |
118 media::VideoCaptureParams session_200 = session_100; | 120 media::VideoCaptureParams session_200 = session_100; |
| 121 session_200.session_id = 200; |
119 | 122 |
120 media::VideoCaptureParams session_300 = session_100; | 123 media::VideoCaptureParams session_300 = session_100; |
| 124 session_300.session_id = 300; |
121 | 125 |
122 media::VideoCaptureParams session_400 = session_100; | 126 media::VideoCaptureParams session_400 = session_100; |
| 127 session_400.session_id = 400; |
123 | 128 |
124 // Intentionally use the same route ID for two of the clients: the device_ids | 129 // Intentionally use the same route ID for two of the clients: the device_ids |
125 // are a per-VideoCaptureHost namespace, and can overlap across hosts. | 130 // are a per-VideoCaptureHost namespace, and can overlap across hosts. |
126 const VideoCaptureControllerID client_a_route_1(44); | 131 const VideoCaptureControllerID client_a_route_1(44); |
127 const VideoCaptureControllerID client_a_route_2(30); | 132 const VideoCaptureControllerID client_a_route_2(30); |
128 const VideoCaptureControllerID client_b_route_1(30); | 133 const VideoCaptureControllerID client_b_route_1(30); |
129 const VideoCaptureControllerID client_b_route_2(1); | 134 const VideoCaptureControllerID client_b_route_2(1); |
130 | 135 |
131 // Clients in controller: [] | 136 // Clients in controller: [] |
132 ASSERT_EQ(0, controller_->GetClientCount()) | 137 ASSERT_EQ(0, controller_->GetClientCount()) |
133 << "Client count should initially be zero."; | 138 << "Client count should initially be zero."; |
134 controller_->AddClient(client_a_route_1, | 139 controller_->AddClient(client_a_route_1, client_a_.get(), |
135 client_a_.get(), | 140 base::kNullProcessHandle, session_100); |
136 base::kNullProcessHandle, | |
137 100, | |
138 session_100); | |
139 // Clients in controller: [A/1] | 141 // Clients in controller: [A/1] |
140 ASSERT_EQ(1, controller_->GetClientCount()) | 142 ASSERT_EQ(1, controller_->GetClientCount()) |
141 << "Adding client A/1 should bump client count.";; | 143 << "Adding client A/1 should bump client count.";; |
142 controller_->AddClient(client_a_route_2, | 144 controller_->AddClient(client_a_route_2, client_a_.get(), |
143 client_a_.get(), | 145 base::kNullProcessHandle, session_200); |
144 base::kNullProcessHandle, | |
145 200, | |
146 session_200); | |
147 // Clients in controller: [A/1, A/2] | 146 // Clients in controller: [A/1, A/2] |
148 ASSERT_EQ(2, controller_->GetClientCount()) | 147 ASSERT_EQ(2, controller_->GetClientCount()) |
149 << "Adding client A/2 should bump client count."; | 148 << "Adding client A/2 should bump client count."; |
150 controller_->AddClient(client_b_route_1, | 149 controller_->AddClient(client_b_route_1, client_b_.get(), |
151 client_b_.get(), | 150 base::kNullProcessHandle, session_300); |
152 base::kNullProcessHandle, | |
153 300, | |
154 session_300); | |
155 // Clients in controller: [A/1, A/2, B/1] | 151 // Clients in controller: [A/1, A/2, B/1] |
156 ASSERT_EQ(3, controller_->GetClientCount()) | 152 ASSERT_EQ(3, controller_->GetClientCount()) |
157 << "Adding client B/1 should bump client count."; | 153 << "Adding client B/1 should bump client count."; |
158 ASSERT_EQ(200, | 154 ASSERT_EQ(200, |
159 controller_->RemoveClient(client_a_route_2, client_a_.get())) | 155 controller_->RemoveClient(client_a_route_2, client_a_.get())) |
160 << "Removing client A/1 should return its session_id."; | 156 << "Removing client A/1 should return its session_id."; |
161 // Clients in controller: [A/1, B/1] | 157 // Clients in controller: [A/1, B/1] |
162 ASSERT_EQ(2, controller_->GetClientCount()); | 158 ASSERT_EQ(2, controller_->GetClientCount()); |
163 ASSERT_EQ(static_cast<int>(kInvalidMediaCaptureSessionId), | 159 ASSERT_EQ(static_cast<int>(kInvalidMediaCaptureSessionId), |
164 controller_->RemoveClient(client_a_route_2, client_a_.get())) | 160 controller_->RemoveClient(client_a_route_2, client_a_.get())) |
165 << "Removing a nonexistant client should fail."; | 161 << "Removing a nonexistant client should fail."; |
166 // Clients in controller: [A/1, B/1] | 162 // Clients in controller: [A/1, B/1] |
167 ASSERT_EQ(2, controller_->GetClientCount()); | 163 ASSERT_EQ(2, controller_->GetClientCount()); |
168 ASSERT_EQ(300, | 164 ASSERT_EQ(300, |
169 controller_->RemoveClient(client_b_route_1, client_b_.get())) | 165 controller_->RemoveClient(client_b_route_1, client_b_.get())) |
170 << "Removing client B/1 should return its session_id."; | 166 << "Removing client B/1 should return its session_id."; |
171 // Clients in controller: [A/1] | 167 // Clients in controller: [A/1] |
172 ASSERT_EQ(1, controller_->GetClientCount()); | 168 ASSERT_EQ(1, controller_->GetClientCount()); |
173 controller_->AddClient(client_b_route_2, | 169 controller_->AddClient(client_b_route_2, client_b_.get(), |
174 client_b_.get(), | 170 base::kNullProcessHandle, session_400); |
175 base::kNullProcessHandle, | |
176 400, | |
177 session_400); | |
178 // Clients in controller: [A/1, B/2] | 171 // Clients in controller: [A/1, B/2] |
179 | 172 |
180 EXPECT_CALL(*client_a_, DoEnded(client_a_route_1)).Times(1); | 173 EXPECT_CALL(*client_a_, DoEnded(client_a_route_1)).Times(1); |
181 controller_->StopSession(100); // Session 100 == client A/1 | 174 controller_->StopSession(100); // Session 100 == client A/1 |
182 Mock::VerifyAndClearExpectations(client_a_.get()); | 175 Mock::VerifyAndClearExpectations(client_a_.get()); |
183 ASSERT_EQ(2, controller_->GetClientCount()) | 176 ASSERT_EQ(2, controller_->GetClientCount()) |
184 << "Client should be closed but still exist after StopSession."; | 177 << "Client should be closed but still exist after StopSession."; |
185 // Clients in controller: [A/1 (closed, removal pending), B/2] | 178 // Clients in controller: [A/1 (closed, removal pending), B/2] |
186 base::RunLoop().RunUntilIdle(); | 179 base::RunLoop().RunUntilIdle(); |
187 // Clients in controller: [B/2] | 180 // Clients in controller: [B/2] |
(...skipping 19 matching lines...) Expand all Loading... |
207 // Clients in controller: [] | 200 // Clients in controller: [] |
208 ASSERT_EQ(0, controller_->GetClientCount()) | 201 ASSERT_EQ(0, controller_->GetClientCount()) |
209 << "Client count should return to zero after all clients are gone."; | 202 << "Client count should return to zero after all clients are gone."; |
210 } | 203 } |
211 | 204 |
212 // This test will connect and disconnect several clients while simulating an | 205 // This test will connect and disconnect several clients while simulating an |
213 // active capture device being started and generating frames. It runs on one | 206 // active capture device being started and generating frames. It runs on one |
214 // thread and is intended to behave deterministically. | 207 // thread and is intended to behave deterministically. |
215 TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) { | 208 TEST_F(VideoCaptureControllerTest, NormalCaptureMultipleClients) { |
216 media::VideoCaptureParams session_100; | 209 media::VideoCaptureParams session_100; |
| 210 session_100.session_id = 100; |
217 session_100.requested_format = media::VideoCaptureFormat( | 211 session_100.requested_format = media::VideoCaptureFormat( |
218 gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420); | 212 320, 240, 30, media::ConstantResolutionVideoCaptureDevice); |
219 | 213 |
220 media::VideoCaptureParams session_200 = session_100; | 214 media::VideoCaptureParams session_200 = session_100; |
| 215 session_200.session_id = 200; |
221 | 216 |
222 media::VideoCaptureParams session_300 = session_100; | 217 media::VideoCaptureParams session_300 = session_100; |
| 218 session_300.session_id = 300; |
223 | 219 |
224 media::VideoCaptureParams session_1 = session_100; | 220 media::VideoCaptureParams session_1 = session_100; |
| 221 session_1.session_id = 1; |
225 | 222 |
226 gfx::Size capture_resolution(444, 200); | 223 gfx::Size capture_resolution(444, 200); |
227 | 224 |
228 // The device format needn't match the VideoCaptureParams (the camera can do | 225 // The device format needn't match the VideoCaptureParams (the camera can do |
229 // what it wants). Pick something random. | 226 // what it wants). Pick something random. |
230 media::VideoCaptureFormat device_format( | 227 media::VideoCaptureCapability device_format( |
231 gfx::Size(10, 10), 25, media::PIXEL_FORMAT_RGB24); | 228 10, 10, 25, media::PIXEL_FORMAT_RGB24, |
| 229 media::ConstantResolutionVideoCaptureDevice); |
232 | 230 |
233 const VideoCaptureControllerID client_a_route_1(0xa1a1a1a1); | 231 const VideoCaptureControllerID client_a_route_1(0xa1a1a1a1); |
234 const VideoCaptureControllerID client_a_route_2(0xa2a2a2a2); | 232 const VideoCaptureControllerID client_a_route_2(0xa2a2a2a2); |
235 const VideoCaptureControllerID client_b_route_1(0xb1b1b1b1); | 233 const VideoCaptureControllerID client_b_route_1(0xb1b1b1b1); |
236 const VideoCaptureControllerID client_b_route_2(0xb2b2b2b2); | 234 const VideoCaptureControllerID client_b_route_2(0xb2b2b2b2); |
237 | 235 |
238 // Start with two clients. | 236 // Start with two clients. |
239 controller_->AddClient(client_a_route_1, | 237 controller_->AddClient(client_a_route_1, client_a_.get(), |
240 client_a_.get(), | 238 base::kNullProcessHandle, session_100); |
241 base::kNullProcessHandle, | 239 controller_->AddClient(client_b_route_1, client_b_.get(), |
242 100, | 240 base::kNullProcessHandle, session_300); |
243 session_100); | 241 controller_->AddClient(client_a_route_2, client_a_.get(), |
244 controller_->AddClient(client_b_route_1, | 242 base::kNullProcessHandle, session_200); |
245 client_b_.get(), | |
246 base::kNullProcessHandle, | |
247 300, | |
248 session_300); | |
249 controller_->AddClient(client_a_route_2, | |
250 client_a_.get(), | |
251 base::kNullProcessHandle, | |
252 200, | |
253 session_200); | |
254 ASSERT_EQ(3, controller_->GetClientCount()); | 243 ASSERT_EQ(3, controller_->GetClientCount()); |
255 | 244 |
256 // Now, simulate an incoming captured buffer from the capture device. As a | 245 // Now, simulate an incoming captured buffer from the capture device. As a |
257 // side effect this will cause the first buffer to be shared with clients. | 246 // side effect this will cause the first buffer to be shared with clients. |
258 uint8 buffer_no = 1; | 247 uint8 buffer_no = 1; |
259 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer; | 248 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer; |
260 buffer = | 249 buffer = |
261 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); | 250 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); |
262 ASSERT_TRUE(buffer); | 251 ASSERT_TRUE(buffer); |
263 memset(buffer->data(), buffer_no++, buffer->size()); | 252 memset(buffer->data(), buffer_no++, buffer->size()); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 | 292 |
304 // The buffer should be delivered to the clients in any order. | 293 // The buffer should be delivered to the clients in any order. |
305 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1)).Times(1); | 294 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1)).Times(1); |
306 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1); | 295 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1); |
307 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1); | 296 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1); |
308 base::RunLoop().RunUntilIdle(); | 297 base::RunLoop().RunUntilIdle(); |
309 Mock::VerifyAndClearExpectations(client_a_.get()); | 298 Mock::VerifyAndClearExpectations(client_a_.get()); |
310 Mock::VerifyAndClearExpectations(client_b_.get()); | 299 Mock::VerifyAndClearExpectations(client_b_.get()); |
311 | 300 |
312 // Add a fourth client now that some buffers have come through. | 301 // Add a fourth client now that some buffers have come through. |
313 controller_->AddClient(client_b_route_2, | 302 controller_->AddClient(client_b_route_2, client_b_.get(), |
314 client_b_.get(), | 303 base::kNullProcessHandle, session_1); |
315 base::kNullProcessHandle, | |
316 1, | |
317 session_1); | |
318 Mock::VerifyAndClearExpectations(client_b_.get()); | 304 Mock::VerifyAndClearExpectations(client_b_.get()); |
319 | 305 |
320 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time. | 306 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time. |
321 for (int i = 0; i < kPoolSize; i++) { | 307 for (int i = 0; i < kPoolSize; i++) { |
322 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420, | 308 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420, |
323 capture_resolution); | 309 capture_resolution); |
324 ASSERT_TRUE(buffer); | 310 ASSERT_TRUE(buffer); |
325 memset(buffer->data(), buffer_no++, buffer->size()); | 311 memset(buffer->data(), buffer_no++, buffer->size()); |
326 device_->OnIncomingCapturedBuffer(buffer, | 312 device_->OnIncomingCapturedBuffer(buffer, |
327 media::VideoFrame::I420, | 313 media::VideoFrame::I420, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(2); | 374 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(2); |
389 base::RunLoop().RunUntilIdle(); | 375 base::RunLoop().RunUntilIdle(); |
390 Mock::VerifyAndClearExpectations(client_a_.get()); | 376 Mock::VerifyAndClearExpectations(client_a_.get()); |
391 Mock::VerifyAndClearExpectations(client_b_.get()); | 377 Mock::VerifyAndClearExpectations(client_b_.get()); |
392 } | 378 } |
393 | 379 |
394 // Exercises the OnError() codepath of VideoCaptureController, and tests the | 380 // Exercises the OnError() codepath of VideoCaptureController, and tests the |
395 // behavior of various operations after the error state has been signalled. | 381 // behavior of various operations after the error state has been signalled. |
396 TEST_F(VideoCaptureControllerTest, ErrorBeforeDeviceCreation) { | 382 TEST_F(VideoCaptureControllerTest, ErrorBeforeDeviceCreation) { |
397 media::VideoCaptureParams session_100; | 383 media::VideoCaptureParams session_100; |
| 384 session_100.session_id = 100; |
398 session_100.requested_format = media::VideoCaptureFormat( | 385 session_100.requested_format = media::VideoCaptureFormat( |
399 gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420); | 386 320, 240, 30, media::ConstantResolutionVideoCaptureDevice); |
400 | 387 |
401 media::VideoCaptureParams session_200 = session_100; | 388 media::VideoCaptureParams session_200 = session_100; |
| 389 session_200.session_id = 200; |
402 | 390 |
403 const gfx::Size capture_resolution(320, 240); | 391 const gfx::Size capture_resolution(320, 240); |
404 | 392 |
405 const VideoCaptureControllerID route_id(0x99); | 393 const VideoCaptureControllerID route_id(0x99); |
406 | 394 |
407 // Start with one client. | 395 // Start with one client. |
408 controller_->AddClient( | 396 controller_->AddClient(route_id, client_a_.get(), |
409 route_id, client_a_.get(), base::kNullProcessHandle, 100, session_100); | 397 base::kNullProcessHandle, session_100); |
410 device_->OnError(); | 398 device_->OnError(); |
411 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1); | 399 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1); |
412 base::RunLoop().RunUntilIdle(); | 400 base::RunLoop().RunUntilIdle(); |
413 Mock::VerifyAndClearExpectations(client_a_.get()); | 401 Mock::VerifyAndClearExpectations(client_a_.get()); |
414 | 402 |
415 // Second client connects after the error state. It also should get told of | 403 // Second client connects after the error state. It also should get told of |
416 // the error. | 404 // the error. |
417 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); | 405 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); |
418 controller_->AddClient( | 406 controller_->AddClient(route_id, client_b_.get(), |
419 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); | 407 base::kNullProcessHandle, session_200); |
420 base::RunLoop().RunUntilIdle(); | 408 base::RunLoop().RunUntilIdle(); |
421 Mock::VerifyAndClearExpectations(client_b_.get()); | 409 Mock::VerifyAndClearExpectations(client_b_.get()); |
422 | 410 |
423 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = | 411 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = |
424 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); | 412 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); |
425 ASSERT_TRUE(buffer); | 413 ASSERT_TRUE(buffer); |
426 | 414 |
427 device_->OnIncomingCapturedBuffer( | 415 device_->OnIncomingCapturedBuffer( |
428 buffer, media::VideoFrame::I420, capture_resolution, base::Time(), 30); | 416 buffer, media::VideoFrame::I420, capture_resolution, base::Time(), 30); |
429 buffer = NULL; | 417 buffer = NULL; |
430 | 418 |
431 base::RunLoop().RunUntilIdle(); | 419 base::RunLoop().RunUntilIdle(); |
432 } | 420 } |
433 | 421 |
434 // Exercises the OnError() codepath of VideoCaptureController, and tests the | 422 // Exercises the OnError() codepath of VideoCaptureController, and tests the |
435 // behavior of various operations after the error state has been signalled. | 423 // behavior of various operations after the error state has been signalled. |
436 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) { | 424 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) { |
437 media::VideoCaptureParams session_100; | 425 media::VideoCaptureParams session_100; |
| 426 session_100.session_id = 100; |
438 session_100.requested_format = media::VideoCaptureFormat( | 427 session_100.requested_format = media::VideoCaptureFormat( |
439 gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420); | 428 320, 240, 30, media::ConstantResolutionVideoCaptureDevice); |
440 | 429 |
441 media::VideoCaptureParams session_200 = session_100; | 430 media::VideoCaptureParams session_200 = session_100; |
| 431 session_200.session_id = 200; |
442 | 432 |
443 const VideoCaptureControllerID route_id(0x99); | 433 const VideoCaptureControllerID route_id(0x99); |
444 | 434 |
445 // Start with one client. | 435 // Start with one client. |
446 controller_->AddClient( | 436 controller_->AddClient(route_id, client_a_.get(), |
447 route_id, client_a_.get(), base::kNullProcessHandle, 100, session_100); | 437 base::kNullProcessHandle, session_100); |
448 media::VideoCaptureFormat device_format( | 438 // OnFrameInfo from the VCD should become a no-op after the error occurs. |
449 gfx::Size(10, 10), 25, media::PIXEL_FORMAT_ARGB); | 439 media::VideoCaptureCapability device_format( |
| 440 10, 10, 25, media::PIXEL_FORMAT_ARGB, |
| 441 media::ConstantResolutionVideoCaptureDevice); |
450 | 442 |
451 // Start the device. Then, before the first buffer, signal an error and | 443 // Start the device. Then, before the first buffer, signal an error and |
452 // deliver the buffer. The error should be propagated to clients; the buffer | 444 // deliver the buffer. The error should be propagated to clients; the buffer |
453 // should not be. | 445 // should not be. |
454 base::RunLoop().RunUntilIdle(); | 446 base::RunLoop().RunUntilIdle(); |
455 Mock::VerifyAndClearExpectations(client_a_.get()); | 447 Mock::VerifyAndClearExpectations(client_a_.get()); |
456 | 448 |
457 const gfx::Size dims(320, 240); | 449 const gfx::Size dims(320, 240); |
458 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = | 450 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = |
459 device_->ReserveOutputBuffer(media::VideoFrame::I420, dims); | 451 device_->ReserveOutputBuffer(media::VideoFrame::I420, dims); |
460 ASSERT_TRUE(buffer); | 452 ASSERT_TRUE(buffer); |
461 | 453 |
462 device_->OnError(); | 454 device_->OnError(); |
463 device_->OnIncomingCapturedBuffer(buffer, | 455 device_->OnIncomingCapturedBuffer(buffer, |
464 media::VideoFrame::I420, | 456 media::VideoFrame::I420, |
465 dims, | 457 dims, |
466 base::Time(), | 458 base::Time(), |
467 device_format.frame_rate); | 459 device_format.frame_rate); |
468 buffer = NULL; | 460 buffer = NULL; |
469 | 461 |
470 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1); | 462 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1); |
471 base::RunLoop().RunUntilIdle(); | 463 base::RunLoop().RunUntilIdle(); |
472 Mock::VerifyAndClearExpectations(client_a_.get()); | 464 Mock::VerifyAndClearExpectations(client_a_.get()); |
473 | 465 |
474 // Second client connects after the error state. It also should get told of | 466 // Second client connects after the error state. It also should get told of |
475 // the error. | 467 // the error. |
476 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); | 468 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); |
477 controller_->AddClient( | 469 controller_->AddClient(route_id, client_b_.get(), |
478 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); | 470 base::kNullProcessHandle, session_200); |
479 Mock::VerifyAndClearExpectations(client_b_.get()); | 471 Mock::VerifyAndClearExpectations(client_b_.get()); |
480 } | 472 } |
481 | 473 |
482 } // namespace content | 474 } // namespace content |
OLD | NEW |