Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(298)

Side by Side Diff: webrtc/modules/desktop_capture/fallback_desktop_capturer_wrapper_unittest.cc

Issue 2697453002: [DesktopCapturer] FallbackDesktopCapturerWrapper and its tests (Closed)
Patch Set: Resolve review comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698