OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "webrtc/modules/desktop_capture/desktop_capture_options.h" | 25 #include "webrtc/modules/desktop_capture/desktop_capture_options.h" |
26 #include "webrtc/modules/desktop_capture/desktop_frame.h" | 26 #include "webrtc/modules/desktop_capture/desktop_frame.h" |
27 #include "webrtc/modules/desktop_capture/desktop_region.h" | 27 #include "webrtc/modules/desktop_capture/desktop_region.h" |
28 #include "webrtc/modules/desktop_capture/mock_desktop_capturer_callback.h" | 28 #include "webrtc/modules/desktop_capture/mock_desktop_capturer_callback.h" |
29 #include "webrtc/modules/desktop_capture/rgba_color.h" | 29 #include "webrtc/modules/desktop_capture/rgba_color.h" |
30 #include "webrtc/modules/desktop_capture/screen_drawer.h" | 30 #include "webrtc/modules/desktop_capture/screen_drawer.h" |
31 #include "webrtc/test/gmock.h" | 31 #include "webrtc/test/gmock.h" |
32 #include "webrtc/test/gtest.h" | 32 #include "webrtc/test/gtest.h" |
33 | 33 |
34 #if defined(WEBRTC_WIN) | 34 #if defined(WEBRTC_WIN) |
| 35 #include "webrtc/base/win32.h" |
35 #include "webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h" | 36 #include "webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h" |
36 #endif // defined(WEBRTC_WIN) | 37 #endif // defined(WEBRTC_WIN) |
37 | 38 |
38 using ::testing::_; | 39 using ::testing::_; |
39 | 40 |
40 namespace webrtc { | 41 namespace webrtc { |
41 | 42 |
42 namespace { | 43 namespace { |
43 | 44 |
44 ACTION_P(SaveUniquePtrArg, dest) { | 45 ACTION_P(SaveUniquePtrArg, dest) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 capturer_ = DesktopCapturer::CreateScreenCapturer( | 83 capturer_ = DesktopCapturer::CreateScreenCapturer( |
83 DesktopCaptureOptions::CreateDefault()); | 84 DesktopCaptureOptions::CreateDefault()); |
84 } | 85 } |
85 | 86 |
86 protected: | 87 protected: |
87 void TestCaptureUpdatedRegion( | 88 void TestCaptureUpdatedRegion( |
88 std::initializer_list<DesktopCapturer*> capturers) { | 89 std::initializer_list<DesktopCapturer*> capturers) { |
89 RTC_DCHECK(capturers.size() > 0); | 90 RTC_DCHECK(capturers.size() > 0); |
90 // A large enough area for the tests, which should be able to be fulfilled | 91 // A large enough area for the tests, which should be able to be fulfilled |
91 // by most systems. | 92 // by most systems. |
| 93 #if defined(WEBRTC_WIN) |
| 94 // On Windows, an interesting warning window may pop up randomly. The root |
| 95 // cause is still under investigation, so reduce the test area to work |
| 96 // around. Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6666. |
| 97 const int kTestArea = 416; |
| 98 #else |
92 const int kTestArea = 512; | 99 const int kTestArea = 512; |
| 100 #endif |
93 const int kRectSize = 32; | 101 const int kRectSize = 32; |
94 std::unique_ptr<ScreenDrawer> drawer = ScreenDrawer::Create(); | 102 std::unique_ptr<ScreenDrawer> drawer = ScreenDrawer::Create(); |
95 if (!drawer || drawer->DrawableRegion().is_empty()) { | 103 if (!drawer || drawer->DrawableRegion().is_empty()) { |
96 LOG(LS_WARNING) << "No ScreenDrawer implementation for current platform."; | 104 LOG(LS_WARNING) << "No ScreenDrawer implementation for current platform."; |
97 return; | 105 return; |
98 } | 106 } |
99 if (drawer->DrawableRegion().width() < kTestArea || | 107 if (drawer->DrawableRegion().width() < kTestArea || |
100 drawer->DrawableRegion().height() < kTestArea) { | 108 drawer->DrawableRegion().height() < kTestArea) { |
101 LOG(LS_WARNING) << "ScreenDrawer::DrawableRegion() is too small for the " | 109 LOG(LS_WARNING) << "ScreenDrawer::DrawableRegion() is too small for the " |
102 "CaptureUpdatedRegion tests."; | 110 "CaptureUpdatedRegion tests."; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 // should be removed after flaky of ScreenCapturerIntegrationTest has | 218 // should be removed after flaky of ScreenCapturerIntegrationTest has |
211 // been resolved. | 219 // been resolved. |
212 else if (i == wait_capture_round - 1) { | 220 else if (i == wait_capture_round - 1) { |
213 std::string result; | 221 std::string result; |
214 rtc::Base64::EncodeFromArray(frame->data(), | 222 rtc::Base64::EncodeFromArray(frame->data(), |
215 frame->size().height() * frame->stride(), | 223 frame->size().height() * frame->stride(), |
216 &result); | 224 &result); |
217 std::cout << frame->size().width() << " x " << frame->size().height() | 225 std::cout << frame->size().width() << " x " << frame->size().height() |
218 << std::endl; | 226 << std::endl; |
219 // Split the entire string (can be over 4M) into several lines to | 227 // Split the entire string (can be over 4M) into several lines to |
220 // avoid browser from stucking. | 228 // avoid browser from sticking. |
221 static const size_t kLineLength = 32768; | 229 static const size_t kLineLength = 32768; |
222 const char* result_end = result.c_str() + result.length(); | 230 const char* result_end = result.c_str() + result.length(); |
223 for (const char* it = result.c_str(); | 231 for (const char* it = result.c_str(); |
224 it < result_end; | 232 it < result_end; |
225 it += kLineLength) { | 233 it += kLineLength) { |
226 const size_t max_length = result_end - it; | 234 const size_t max_length = result_end - it; |
227 std::cout << std::string(it, std::min(kLineLength, max_length)) | 235 std::cout << std::string(it, std::min(kLineLength, max_length)) |
228 << std::endl; | 236 << std::endl; |
229 } | 237 } |
| 238 std::cout << "Failed to capture rectangle " << rect.left() << " x " |
| 239 << rect.top() << " - " << rect.right() << " x " |
| 240 << rect.bottom() << " with color (" |
| 241 << static_cast<int>(color.red) << ", " |
| 242 << static_cast<int>(color.green) << ", " |
| 243 << static_cast<int>(color.blue) << ", " |
| 244 << static_cast<int>(color.alpha) << ")" << std::endl; |
230 ASSERT_TRUE(false) << "ScreenCapturerIntegrationTest may be flaky. " | 245 ASSERT_TRUE(false) << "ScreenCapturerIntegrationTest may be flaky. " |
231 "Please kindly FYI the broken link to " | 246 "If the error message above is " |
232 "zijiehe@chromium.org for investigation. If I " | 247 "\"////AP///wD///8A\", it's a known issue, " |
233 "have not responded as quick as expected, " | 248 "which should be able to recover by rerunning " |
234 "disable *all* tests in " | 249 "the test. Otherwise please kindly FYI the " |
| 250 "broken link to zijiehe@chromium.org for " |
| 251 "investigation. If the failure continually " |
| 252 "happens, but I have not responded as quick as " |
| 253 "expected, disable *all* tests in " |
235 "screen_capturer_integration_test.cc to " | 254 "screen_capturer_integration_test.cc to " |
236 "unblock other developers."; | 255 "unblock other developers."; |
237 } | 256 } |
238 } | 257 } |
239 | 258 |
240 if (succeeded_capturers == capturers.size()) { | 259 if (succeeded_capturers == capturers.size()) { |
241 break; | 260 break; |
242 } | 261 } |
243 } | 262 } |
244 | 263 |
245 ASSERT_EQ(succeeded_capturers, capturers.size()); | 264 ASSERT_EQ(succeeded_capturers, capturers.size()); |
246 } | 265 } |
247 | 266 |
248 // Expects |capturer| to successfully capture a frame, and returns it. | 267 // Expects |capturer| to successfully capture a frame, and returns it. |
249 std::unique_ptr<DesktopFrame> CaptureFrame(DesktopCapturer* capturer) { | 268 std::unique_ptr<DesktopFrame> CaptureFrame(DesktopCapturer* capturer) { |
250 std::unique_ptr<DesktopFrame> frame; | 269 std::unique_ptr<DesktopFrame> frame; |
251 EXPECT_CALL(callback_, | 270 EXPECT_CALL(callback_, |
252 OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _)) | 271 OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _)) |
253 .WillOnce(SaveUniquePtrArg(&frame)); | 272 .WillOnce(SaveUniquePtrArg(&frame)); |
254 capturer->CaptureFrame(); | 273 capturer->CaptureFrame(); |
255 EXPECT_TRUE(frame); | 274 EXPECT_TRUE(frame); |
256 return frame; | 275 return frame; |
257 } | 276 } |
258 }; | 277 }; |
259 | 278 |
260 // Disabled because it's flaky. | 279 TEST_F(ScreenCapturerIntegrationTest, CaptureUpdatedRegion) { |
261 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | |
262 TEST_F(ScreenCapturerIntegrationTest, DISABLED_CaptureUpdatedRegion) { | |
263 TestCaptureUpdatedRegion(); | 280 TestCaptureUpdatedRegion(); |
264 } | 281 } |
265 | 282 |
266 // Disabled because it's flaky. | 283 TEST_F(ScreenCapturerIntegrationTest, TwoCapturers) { |
267 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | |
268 TEST_F(ScreenCapturerIntegrationTest, DISABLED_TwoCapturers) { | |
269 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); | 284 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); |
270 SetUp(); | 285 SetUp(); |
271 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); | 286 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); |
272 } | 287 } |
273 | 288 |
274 #if defined(WEBRTC_WIN) | 289 #if defined(WEBRTC_WIN) |
275 | 290 |
276 // Disabled because it's flaky. | |
277 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | |
278 TEST_F(ScreenCapturerIntegrationTest, | 291 TEST_F(ScreenCapturerIntegrationTest, |
279 DISABLED_CaptureUpdatedRegionWithDirectxCapturer) { | 292 CaptureUpdatedRegionWithDirectxCapturer) { |
280 if (!CreateDirectxCapturer()) { | 293 if (!CreateDirectxCapturer()) { |
281 return; | 294 return; |
282 } | 295 } |
283 | 296 |
284 TestCaptureUpdatedRegion(); | 297 TestCaptureUpdatedRegion(); |
285 } | 298 } |
286 | 299 |
287 // Disabled because it's flaky. | 300 TEST_F(ScreenCapturerIntegrationTest, TwoDirectxCapturers) { |
288 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | |
289 TEST_F(ScreenCapturerIntegrationTest, DISABLED_TwoDirectxCapturers) { | |
290 if (!CreateDirectxCapturer()) { | 301 if (!CreateDirectxCapturer()) { |
291 return; | 302 return; |
292 } | 303 } |
293 | 304 |
294 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); | 305 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); |
295 RTC_CHECK(CreateDirectxCapturer()); | 306 RTC_CHECK(CreateDirectxCapturer()); |
296 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); | 307 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); |
297 } | 308 } |
298 | 309 |
299 // Disabled because it's flaky. | |
300 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | |
301 TEST_F(ScreenCapturerIntegrationTest, | 310 TEST_F(ScreenCapturerIntegrationTest, |
302 DISABLED_CaptureUpdatedRegionWithMagnifierCapturer) { | 311 CaptureUpdatedRegionWithMagnifierCapturer) { |
| 312 // On Windows 8 or later, magnifier APIs return a frame with a border on test |
| 313 // environment, so disable these tests. |
| 314 // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 |
| 315 // TODO(zijiehe): Find the root cause of the border and failure, which cannot |
| 316 // reproduce on my dev machine. |
| 317 if (rtc::IsWindows8OrLater()) { |
| 318 return; |
| 319 } |
303 CreateMagnifierCapturer(); | 320 CreateMagnifierCapturer(); |
304 TestCaptureUpdatedRegion(); | 321 TestCaptureUpdatedRegion(); |
305 } | 322 } |
306 | 323 |
307 // Disabled because it's flaky. | 324 TEST_F(ScreenCapturerIntegrationTest, TwoMagnifierCapturers) { |
308 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | 325 // On Windows 8 or later, magnifier APIs return a frame with a border on test |
309 TEST_F(ScreenCapturerIntegrationTest, DISABLED_TwoMagnifierCapturers) { | 326 // environment, so disable these tests. |
| 327 // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 |
| 328 // TODO(zijiehe): Find the root cause of the border and failure, which cannot |
| 329 // reproduce on my dev machine. |
| 330 if (rtc::IsWindows8OrLater()) { |
| 331 return; |
| 332 } |
310 CreateMagnifierCapturer(); | 333 CreateMagnifierCapturer(); |
311 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); | 334 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); |
312 CreateMagnifierCapturer(); | 335 CreateMagnifierCapturer(); |
313 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); | 336 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); |
314 } | 337 } |
315 | 338 |
316 // Disabled because it's flaky. | |
317 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | |
318 TEST_F(ScreenCapturerIntegrationTest, | 339 TEST_F(ScreenCapturerIntegrationTest, |
319 DISABLED_MaybeCaptureUpdatedRegionWithDirectxCapturer) { | 340 MaybeCaptureUpdatedRegionWithDirectxCapturer) { |
320 // Even DirectX capturer is not supported in current system, we should be able | 341 // Even DirectX capturer is not supported in current system, we should be able |
321 // to select a usable capturer. | 342 // to select a usable capturer. |
322 MaybeCreateDirectxCapturer(); | 343 MaybeCreateDirectxCapturer(); |
323 TestCaptureUpdatedRegion(); | 344 TestCaptureUpdatedRegion(); |
324 } | 345 } |
325 | 346 |
326 #endif // defined(WEBRTC_WIN) | 347 #endif // defined(WEBRTC_WIN) |
327 | 348 |
328 } // namespace webrtc | 349 } // namespace webrtc |
OLD | NEW |