Add unittest for ScreenCapturerSck Bug: webrtc:367915807 Change-Id: I4a8f2667fa058ef60e8b0c1dcbff53b3139c0807 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/365081 Reviewed-by: Alexander Cooper <alcooper@chromium.org> Reviewed-by: Johannes Kron <kron@webrtc.org> Commit-Queue: Andreas Pehrson <apehrson@mozilla.com> Cr-Commit-Position: refs/heads/main@{#44167}
diff --git a/modules/desktop_capture/screen_capturer_mac_unittest.cc b/modules/desktop_capture/screen_capturer_mac_unittest.cc index 96e8440..7adbd8d 100644 --- a/modules/desktop_capture/screen_capturer_mac_unittest.cc +++ b/modules/desktop_capture/screen_capturer_mac_unittest.cc
@@ -10,8 +10,9 @@ #include <ApplicationServices/ApplicationServices.h> +#include <chrono> #include <memory> -#include <ostream> +#include <thread> #include "modules/desktop_capture/desktop_capture_options.h" #include "modules/desktop_capture/desktop_capturer.h" @@ -24,7 +25,8 @@ using ::testing::_; using ::testing::AnyNumber; -using ::testing::Return; +using ::testing::AnyOf; +using ::testing::InSequence; namespace webrtc { @@ -49,6 +51,18 @@ MockDesktopCapturerCallback callback_; }; +class ScreenCapturerSckTest : public ScreenCapturerMacTest { + protected: + void SetUp() override { + auto options = DesktopCaptureOptions::CreateDefault(); + options.set_allow_sck_capturer(true); + capturer_ = DesktopCapturer::CreateScreenCapturer(options); + } + + std::unique_ptr<DesktopCapturer> capturer_; + MockDesktopCapturerCallback callback_; +}; + void ScreenCapturerMacTest::CaptureDoneCallback1( DesktopCapturer::Result result, std::unique_ptr<DesktopFrame>* frame) { @@ -77,7 +91,11 @@ EXPECT_TRUE((*frame)->data() != NULL); // Depending on the capture method, the screen may be flipped or not, so // the stride may be positive or negative. - EXPECT_EQ(static_cast<int>(sizeof(uint32_t) * width), + // The stride may in theory be larger than the width due to alignment, but in + // other cases, like window capture, the stride normally matches the monitor + // resolution whereas the width matches the window region on said monitor. + // Make no assumptions. + EXPECT_LE(static_cast<int>(sizeof(uint32_t) * width), abs((*frame)->stride())); } @@ -98,4 +116,53 @@ capturer_->CaptureFrame(); } +TEST_F(ScreenCapturerSckTest, Capture) { + if (!CGPreflightScreenCaptureAccess()) { + GTEST_SKIP() + << "ScreenCapturerSckTest needs TCC ScreenCapture authorization"; + } + + std::atomic<bool> done{false}; + std::atomic<DesktopCapturer::Result> result{ + DesktopCapturer::Result::ERROR_TEMPORARY}; + InSequence s; + EXPECT_CALL(callback_, + OnCaptureResultPtr(DesktopCapturer::Result::ERROR_TEMPORARY, _)) + .Times(AnyNumber()); + EXPECT_CALL(callback_, + OnCaptureResultPtr(AnyOf(DesktopCapturer::Result::ERROR_PERMANENT, + DesktopCapturer::Result::SUCCESS), + _)) + .WillOnce([this, &result](DesktopCapturer::Result res, + std::unique_ptr<DesktopFrame>* frame) { + result = res; + if (res == DesktopCapturer::Result::SUCCESS) { + CaptureDoneCallback1(res, frame); + } + }); + SCOPED_TRACE(""); + capturer_->Start(&callback_); + + while (result == DesktopCapturer::Result::ERROR_TEMPORARY) { + // Check that we get an initial full-screen updated. + capturer_->CaptureFrame(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + ASSERT_NE(result, DesktopCapturer::Result::ERROR_PERMANENT); + + EXPECT_CALL(callback_, + OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _)) + .Times(1) + .WillOnce([this, &done](auto res, auto frame) { + CaptureDoneCallback2(res, frame); + done = true; + }); + + while (!done) { + // Check that we get an initial full-screen updated. + capturer_->CaptureFrame(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } +} + } // namespace webrtc