Chromium Code Reviews| 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> | |
|
Sergey Ulanov
2017/02/16 19:14:18
map<> is not used in this file
Hzj_jie
2017/02/16 21:31:28
Done.
| |
| 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 class FakeSharedMemory : public SharedMemory { | |
| 35 public: | |
| 36 explicit FakeSharedMemory(size_t size); | |
| 37 ~FakeSharedMemory() override = default; | |
| 38 | |
| 39 private: | |
| 40 static int kId; | |
|
Sergey Ulanov
2017/02/16 19:14:18
nit: Does this need to be a class member?
Hzj_jie
2017/02/16 21:31:28
Otherwise I need to add a long prefix to indicate
Sergey Ulanov
2017/02/17 20:16:23
Doesn't really matter much, but most other consts
Hzj_jie
2017/02/17 21:55:18
Done.
| |
| 41 }; | |
| 42 | |
| 43 // static | |
| 44 int FakeSharedMemory::kId = 0; | |
| 45 | |
| 46 FakeSharedMemory::FakeSharedMemory(size_t size) | |
| 47 : SharedMemory(nullptr, size, 0, kId++) {} | |
| 48 | |
| 49 class FakeSharedMemoryFactory : public SharedMemoryFactory { | |
| 50 public: | |
| 51 FakeSharedMemoryFactory() = default; | |
| 52 ~FakeSharedMemoryFactory() override = default; | |
| 53 | |
| 54 std::unique_ptr<SharedMemory> CreateSharedMemory(size_t size) override; | |
| 55 }; | |
| 56 | |
| 57 std::unique_ptr<SharedMemory> FakeSharedMemoryFactory::CreateSharedMemory( | |
| 58 size_t size) { | |
| 59 return std::unique_ptr<SharedMemory>(new FakeSharedMemory(size)); | |
| 60 } | |
| 61 | |
| 62 } // namespace | |
| 63 | |
| 64 class FallbackDesktopCapturerWrapperTest : public testing::Test, | |
| 65 public DesktopCapturer::Callback { | |
| 66 public: | |
| 67 FallbackDesktopCapturerWrapperTest(); | |
| 68 ~FallbackDesktopCapturerWrapperTest() override = default; | |
| 69 | |
| 70 protected: | |
| 71 FakeDesktopCapturer* main_capturer(); | |
| 72 FakeDesktopCapturer* secondary_capturer(); | |
|
Sergey Ulanov
2017/02/16 19:14:18
Just make the fields protected. Technically it con
Hzj_jie
2017/02/16 21:31:28
Done.
| |
| 73 FallbackDesktopCapturerWrapper* wrapper(); | |
| 74 const std::vector<std::pair<DesktopCapturer::Result, bool>>& results() const; | |
| 75 | |
| 76 private: | |
| 77 // DesktopCapturer::Callback interface | |
| 78 void OnCaptureResult(DesktopCapturer::Result result, | |
| 79 std::unique_ptr<DesktopFrame> frame) override; | |
| 80 | |
| 81 std::vector<std::pair<DesktopCapturer::Result, bool>> results_; | |
| 82 FakeDesktopCapturer* main_capturer_ = nullptr; | |
| 83 FakeDesktopCapturer* secondary_capturer_ = nullptr; | |
| 84 std::unique_ptr<FallbackDesktopCapturerWrapper> wrapper_; | |
| 85 PainterDesktopFrameGenerator frame_generator; | |
| 86 }; | |
| 87 | |
| 88 FallbackDesktopCapturerWrapperTest::FallbackDesktopCapturerWrapperTest() { | |
| 89 frame_generator.size()->set(1024, 768); | |
| 90 std::unique_ptr<DesktopCapturer> main_capturer = | |
| 91 CreateDesktopCapturer(&frame_generator); | |
| 92 std::unique_ptr<DesktopCapturer> secondary_capturer = | |
| 93 CreateDesktopCapturer(&frame_generator); | |
| 94 main_capturer_ = static_cast<FakeDesktopCapturer*>(main_capturer.get()); | |
| 95 secondary_capturer_ = | |
| 96 static_cast<FakeDesktopCapturer*>(secondary_capturer.get()); | |
| 97 wrapper_.reset(new FallbackDesktopCapturerWrapper( | |
| 98 std::move(main_capturer), std::move(secondary_capturer))); | |
| 99 wrapper_->Start(this); | |
| 100 } | |
| 101 | |
| 102 FakeDesktopCapturer* FallbackDesktopCapturerWrapperTest::main_capturer() { | |
| 103 return main_capturer_; | |
| 104 } | |
| 105 | |
| 106 FakeDesktopCapturer* FallbackDesktopCapturerWrapperTest::secondary_capturer() { | |
| 107 return secondary_capturer_; | |
| 108 } | |
| 109 | |
| 110 FallbackDesktopCapturerWrapper* FallbackDesktopCapturerWrapperTest::wrapper() { | |
| 111 return wrapper_.get(); | |
| 112 } | |
| 113 | |
| 114 const std::vector<std::pair<DesktopCapturer::Result, bool>>& | |
| 115 FallbackDesktopCapturerWrapperTest::results() const { | |
| 116 return results_; | |
| 117 } | |
| 118 | |
| 119 void FallbackDesktopCapturerWrapperTest::OnCaptureResult( | |
| 120 DesktopCapturer::Result result, | |
| 121 std::unique_ptr<DesktopFrame> frame) { | |
| 122 results_.emplace_back(result, !!frame); | |
| 123 } | |
| 124 | |
| 125 TEST_F(FallbackDesktopCapturerWrapperTest, MainNeverFailed) { | |
| 126 wrapper()->CaptureFrame(); | |
| 127 ASSERT_EQ(main_capturer()->num_capture_attempts(), 1); | |
| 128 ASSERT_EQ(main_capturer()->num_frames_captured(), 1); | |
| 129 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 0); | |
| 130 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 0); | |
| 131 ASSERT_EQ(results().size(), 1U); | |
| 132 ASSERT_EQ(results()[0], | |
| 133 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); | |
| 134 } | |
| 135 | |
| 136 TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedTemporarily) { | |
| 137 wrapper()->CaptureFrame(); | |
| 138 main_capturer()->set_result(DesktopCapturer::Result::ERROR_TEMPORARY); | |
| 139 wrapper()->CaptureFrame(); | |
| 140 main_capturer()->set_result(DesktopCapturer::Result::SUCCESS); | |
| 141 wrapper()->CaptureFrame(); | |
| 142 | |
| 143 ASSERT_EQ(main_capturer()->num_capture_attempts(), 3); | |
| 144 ASSERT_EQ(main_capturer()->num_frames_captured(), 2); | |
| 145 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 1); | |
| 146 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 1); | |
| 147 ASSERT_EQ(results().size(), 3U); | |
| 148 for (int i = 0; i < 3; i++) { | |
| 149 ASSERT_EQ(results()[i], | |
| 150 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); | |
| 151 } | |
| 152 } | |
| 153 | |
| 154 TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedPermanently) { | |
| 155 wrapper()->CaptureFrame(); | |
| 156 main_capturer()->set_result(DesktopCapturer::Result::ERROR_PERMANENT); | |
| 157 wrapper()->CaptureFrame(); | |
| 158 main_capturer()->set_result(DesktopCapturer::Result::SUCCESS); | |
| 159 wrapper()->CaptureFrame(); | |
| 160 | |
| 161 ASSERT_EQ(main_capturer()->num_capture_attempts(), 2); | |
| 162 ASSERT_EQ(main_capturer()->num_frames_captured(), 1); | |
| 163 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 2); | |
| 164 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 2); | |
| 165 ASSERT_EQ(results().size(), 3U); | |
| 166 for (int i = 0; i < 3; i++) { | |
| 167 ASSERT_EQ(results()[i], | |
| 168 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); | |
| 169 } | |
| 170 } | |
| 171 | |
| 172 TEST_F(FallbackDesktopCapturerWrapperTest, BothFailed) { | |
| 173 wrapper()->CaptureFrame(); | |
| 174 main_capturer()->set_result(DesktopCapturer::Result::ERROR_PERMANENT); | |
| 175 wrapper()->CaptureFrame(); | |
| 176 main_capturer()->set_result(DesktopCapturer::Result::SUCCESS); | |
| 177 wrapper()->CaptureFrame(); | |
| 178 secondary_capturer()->set_result(DesktopCapturer::Result::ERROR_TEMPORARY); | |
| 179 wrapper()->CaptureFrame(); | |
| 180 secondary_capturer()->set_result(DesktopCapturer::Result::ERROR_PERMANENT); | |
| 181 wrapper()->CaptureFrame(); | |
| 182 wrapper()->CaptureFrame(); | |
| 183 | |
| 184 ASSERT_EQ(main_capturer()->num_capture_attempts(), 2); | |
| 185 ASSERT_EQ(main_capturer()->num_frames_captured(), 1); | |
| 186 ASSERT_EQ(secondary_capturer()->num_capture_attempts(), 5); | |
| 187 ASSERT_EQ(secondary_capturer()->num_frames_captured(), 2); | |
| 188 ASSERT_EQ(results().size(), 6U); | |
| 189 for (int i = 0; i < 3; i++) { | |
| 190 ASSERT_EQ(results()[i], | |
| 191 std::make_pair(DesktopCapturer::Result::SUCCESS, true)); | |
| 192 } | |
| 193 ASSERT_EQ(results()[3], | |
| 194 std::make_pair(DesktopCapturer::Result::ERROR_TEMPORARY, false)); | |
| 195 ASSERT_EQ(results()[4], | |
| 196 std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false)); | |
| 197 ASSERT_EQ(results()[5], | |
| 198 std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false)); | |
| 199 } | |
| 200 | |
| 201 TEST(SharedMemoryFactoryWrapperTest, CreateShared) { | |
| 202 FallbackDesktopCapturerWrapper::SharedMemoryFactoryWrapper factory( | |
| 203 std::unique_ptr<SharedMemoryFactory>(new FakeSharedMemoryFactory())); | |
| 204 std::unique_ptr<SharedMemory> shared_memory = factory.CreateSharedMemory(0); | |
| 205 ASSERT_TRUE(shared_memory); | |
| 206 ASSERT_EQ(shared_memory->id(), 0); | |
| 207 ASSERT_EQ(shared_memory->size(), 0u); | |
| 208 | |
| 209 std::unique_ptr<SharedMemoryFactory> shared1 = factory.Wrap(); | |
| 210 ASSERT_TRUE(shared1); | |
| 211 shared_memory = shared1->CreateSharedMemory(199); | |
| 212 ASSERT_TRUE(shared_memory); | |
| 213 ASSERT_EQ(shared_memory->id(), 1); | |
| 214 ASSERT_EQ(shared_memory->size(), 199u); | |
| 215 | |
| 216 std::unique_ptr<SharedMemoryFactory> shared2 = factory.Wrap(); | |
| 217 ASSERT_TRUE(shared2); | |
| 218 shared_memory = shared2->CreateSharedMemory(299); | |
| 219 ASSERT_TRUE(shared_memory); | |
| 220 ASSERT_EQ(shared_memory->id(), 2); | |
| 221 ASSERT_EQ(shared_memory->size(), 299u); | |
| 222 | |
| 223 shared_memory = factory.CreateSharedMemory(399); | |
| 224 ASSERT_TRUE(shared_memory); | |
| 225 ASSERT_EQ(shared_memory->id(), 3); | |
| 226 ASSERT_EQ(shared_memory->size(), 399u); | |
| 227 | |
| 228 shared_memory = shared1->CreateSharedMemory(499); | |
| 229 ASSERT_TRUE(shared_memory); | |
| 230 ASSERT_EQ(shared_memory->id(), 4); | |
| 231 ASSERT_EQ(shared_memory->size(), 499u); | |
| 232 | |
| 233 shared_memory = shared2->CreateSharedMemory(599); | |
| 234 ASSERT_TRUE(shared_memory); | |
| 235 ASSERT_EQ(shared_memory->id(), 5); | |
| 236 ASSERT_EQ(shared_memory->size(), 599u); | |
| 237 } | |
| 238 | |
| 239 } // namespace webrtc | |
| OLD | NEW |