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

Side by Side Diff: services/ui/ws/frame_generator_unittest.cc

Issue 2755573002: Add FrameGenerator Unit Tests (Closed)
Patch Set: Changed OnCreation test to OnSurfaceCreated Created 3 years, 9 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
« no previous file with comments | « services/ui/ws/display_client_compositor_frame_sink.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "services/ui/ws/frame_generator.h"
6
7 #include "base/macros.h"
8 #include "cc/output/compositor_frame_sink.h"
9 #include "cc/scheduler/begin_frame_source.h"
10 #include "cc/test/begin_frame_args_test.cc"
11 #include "cc/test/fake_external_begin_frame_source.h"
12 #include "services/ui/ws/frame_generator_delegate.h"
13 #include "services/ui/ws/server_window.h"
14 #include "services/ui/ws/server_window_delegate.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace ui {
18 namespace ws {
19 namespace test {
20
21 class TestFrameGeneratorDelegate : public FrameGeneratorDelegate {
22 public:
23 TestFrameGeneratorDelegate() {}
24 ~TestFrameGeneratorDelegate() override {}
25
26 // FrameGeneratorDelegate implementation:
27 bool IsInHighContrastMode() override { return false; }
28 };
29
30 class TestServerWindowDelegate : public ServerWindowDelegate {
31 public:
32 TestServerWindowDelegate() {}
33 ~TestServerWindowDelegate() override {}
34
35 // ServerWindowDelegate implementation:
36 cc::mojom::DisplayCompositor* GetDisplayCompositor() override {
37 return nullptr;
38 }
39
40 ServerWindow* GetRootWindow(const ServerWindow* window) override {
41 return nullptr;
42 }
43 };
44
45 // FakeCompositorFrameSink observes a FakeExternalBeginFrameSource and receives
46 // CompositorFrame from a FrameGenerator.
47 class FakeCompositorFrameSink : public cc::CompositorFrameSink,
48 public cc::BeginFrameObserver,
49 public cc::ExternalBeginFrameSourceClient {
50 public:
51 FakeCompositorFrameSink()
52 : cc::CompositorFrameSink(nullptr, nullptr, nullptr, nullptr) {}
53
54 // cc::CompositorFrameSink implementation:
55 bool BindToClient(cc::CompositorFrameSinkClient* client) override {
56 if (!cc::CompositorFrameSink::BindToClient(client))
57 return false;
58
59 begin_frame_source_ = base::MakeUnique<cc::ExternalBeginFrameSource>(this);
60 client_->SetBeginFrameSource(begin_frame_source_.get());
61 return true;
62 }
63
64 void DetachFromClient() override {
65 cc::CompositorFrameSink::DetachFromClient();
66 }
67
68 void SubmitCompositorFrame(cc::CompositorFrame frame) override {
69 ++number_frames_received_;
70 last_frame_ = std::move(frame);
71 }
72
73 // cc::BeginFrameObserver implementation.
74 void OnBeginFrame(const cc::BeginFrameArgs& args) override {
75 begin_frame_source_->OnBeginFrame(args);
76 last_begin_frame_args_ = args;
77 }
78
79 const cc::BeginFrameArgs& LastUsedBeginFrameArgs() const override {
80 return last_begin_frame_args_;
81 }
82
83 void OnBeginFrameSourcePausedChanged(bool paused) override {}
84
85 // cc::ExternalBeginFrameSourceClient implementation:
86 void OnNeedsBeginFrames(bool needs_begin_frames) override {}
87
88 void OnDidFinishFrame(const cc::BeginFrameAck& ack) override {}
89
90 const cc::CompositorFrame& last_frame() { return last_frame_; }
91
92 int number_frames_received() { return number_frames_received_; }
93
94 private:
95 int number_frames_received_ = 0;
96 std::unique_ptr<cc::ExternalBeginFrameSource> begin_frame_source_;
97 cc::BeginFrameArgs last_begin_frame_args_;
98 cc::CompositorFrame last_frame_;
99 };
100
101 class FrameGeneratorTest : public testing::Test {
102 public:
103 FrameGeneratorTest() {}
104 ~FrameGeneratorTest() override {}
105
106 // testing::Test overrides:
107 void SetUp() override {
108 testing::Test::SetUp();
109
110 std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink =
111 base::MakeUnique<FakeCompositorFrameSink>();
112 compositor_frame_sink_ = compositor_frame_sink.get();
113
114 constexpr float kRefreshRate = 0.f;
115 constexpr bool kTickAutomatically = false;
116 begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>(
117 kRefreshRate, kTickAutomatically);
118 begin_frame_source_->AddObserver(compositor_frame_sink_);
119 delegate_ = base::MakeUnique<TestFrameGeneratorDelegate>();
120 server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>();
121 root_window_ = base::MakeUnique<ServerWindow>(server_window_delegate_.get(),
122 WindowId());
123 root_window_->SetVisible(true);
124 frame_generator_ = base::MakeUnique<FrameGenerator>(
125 delegate_.get(), root_window_.get(), std::move(compositor_frame_sink));
126 };
127
128 int NumberOfFramesRecieved() {
129 return compositor_frame_sink_->number_frames_received();
130 }
131
132 void IssueBeginFrame(const cc::BeginFrameArgs& args) {
133 begin_frame_source_->TestOnBeginFrame(args);
134 }
135
136 FrameGenerator* frame_generator() { return frame_generator_.get(); }
137
138 const cc::SurfaceId& id_last_frame() {
Fady Samuel 2017/03/15 20:44:58 Make this a bit more generic. ReferencedSurfaces(
Alex Z. 2017/03/17 13:50:43 Done.
139 return compositor_frame_sink_->last_frame()
140 .metadata.referenced_surfaces.front();
141 }
142
143 private:
144 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr;
145 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_;
146 std::unique_ptr<TestFrameGeneratorDelegate> delegate_;
147 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_;
148 std::unique_ptr<ServerWindow> root_window_;
149 std::unique_ptr<FrameGenerator> frame_generator_;
150
151 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest);
152 };
153
154 TEST_F(FrameGeneratorTest, OnSurfaceCreated) {
155 DCHECK_EQ(0, NumberOfFramesRecieved());
156
157 // FrameGenerator does not request BeginFrames upon creation.
158 cc::BeginFrameArgs args =
159 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
160 IssueBeginFrame(args);
161 EXPECT_EQ(0, NumberOfFramesRecieved());
162
163 const cc::SurfaceId kArbitrarySurfaceId(
164 cc::FrameSinkId(1, 1),
165 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
166 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
167 gfx::Size(100, 100));
168 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
169 IssueBeginFrame(args);
170 EXPECT_EQ(1, NumberOfFramesRecieved());
171
172 // Verify that the CompositorFrame refers to the window manager's surface via
173 // referenced_surfaces.
174 cc::SurfaceId id = id_last_frame();
175 EXPECT_EQ(kArbitrarySurfaceId, id);
Fady Samuel 2017/03/15 20:44:58 Make this a bit more generic?
Alex Z. 2017/03/17 13:50:43 Done.
176 }
177
178 // TODO(staraz): Add OnSurfaceCreated test and SetDeviceScaleFactor test.
Fady Samuel 2017/03/15 20:44:58 A test for SetDeviceScaleFactor should be fairly s
Alex Z. 2017/03/17 13:50:43 Done.
179
180 } // namespace test
181 } // namespace ws
182 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/display_client_compositor_frame_sink.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698