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

Side by Side Diff: services/ui/surfaces/display_compositor_unittest.cc

Issue 2520513002: Add DisplayCompositorTest. (Closed)
Patch Set: Created 4 years, 1 month 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 // Copyright 2016 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 <inttypes.h>
6
7 #include <string>
8 #include <utility>
9
10 #include "base/logging.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/message_loop/message_loop.h"
13 #include "base/strings/stringprintf.h"
14 #include "base/test/test_mock_time_task_runner.h"
15 #include "cc/ipc/display_compositor.mojom.h"
16 #include "cc/surfaces/surface_id.h"
17 #include "cc/surfaces/surface_observer.h"
18 #include "mojo/public/cpp/bindings/binding.h"
19 #include "mojo/public/cpp/bindings/interface_request.h"
20 #include "services/ui/surfaces/display_compositor.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22 #include "ui/gfx/geometry/size.h"
23
24 using cc::SurfaceId;
25
26 namespace ui {
27 namespace test {
28 namespace {
29
30 std::string SurfaceIdString(const cc::SurfaceId& surface_id) {
31 return base::StringPrintf("%u:%u:%u", surface_id.frame_sink_id().client_id(),
32 surface_id.frame_sink_id().sink_id(),
33 surface_id.local_frame_id().local_id());
34 }
35
36 SurfaceId MakeSurfaceId(uint32_t client_id,
37 uint32_t sink_id,
38 uint32_t local_id) {
39 return SurfaceId(
40 cc::FrameSinkId(client_id, sink_id),
41 cc::LocalFrameId(local_id, base::UnguessableToken::Create()));
42 }
43
44 // Test mojom::DisplayCompositorClient that logs OnSurfaceCreated() events.
45 class TestDisplayCompositorClient : public cc::mojom::DisplayCompositorClient {
46 public:
47 TestDisplayCompositorClient() : binding_(this) {}
48 ~TestDisplayCompositorClient() override {}
49
50 cc::mojom::DisplayCompositorClientPtr GetPtr() {
51 return binding_.CreateInterfacePtrAndBind();
52 }
53
54 std::string events() {
55 std::string value = std::move(events_);
56 events_.clear();
57 return value;
58 }
59
60 private:
61 void AddEvent(const std::string& text) {
62 if (!events_.empty())
63 events_ += ";";
64 events_ += text;
65 }
66
67 // cc::mojom::DisplayCompositorClient:
68 void OnSurfaceCreated(const cc::SurfaceId& surface_id,
69 const gfx::Size& frame_size,
70 float device_scale_factor) override {
71 AddEvent(base::StringPrintf("OnSurfaceCreated(%s)",
72 SurfaceIdString(surface_id).c_str()));
73 }
74
75 mojo::Binding<cc::mojom::DisplayCompositorClient> binding_;
76 std::string events_;
77
78 DISALLOW_COPY_AND_ASSIGN(TestDisplayCompositorClient);
79 };
80
81 // Test SurfaceReferenceManager that logs AddSurfaceReference() and
82 // RemoveSurfaceReference() events.
83 class TestSurfaceReferenceManager : public cc::SurfaceReferenceManager {
84 public:
85 ~TestSurfaceReferenceManager() override {}
86
87 const SurfaceId& GetRootSurfaceId() const override { return root_id_; }
88
89 void AddSurfaceReference(const SurfaceId& parent_id,
90 const SurfaceId& child_id) override {
91 AddEvent(base::StringPrintf("Add(%s-%s)",
92 SurfaceIdString(parent_id).c_str(),
93 SurfaceIdString(child_id).c_str()));
94 }
95
96 void RemoveSurfaceReference(const SurfaceId& parent_id,
97 const SurfaceId& child_id) override {
98 AddEvent(base::StringPrintf("Remove(%s-%s)",
99 SurfaceIdString(parent_id).c_str(),
100 SurfaceIdString(child_id).c_str()));
101 }
102
103 size_t GetSurfaceReferenceCount(const SurfaceId& surface_id) const override {
104 NOTREACHED();
105 return 0;
106 }
107
108 size_t GetReferencedSurfaceCount(const SurfaceId& surface_id) const override {
109 NOTREACHED();
110 return 0;
111 }
112
113 std::string events() {
114 std::string value = std::move(events_);
115 events_.clear();
116 return value;
117 }
118
119 private:
120 void AddEvent(const std::string& text) {
121 if (!events_.empty())
122 events_ += ";";
123 events_ += text;
124 }
125
126 const SurfaceId root_id_ = MakeSurfaceId(0, 0, 0);
127 std::string events_;
128 };
129
130 } // namespace
131
132 class DisplayCompositorTest : public testing::Test {
133 public:
134 DisplayCompositorTest() {}
135 ~DisplayCompositorTest() override {}
136
137 cc::SurfaceObserver* surface_observer() { return display_compositor_.get(); }
138
139 void RunUntilIdle() { task_runner_->RunUntilIdle(); }
140
141 size_t CountTempReferences() {
142 size_t size = 0;
143 for (auto& map_entry : display_compositor_->temp_references_) {
144 size += map_entry.second.size();
145 }
146 return size;
147 }
148
149 // testing::Test:
150 void SetUp() override {
151 task_runner_ = make_scoped_refptr(new base::TestMockTimeTaskRunner(
152 base::Time::Now(), base::TimeTicks::Now()));
153 message_loop_.SetTaskRunner(task_runner_);
154 display_compositor_ = new DisplayCompositor(client_.GetPtr());
155 display_compositor_->set_reference_manager_for_testing(&reference_manager_);
156 }
157
158 protected:
159 base::MessageLoop message_loop_;
160 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
161
162 TestDisplayCompositorClient client_;
163 TestSurfaceReferenceManager reference_manager_;
164 scoped_refptr<DisplayCompositor> display_compositor_;
165 };
166
167 TEST_F(DisplayCompositorTest, AddSurface) {
168 const SurfaceId surface_id = MakeSurfaceId(1, 1, 1);
169 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
170 RunUntilIdle();
171
172 // Client should get OnSurfaceCreated call and temporary reference added.
173 EXPECT_EQ("OnSurfaceCreated(1:1:1)", client_.events());
174 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events());
175 EXPECT_EQ(1u, CountTempReferences());
176
177 const SurfaceId parent_id = MakeSurfaceId(2, 1, 1);
178 display_compositor_->AddSurfaceReference(parent_id, surface_id);
179 RunUntilIdle();
180
181 // Real reference is added then temporary reference removed.
182 EXPECT_EQ("Add(2:1:1-1:1:1);Remove(0:0:0-1:1:1)",
183 reference_manager_.events());
184 EXPECT_EQ(0u, CountTempReferences());
185 }
186
187 TEST_F(DisplayCompositorTest, AddRootReference) {
188 const SurfaceId surface_id = MakeSurfaceId(1, 1, 1);
189 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
190 RunUntilIdle();
191
192 // Temporary reference should be added.
193 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events());
194 EXPECT_EQ(1u, CountTempReferences());
195
196 display_compositor_->AddRootSurfaceReference(surface_id);
197 RunUntilIdle();
198
199 // Adding real reference doesn't need to change anything in
200 // SurfaceReferenceManager does remove the temporary reference marker.
201 EXPECT_EQ("", reference_manager_.events());
202 EXPECT_EQ(0u, CountTempReferences());
203 }
204
205 TEST_F(DisplayCompositorTest, SkipReference) {
206 const SurfaceId surface_id1 = MakeSurfaceId(1, 1, 1);
207 const SurfaceId surface_id2 = MakeSurfaceId(1, 1, 2);
208
209 // Add two surfaces that have the same FrameSinkId. This would happen when a
210 // client submits two CFs in quick succession.
211 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f);
212 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f);
213 RunUntilIdle();
214
215 // Client should get OnSurfaceCreated call and temporary reference added for
216 // both surfaces.
217 EXPECT_EQ("OnSurfaceCreated(1:1:1);OnSurfaceCreated(1:1:2)",
218 client_.events());
219 EXPECT_EQ("Add(0:0:0-1:1:1);Add(0:0:0-1:1:2)", reference_manager_.events());
220 EXPECT_EQ(2u, CountTempReferences());
221
222 // Add a reference to the surface with the later LocalFrameId. We will remove
223 // the temporary reference to the skipped surface too.
224 const SurfaceId parent_id = MakeSurfaceId(2, 1, 1);
225 display_compositor_->AddSurfaceReference(parent_id, surface_id2);
226 RunUntilIdle();
227
228 // Adding real reference doesn't need to change anything in
229 // SurfaceReferenceManager does remove the temporary reference marker.
230 EXPECT_EQ("Add(2:1:1-1:1:2);Remove(0:0:0-1:1:2);Remove(0:0:0-1:1:1)",
231 reference_manager_.events());
232 EXPECT_EQ(0u, CountTempReferences());
233 }
234
235 } // namespace test
236 } // namespace ui
OLDNEW
« services/ui/surfaces/display_compositor.h ('K') | « services/ui/surfaces/display_compositor.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698