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