/* * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/desktop_capture/win/wgc_capture_source.h" #include #include #include #include "modules/desktop_capture/desktop_capture_types.h" #include "modules/desktop_capture/desktop_geometry.h" #include "modules/desktop_capture/win/screen_capture_utils.h" #include "modules/desktop_capture/win/test_support/test_window.h" #include "modules/desktop_capture/win/wgc_capturer_win.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/win/scoped_com_initializer.h" #include "test/gtest.h" namespace webrtc { namespace { const WCHAR kWindowTitle[] = L"WGC Capture Source Test Window"; const int kFirstXCoord = 25; const int kFirstYCoord = 50; const int kSecondXCoord = 50; const int kSecondYCoord = 75; } // namespace class WgcCaptureSourceTest : public ::testing::TestWithParam { public: void SetUp() override { com_initializer_ = std::make_unique(ScopedCOMInitializer::kMTA); ASSERT_TRUE(com_initializer_->Succeeded()); } void TearDown() override { if (window_open_) { DestroyTestWindow(window_info_); } } void SetUpForWindowSource() { window_info_ = CreateTestWindow(kWindowTitle); window_open_ = true; source_id_ = reinterpret_cast(window_info_.hwnd); source_factory_ = std::make_unique(); } void SetUpForScreenSource() { source_id_ = kFullDesktopScreenId; source_factory_ = std::make_unique(); } protected: std::unique_ptr com_initializer_; std::unique_ptr source_factory_; std::unique_ptr source_; DesktopCapturer::SourceId source_id_; WindowInfo window_info_; bool window_open_ = false; }; // Window specific test TEST_F(WgcCaptureSourceTest, WindowPosition) { if (!IsWgcSupported(CaptureType::kWindow)) { RTC_LOG(LS_INFO) << "Skipping WgcCapturerWinTests on unsupported platforms."; GTEST_SKIP(); } SetUpForWindowSource(); source_ = source_factory_->CreateCaptureSource(source_id_); ASSERT_TRUE(source_); EXPECT_EQ(source_->GetSourceId(), source_id_); MoveTestWindow(window_info_.hwnd, kFirstXCoord, kFirstYCoord); DesktopVector source_vector = source_->GetTopLeft(); EXPECT_EQ(source_vector.x(), kFirstXCoord); EXPECT_EQ(source_vector.y(), kFirstYCoord); MoveTestWindow(window_info_.hwnd, kSecondXCoord, kSecondYCoord); source_vector = source_->GetTopLeft(); EXPECT_EQ(source_vector.x(), kSecondXCoord); EXPECT_EQ(source_vector.y(), kSecondYCoord); } // Screen specific test TEST_F(WgcCaptureSourceTest, ScreenPosition) { if (!IsWgcSupported(CaptureType::kScreen)) { RTC_LOG(LS_INFO) << "Skipping WgcCapturerWinTests on unsupported platforms."; GTEST_SKIP(); } SetUpForScreenSource(); source_ = source_factory_->CreateCaptureSource(source_id_); ASSERT_TRUE(source_); EXPECT_EQ(source_id_, source_->GetSourceId()); DesktopRect screen_rect = GetFullscreenRect(); DesktopVector source_vector = source_->GetTopLeft(); EXPECT_EQ(source_vector.x(), screen_rect.left()); EXPECT_EQ(source_vector.y(), screen_rect.top()); } // Source agnostic test TEST_P(WgcCaptureSourceTest, CreateSource) { if (!IsWgcSupported(GetParam())) { RTC_LOG(LS_INFO) << "Skipping WgcCapturerWinTests on unsupported platforms."; GTEST_SKIP(); } if (GetParam() == CaptureType::kWindow) { SetUpForWindowSource(); } else { SetUpForScreenSource(); } source_ = source_factory_->CreateCaptureSource(source_id_); ASSERT_TRUE(source_); EXPECT_EQ(source_id_, source_->GetSourceId()); EXPECT_TRUE(source_->IsCapturable()); Microsoft::WRL::ComPtr item; EXPECT_TRUE(SUCCEEDED(source_->GetCaptureItem(&item))); EXPECT_TRUE(item); } INSTANTIATE_TEST_SUITE_P(SourceAgnostic, WgcCaptureSourceTest, ::testing::Values(CaptureType::kWindow, CaptureType::kScreen)); } // namespace webrtc