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