| OLD | NEW |
| (Empty) | |
| 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * |
| 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 |
| 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ |
| 10 |
| 11 #include "webrtc/modules/desktop_capture/fallback_desktop_capturer_wrapper.h" |
| 12 |
| 13 #include <memory> |
| 14 #include <utility> |
| 15 #include <vector> |
| 16 |
| 17 #include "webrtc/modules/desktop_capture/desktop_capturer.h" |
| 18 #include "webrtc/modules/desktop_capture/desktop_frame_generator.h" |
| 19 #include "webrtc/modules/desktop_capture/fake_desktop_capturer.h" |
| 20 #include "webrtc/test/gtest.h" |
| 21 |
| 22 namespace webrtc { |
| 23 |
| 24 namespace { |
| 25 |
| 26 std::unique_ptr<DesktopCapturer> CreateDesktopCapturer( |
| 27 PainterDesktopFrameGenerator* frame_generator) { |
| 28 std::unique_ptr<FakeDesktopCapturer> capturer(new FakeDesktopCapturer()); |
| 29 capturer->set_frame_generator(frame_generator); |
| 30 return std::move(capturer); |
| 31 } |
| 32 |
| 33 class FakeSharedMemory : public SharedMemory { |
| 34 public: |
| 35 explicit FakeSharedMemory(size_t size); |
| 36 ~FakeSharedMemory() override; |
| 37 |
| 38 private: |
| 39 static int next_id_; |
| 40 }; |
| 41 |
| 42 // static |
| 43 int FakeSharedMemory::next_id_ = 0; |
| 44 |
| 45 FakeSharedMemory::FakeSharedMemory(size_t size) |
| 46 : SharedMemory(new char[size], size, 0, next_id_++) {} |
| 47 |
| 48 FakeSharedMemory::~FakeSharedMemory() { |
| 49 delete[] static_cast<char*>(data_); |
| 50 } |
| 51 |
| 52 class FakeSharedMemoryFactory : public SharedMemoryFactory { |
| 53 public: |
| 54 FakeSharedMemoryFactory() = default; |
| 55 ~FakeSharedMemoryFactory() override = default; |
| 56 |
| 57 std::unique_ptr<SharedMemory> CreateSharedMemory(size_t size) override; |
| 58 }; |
| 59 |
| 60 std::unique_ptr<SharedMemory> FakeSharedMemoryFactory::CreateSharedMemory( |
| 61 size_t size) { |
| 62 return std::unique_ptr<SharedMemory>(new FakeSharedMemory(size)); |
| 63 } |
| 64 |
| 65 } // namespace |
| 66 |
| 67 class FallbackDesktopCapturerWrapperTest : public testing::Test, |
| 68 public DesktopCapturer::Callback { |
| 69 public: |
| 70 FallbackDesktopCapturerWrapperTest(); |
| 71 ~FallbackDesktopCapturerWrapperTest() override = default; |
| 72 |
| 73 protected: |
| 74 std::vector<std::pair<DesktopCapturer::Result, bool>> results_; |
| 75 FakeDesktopCapturer* main_capturer_ = nullptr; |
| 76 FakeDesktopCapturer* secondary_capturer_ = nullptr; |
| 77 std::unique_ptr<FallbackDesktopCapturerWrapper> wrapper_; |
| 78 |
| 79 private: |
| 80 // DesktopCapturer::Callback interface |
| 81 void OnCaptureResult(DesktopCapturer::Result result, |
| 82 std::unique_ptr<DesktopFrame> frame) override; |
| 83 PainterDesktopFrameGenerator frame_generator; |
| 84 }; |
| 85 |
| 86 FallbackDesktopCapturerWrapperTest::FallbackDesktopCapturerWrapperTest() { |
| 87 frame_generator.size()->set(1024, 768); |
| 88 std::unique_ptr<DesktopCapturer> main_capturer = |
| 89 CreateDesktopCapturer(&frame_generator); |
| 90 std::unique_ptr<DesktopCapturer> secondary_capturer = |
| 91 CreateDesktopCapturer(&frame_generator); |
| 92 main_capturer_ = static_cast<FakeDesktopCapturer*>(main_capturer.get()); |
| 93 secondary_capturer_ = |
| 94 static_cast<FakeDesktopCapturer*>(secondary_capturer.get()); |
| 95 wrapper_.reset(new FallbackDesktopCapturerWrapper( |
| 96 std::move(main_capturer), std::move(secondary_capturer))); |
| 97 wrapper_->Start(this); |
| 98 } |
| 99 |
| 100 void FallbackDesktopCapturerWrapperTest::OnCaptureResult( |
| 101 DesktopCapturer::Result result, |
| 102 std::unique_ptr<DesktopFrame> frame) { |
| 103 results_.emplace_back(result, !!frame); |
| 104 } |
| 105 |
| 106 TEST_F(FallbackDesktopCapturerWrapperTest, MainNeverFailed) { |
| 107 wrapper_->CaptureFrame(); |
| 108 ASSERT_EQ(main_capturer_->num_capture_attempts(), 1); |
| 109 ASSERT_EQ(main_capturer_->num_frames_captured(), 1); |
| 110 ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 0); |
| 111 ASSERT_EQ(secondary_capturer_->num_frames_captured(), 0); |
| 112 ASSERT_EQ(results_.size(), 1U); |
| 113 ASSERT_EQ(results_[0], |
| 114 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 115 } |
| 116 |
| 117 TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedTemporarily) { |
| 118 wrapper_->CaptureFrame(); |
| 119 main_capturer_->set_result(DesktopCapturer::Result::ERROR_TEMPORARY); |
| 120 wrapper_->CaptureFrame(); |
| 121 main_capturer_->set_result(DesktopCapturer::Result::SUCCESS); |
| 122 wrapper_->CaptureFrame(); |
| 123 |
| 124 ASSERT_EQ(main_capturer_->num_capture_attempts(), 3); |
| 125 ASSERT_EQ(main_capturer_->num_frames_captured(), 2); |
| 126 ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 1); |
| 127 ASSERT_EQ(secondary_capturer_->num_frames_captured(), 1); |
| 128 ASSERT_EQ(results_.size(), 3U); |
| 129 for (int i = 0; i < 3; i++) { |
| 130 ASSERT_EQ(results_[i], |
| 131 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 132 } |
| 133 } |
| 134 |
| 135 TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedPermanently) { |
| 136 wrapper_->CaptureFrame(); |
| 137 main_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT); |
| 138 wrapper_->CaptureFrame(); |
| 139 main_capturer_->set_result(DesktopCapturer::Result::SUCCESS); |
| 140 wrapper_->CaptureFrame(); |
| 141 |
| 142 ASSERT_EQ(main_capturer_->num_capture_attempts(), 2); |
| 143 ASSERT_EQ(main_capturer_->num_frames_captured(), 1); |
| 144 ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 2); |
| 145 ASSERT_EQ(secondary_capturer_->num_frames_captured(), 2); |
| 146 ASSERT_EQ(results_.size(), 3U); |
| 147 for (int i = 0; i < 3; i++) { |
| 148 ASSERT_EQ(results_[i], |
| 149 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 150 } |
| 151 } |
| 152 |
| 153 TEST_F(FallbackDesktopCapturerWrapperTest, BothFailed) { |
| 154 wrapper_->CaptureFrame(); |
| 155 main_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT); |
| 156 wrapper_->CaptureFrame(); |
| 157 main_capturer_->set_result(DesktopCapturer::Result::SUCCESS); |
| 158 wrapper_->CaptureFrame(); |
| 159 secondary_capturer_->set_result(DesktopCapturer::Result::ERROR_TEMPORARY); |
| 160 wrapper_->CaptureFrame(); |
| 161 secondary_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT); |
| 162 wrapper_->CaptureFrame(); |
| 163 wrapper_->CaptureFrame(); |
| 164 |
| 165 ASSERT_EQ(main_capturer_->num_capture_attempts(), 2); |
| 166 ASSERT_EQ(main_capturer_->num_frames_captured(), 1); |
| 167 ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 5); |
| 168 ASSERT_EQ(secondary_capturer_->num_frames_captured(), 2); |
| 169 ASSERT_EQ(results_.size(), 6U); |
| 170 for (int i = 0; i < 3; i++) { |
| 171 ASSERT_EQ(results_[i], |
| 172 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 173 } |
| 174 ASSERT_EQ(results_[3], |
| 175 std::make_pair(DesktopCapturer::Result::ERROR_TEMPORARY, false)); |
| 176 ASSERT_EQ(results_[4], |
| 177 std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false)); |
| 178 ASSERT_EQ(results_[5], |
| 179 std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false)); |
| 180 } |
| 181 |
| 182 TEST_F(FallbackDesktopCapturerWrapperTest, WithSharedMemory) { |
| 183 wrapper_->SetSharedMemoryFactory(std::unique_ptr<SharedMemoryFactory>( |
| 184 new FakeSharedMemoryFactory())); |
| 185 wrapper_->CaptureFrame(); |
| 186 main_capturer_->set_result(DesktopCapturer::Result::ERROR_TEMPORARY); |
| 187 wrapper_->CaptureFrame(); |
| 188 main_capturer_->set_result(DesktopCapturer::Result::SUCCESS); |
| 189 wrapper_->CaptureFrame(); |
| 190 main_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT); |
| 191 wrapper_->CaptureFrame(); |
| 192 wrapper_->CaptureFrame(); |
| 193 |
| 194 ASSERT_EQ(main_capturer_->num_capture_attempts(), 4); |
| 195 ASSERT_EQ(main_capturer_->num_frames_captured(), 2); |
| 196 ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 3); |
| 197 ASSERT_EQ(secondary_capturer_->num_frames_captured(), 3); |
| 198 ASSERT_EQ(results_.size(), 5U); |
| 199 for (int i = 0; i < 5; i++) { |
| 200 ASSERT_EQ(results_[i], |
| 201 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 202 } |
| 203 } |
| 204 |
| 205 } // namespace webrtc |
| OLD | NEW |