| 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 <map> |
| 14 #include <memory> |
| 15 #include <utility> |
| 16 #include <vector> |
| 17 |
| 18 #include "webrtc/modules/desktop_capture/desktop_capturer.h" |
| 19 #include "webrtc/modules/desktop_capture/desktop_frame_generator.h" |
| 20 #include "webrtc/modules/desktop_capture/fake_desktop_capturer.h" |
| 21 #include "webrtc/test/gtest.h" |
| 22 |
| 23 namespace webrtc { |
| 24 |
| 25 namespace { |
| 26 |
| 27 std::unique_ptr<DesktopCapturer> CreateDesktopCapturer( |
| 28 PainterDesktopFrameGenerator* frame_generator) { |
| 29 std::unique_ptr<FakeDesktopCapturer> capturer(new FakeDesktopCapturer()); |
| 30 capturer->set_frame_generator(frame_generator); |
| 31 return std::move(capturer); |
| 32 } |
| 33 |
| 34 } // namespace |
| 35 |
| 36 class FallbackDesktopCapturerWrapperTest : public testing::Test, |
| 37 public DesktopCapturer::Callback { |
| 38 public: |
| 39 FallbackDesktopCapturerWrapperTest(); |
| 40 ~FallbackDesktopCapturerWrapperTest() override = default; |
| 41 |
| 42 protected: |
| 43 FakeDesktopCapturer* main_capturer(); |
| 44 FakeDesktopCapturer* secondary_capturer(); |
| 45 FallbackDesktopCapturerWrapper* wrapper(); |
| 46 const std::vector<std::pair<DesktopCapturer::Result, bool>>& results() const; |
| 47 |
| 48 private: |
| 49 // DesktopCapturer::Callback interface |
| 50 void OnCaptureResult(DesktopCapturer::Result result, |
| 51 std::unique_ptr<DesktopFrame> frame) override; |
| 52 |
| 53 std::vector<std::pair<DesktopCapturer::Result, bool>> results_; |
| 54 FakeDesktopCapturer* main_capturer_ = nullptr; |
| 55 FakeDesktopCapturer* secondary_capturer_ = nullptr; |
| 56 std::unique_ptr<FallbackDesktopCapturerWrapper> wrapper_; |
| 57 PainterDesktopFrameGenerator frame_generator; |
| 58 }; |
| 59 |
| 60 FallbackDesktopCapturerWrapperTest::FallbackDesktopCapturerWrapperTest() { |
| 61 frame_generator.size()->set(1024, 768); |
| 62 std::unique_ptr<DesktopCapturer> main_capturer = |
| 63 CreateDesktopCapturer(&frame_generator); |
| 64 std::unique_ptr<DesktopCapturer> secondary_capturer = |
| 65 CreateDesktopCapturer(&frame_generator); |
| 66 main_capturer_ = static_cast<FakeDesktopCapturer*>(main_capturer.get()); |
| 67 secondary_capturer_ |
| 68 = static_cast<FakeDesktopCapturer*>(secondary_capturer.get()); |
| 69 wrapper_.reset(new FallbackDesktopCapturerWrapper( |
| 70 std::move(main_capturer), std::move(secondary_capturer))); |
| 71 wrapper_->Start(this); |
| 72 } |
| 73 |
| 74 FakeDesktopCapturer* FallbackDesktopCapturerWrapperTest::main_capturer() { |
| 75 return main_capturer_; |
| 76 } |
| 77 |
| 78 FakeDesktopCapturer* FallbackDesktopCapturerWrapperTest::secondary_capturer() { |
| 79 return secondary_capturer_; |
| 80 } |
| 81 |
| 82 FallbackDesktopCapturerWrapper* FallbackDesktopCapturerWrapperTest::wrapper() { |
| 83 return wrapper_.get(); |
| 84 } |
| 85 |
| 86 const std::vector<std::pair<DesktopCapturer::Result, bool>>& |
| 87 FallbackDesktopCapturerWrapperTest::results() const { |
| 88 return results_; |
| 89 } |
| 90 |
| 91 void FallbackDesktopCapturerWrapperTest::OnCaptureResult( |
| 92 DesktopCapturer::Result result, |
| 93 std::unique_ptr<DesktopFrame> frame) { |
| 94 results_.emplace_back(result, !!frame); |
| 95 } |
| 96 |
| 97 TEST_F(FallbackDesktopCapturerWrapperTest, MainNeverFailed) { |
| 98 wrapper()->CaptureFrame(); |
| 99 ASSERT_EQ(main_capturer()->num_capture_attempts(), 1); |
| 100 ASSERT_EQ(main_capturer()->num_frames_captured(), 1); |
| 101 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 0); |
| 102 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 0); |
| 103 ASSERT_EQ(results().size(), 1U); |
| 104 ASSERT_EQ(results()[0], |
| 105 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 106 } |
| 107 |
| 108 TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedTemporarily) { |
| 109 wrapper()->CaptureFrame(); |
| 110 main_capturer()->set_result(DesktopCapturer::Result::ERROR_TEMPORARY); |
| 111 wrapper()->CaptureFrame(); |
| 112 main_capturer()->set_result(DesktopCapturer::Result::SUCCESS); |
| 113 wrapper()->CaptureFrame(); |
| 114 |
| 115 ASSERT_EQ(main_capturer()->num_capture_attempts(), 3); |
| 116 ASSERT_EQ(main_capturer()->num_frames_captured(), 2); |
| 117 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 1); |
| 118 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 1); |
| 119 ASSERT_EQ(results().size(), 3U); |
| 120 for (int i = 0; i < 3; i++) { |
| 121 ASSERT_EQ(results()[i], |
| 122 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 123 } |
| 124 } |
| 125 |
| 126 TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedPermanently) { |
| 127 wrapper()->CaptureFrame(); |
| 128 main_capturer()->set_result(DesktopCapturer::Result::ERROR_PERMANENT); |
| 129 wrapper()->CaptureFrame(); |
| 130 main_capturer()->set_result(DesktopCapturer::Result::SUCCESS); |
| 131 wrapper()->CaptureFrame(); |
| 132 |
| 133 ASSERT_EQ(main_capturer()->num_capture_attempts(), 2); |
| 134 ASSERT_EQ(main_capturer()->num_frames_captured(), 1); |
| 135 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 2); |
| 136 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 2); |
| 137 ASSERT_EQ(results().size(), 3U); |
| 138 for (int i = 0; i < 3; i++) { |
| 139 ASSERT_EQ(results()[i], |
| 140 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 141 } |
| 142 } |
| 143 |
| 144 TEST_F(FallbackDesktopCapturerWrapperTest, BothFailed) { |
| 145 wrapper()->CaptureFrame(); |
| 146 main_capturer()->set_result(DesktopCapturer::Result::ERROR_PERMANENT); |
| 147 wrapper()->CaptureFrame(); |
| 148 main_capturer()->set_result(DesktopCapturer::Result::SUCCESS); |
| 149 wrapper()->CaptureFrame(); |
| 150 secondary_capturer()->set_result(DesktopCapturer::Result::ERROR_TEMPORARY); |
| 151 wrapper()->CaptureFrame(); |
| 152 secondary_capturer()->set_result(DesktopCapturer::Result::ERROR_PERMANENT); |
| 153 wrapper()->CaptureFrame(); |
| 154 wrapper()->CaptureFrame(); |
| 155 |
| 156 ASSERT_EQ(main_capturer()->num_capture_attempts(), 2); |
| 157 ASSERT_EQ(main_capturer()->num_frames_captured(), 1); |
| 158 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 5); |
| 159 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 2); |
| 160 ASSERT_EQ(results().size(), 6U); |
| 161 for (int i = 0; i < 3; i++) { |
| 162 ASSERT_EQ(results()[i], |
| 163 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); |
| 164 } |
| 165 ASSERT_EQ(results()[3], |
| 166 std::make_pair(DesktopCapturer::Result::ERROR_TEMPORARY, false)); |
| 167 ASSERT_EQ(results()[4], |
| 168 std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false)); |
| 169 ASSERT_EQ(results()[5], |
| 170 std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false)); |
| 171 } |
| 172 |
| 173 } // namespace webrtc |
| OLD | NEW |