Mir

Merge lp:~kdub/mir/testable-surface-tracking into lp:mir

Proposed by Kevin DuBois
Status: Merged
Approved by: Kevin DuBois
Approved revision: no longer in the source branch.
Merged at revision: 1860
Proposed branch: lp:~kdub/mir/testable-surface-tracking
Merge into: lp:mir
Prerequisite: lp:~kdub/mir/more-testable-mediator
Diff against target: 570 lines (+312/-86)
7 files modified
src/server/frontend/CMakeLists.txt (+1/-0)
src/server/frontend/session_mediator.cpp (+10/-18)
src/server/frontend/session_mediator.h (+2/-3)
src/server/frontend/surface_tracker.cpp (+63/-0)
src/server/frontend/surface_tracker.h (+64/-0)
tests/unit-tests/frontend/test_client_buffer_tracker.cpp (+100/-1)
tests/unit-tests/frontend/test_session_mediator.cpp (+72/-64)
To merge this branch: bzr merge lp:~kdub/mir/testable-surface-tracking
Reviewer Review Type Date Requested Status
Daniel van Vugt Abstain
PS Jenkins bot (community) continuous-integration Approve
Alan Griffiths Approve
Review via email: mp+230814@code.launchpad.net

Commit message

frontend: SessionMediator: extract the session tracking of Surface and BufferId's into one place so session mediator is less concerned with it. This makes session mediator a bit more testable.

Description of the change

frontend: SessionMediator: extract the session tracking of Surface and BufferId's into one place so session mediator is less concerned with it. This makes session mediator a bit more testable.

This is a break-out of my tdd-iteration around the exchange_buffer rpc changes. Subsequent branches rely on associating BufferId's and SurfaceId's in a way that was difficult to test with the logic scattered between ClientBufferTracker and SessionMediator. This branch has no ABI change.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

While it makes sense to separate out the tracker logic I'm not sure that it is useful to be able to mock SurfaceTracker.

I'd be inclined to hoist the implementation from SessionSurfaceTracker and avoiding the constructor parameter for SessionMediator by just having a data member.

But I won't block on that as a mockable SurfaceTracker may be what is needed by the follow-up.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

(1) This is an ABI break. We probably don't need the ABI numbers bumped again since they have already for 0.7 but we do need the new header mentioned in *sha1sums:

+++ src/server/frontend/session_mediator.h 2014-08-15 17:55:26 +0000
82 +#include "surface_tracker.h"

Just run: tools/update-all-ABI-sha1sums.sh

review: Needs Fixing
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Whoops, that's a private file. I was wrong.

review: Abstain

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/server/frontend/CMakeLists.txt'
--- src/server/frontend/CMakeLists.txt 2014-08-06 12:22:34 +0000
+++ src/server/frontend/CMakeLists.txt 2014-08-15 17:55:26 +0000
@@ -16,6 +16,7 @@
16 socket_messenger.cpp16 socket_messenger.cpp
17 event_sender.cpp17 event_sender.cpp
18 surface.cpp18 surface.cpp
19 surface_tracker.cpp
19 unauthorized_display_changer.cpp20 unauthorized_display_changer.cpp
20 unauthorized_screencast.cpp21 unauthorized_screencast.cpp
21 session_credentials.cpp22 session_credentials.cpp
2223
=== modified file 'src/server/frontend/session_mediator.cpp'
--- src/server/frontend/session_mediator.cpp 2014-08-14 08:18:45 +0000
+++ src/server/frontend/session_mediator.cpp 2014-08-15 17:55:26 +0000
@@ -45,6 +45,7 @@
45#include "mir/fd.h"45#include "mir/fd.h"
4646
47#include "mir/geometry/rectangles.h"47#include "mir/geometry/rectangles.h"
48#include "surface_tracker.h"
48#include "client_buffer_tracker.h"49#include "client_buffer_tracker.h"
49#include "protobuf_buffer_packer.h"50#include "protobuf_buffer_packer.h"
5051
@@ -83,7 +84,8 @@
83 resource_cache(resource_cache),84 resource_cache(resource_cache),
84 screencast(screencast),85 screencast(screencast),
85 connection_context(connection_context),86 connection_context(connection_context),
86 cursor_images(cursor_images)87 cursor_images(cursor_images),
88 surface_tracker{static_cast<size_t>(client_buffer_cache_size)}
87{89{
88}90}
8991
@@ -142,24 +144,14 @@
142 Surface& surface,144 Surface& surface,
143 std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete)145 std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete)
144{146{
145 auto& tracker = client_buffer_tracker[surf_id];147 surface.swap_buffers(
146 if (!tracker) tracker = std::make_shared<ClientBufferTracker>(client_buffer_cache_size);148 surface_tracker.last_buffer(surf_id),
147149 [this, surf_id, complete](mg::Buffer* new_buffer)
148 auto& client_buffer = client_buffer_resource[surf_id];
149 surface.swap_buffers(client_buffer,
150 [&tracker, &client_buffer, complete](mg::Buffer* new_buffer)
151 {150 {
152151 if (surface_tracker.track_buffer(surf_id, new_buffer))
153 client_buffer = new_buffer;152 complete(new_buffer, mg::BufferIpcMsgType::update_msg);
154 auto id = client_buffer->id();
155 auto need_full_ipc = !tracker->client_has(id);
156
157 tracker->add(id);
158
159 if (need_full_ipc)
160 complete(client_buffer, mg::BufferIpcMsgType::full_msg);
161 else153 else
162 complete(client_buffer, mg::BufferIpcMsgType::update_msg);154 complete(new_buffer, mg::BufferIpcMsgType::full_msg);
163 });155 });
164}156}
165157
@@ -275,7 +267,7 @@
275 auto const id = SurfaceId(request->value());267 auto const id = SurfaceId(request->value());
276268
277 session->destroy_surface(id);269 session->destroy_surface(id);
278 client_buffer_tracker.erase(id);270 surface_tracker.remove_surface(id);
279 }271 }
280272
281 // TODO: We rely on this sending responses synchronously.273 // TODO: We rely on this sending responses synchronously.
282274
=== modified file 'src/server/frontend/session_mediator.h'
--- src/server/frontend/session_mediator.h 2014-07-30 15:25:54 +0000
+++ src/server/frontend/session_mediator.h 2014-08-15 17:55:26 +0000
@@ -24,9 +24,9 @@
24#include "mir/frontend/surface_id.h"24#include "mir/frontend/surface_id.h"
25#include "mir/graphics/platform.h"25#include "mir/graphics/platform.h"
26#include "mir_toolkit/common.h"26#include "mir_toolkit/common.h"
27#include "surface_tracker.h"
2728
28#include <functional>29#include <functional>
29#include <unordered_map>
30#include <memory>30#include <memory>
31#include <mutex>31#include <mutex>
32#include <vector>32#include <vector>
@@ -186,8 +186,7 @@
186 ConnectionContext const connection_context;186 ConnectionContext const connection_context;
187 std::shared_ptr<input::CursorImages> const cursor_images;187 std::shared_ptr<input::CursorImages> const cursor_images;
188188
189 std::unordered_map<SurfaceId,graphics::Buffer*> client_buffer_resource;189 SurfaceTracker surface_tracker;
190 std::unordered_map<SurfaceId, std::shared_ptr<ClientBufferTracker>> client_buffer_tracker;
191190
192 std::mutex session_mutex;191 std::mutex session_mutex;
193 std::weak_ptr<Session> weak_session;192 std::weak_ptr<Session> weak_session;
194193
=== added file 'src/server/frontend/surface_tracker.cpp'
--- src/server/frontend/surface_tracker.cpp 1970-01-01 00:00:00 +0000
+++ src/server/frontend/surface_tracker.cpp 2014-08-15 17:55:26 +0000
@@ -0,0 +1,63 @@
1/*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Kevin DuBois <kevin.dubois@canonical.com>
17 */
18
19#include "surface_tracker.h"
20#include "mir/graphics/buffer.h"
21#include "mir/graphics/buffer_id.h"
22
23namespace mf = mir::frontend;
24namespace mg = mir::graphics;
25
26mf::SurfaceTracker::SurfaceTracker(size_t client_cache_size) :
27 client_cache_size{client_cache_size}
28{
29}
30
31bool mf::SurfaceTracker::track_buffer(SurfaceId surface_id, mg::Buffer* buffer)
32{
33 auto& tracker = client_buffer_tracker[surface_id];
34 if (!tracker)
35 tracker = std::make_shared<ClientBufferTracker>(client_cache_size);
36
37 auto already_tracked = tracker->client_has(buffer->id());
38 tracker->add(buffer->id());
39
40 client_buffer_resource[surface_id] = buffer;
41 return already_tracked;
42}
43
44void mf::SurfaceTracker::remove_surface(SurfaceId surface_id)
45{
46 auto it = client_buffer_tracker.find(surface_id);
47 if (it != client_buffer_tracker.end())
48 client_buffer_tracker.erase(it);
49
50 auto last_buffer_it = client_buffer_resource.find(surface_id);
51 if (last_buffer_it != client_buffer_resource.end())
52 client_buffer_resource.erase(last_buffer_it);
53}
54
55mg::Buffer* mf::SurfaceTracker::last_buffer(SurfaceId surface_id) const
56{
57 auto it = client_buffer_resource.find(surface_id);
58 if (it != client_buffer_resource.end())
59 return it->second;
60 else
61 //should really throw, but that is difficult with the way the code currently works
62 return nullptr;
63}
064
=== added file 'src/server/frontend/surface_tracker.h'
--- src/server/frontend/surface_tracker.h 1970-01-01 00:00:00 +0000
+++ src/server/frontend/surface_tracker.h 2014-08-15 17:55:26 +0000
@@ -0,0 +1,64 @@
1/*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Kevin DuBois <kevin.dubois@canonical.com>
17 */
18
19#ifndef MIR_FRONTEND_SURFACE_TRACKER_H_
20#define MIR_FRONTEND_SURFACE_TRACKER_H_
21
22#include "mir/frontend/surface_id.h"
23#include "client_buffer_tracker.h"
24#include <unordered_map>
25#include <memory>
26
27namespace mir
28{
29namespace graphics
30{
31class Buffer;
32}
33namespace frontend
34{
35
36class SurfaceTracker
37{
38public:
39 SurfaceTracker(size_t client_cache_size);
40 SurfaceTracker(SurfaceTracker const&) = delete;
41 SurfaceTracker& operator=(SurfaceTracker const&) = delete;
42
43 /* track a buffer as associated with a surface
44 * \param surface_id id that the the buffer is associated with
45 * \param buffer buffer to be tracked (TODO: should be a shared_ptr)
46 * \returns true if the buffer is already tracked
47 * false if the buffer is not tracked
48 */
49 bool track_buffer(SurfaceId, graphics::Buffer*);
50 /* removes the surface id from all tracking */
51 void remove_surface(SurfaceId);
52 /* accesses the last buffer given to track_buffer() for the given SurfaceId */
53 graphics::Buffer* last_buffer(SurfaceId) const;
54private:
55 size_t const client_cache_size;
56
57 std::unordered_map<SurfaceId, graphics::Buffer*> client_buffer_resource;
58 std::unordered_map<SurfaceId, std::shared_ptr<ClientBufferTracker>> client_buffer_tracker;
59};
60
61}
62}
63
64#endif // MIR_FRONTEND_SURFACE_TRACKER_H_
065
=== modified file 'tests/unit-tests/frontend/test_client_buffer_tracker.cpp'
--- tests/unit-tests/frontend/test_client_buffer_tracker.cpp 2013-08-28 03:41:48 +0000
+++ tests/unit-tests/frontend/test_client_buffer_tracker.cpp 2014-08-15 17:55:26 +0000
@@ -16,11 +16,14 @@
16 * Authored by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>16 * Authored by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
17 */17 */
1818
19#include "../../src/server/frontend/client_buffer_tracker.h"19#include "src/server/frontend/client_buffer_tracker.h"
20#include "src/server/frontend/surface_tracker.h"
20#include "mir/graphics/buffer_id.h"21#include "mir/graphics/buffer_id.h"
22#include "mir_test_doubles/stub_buffer.h"
2123
22#include <gtest/gtest.h>24#include <gtest/gtest.h>
2325
26namespace mtd = mir::test::doubles;
24namespace mf = mir::frontend;27namespace mf = mir::frontend;
25namespace mg = mir::graphics;28namespace mg = mir::graphics;
2629
@@ -106,3 +109,99 @@
106 EXPECT_TRUE(tracker.client_has(ids[i]));109 EXPECT_TRUE(tracker.client_has(ids[i]));
107 }110 }
108}111}
112
113struct SurfaceTracker : public testing::Test
114{
115 mtd::StubBuffer stub_buffer0;
116 mtd::StubBuffer stub_buffer1;
117 mtd::StubBuffer stub_buffer2;
118 mtd::StubBuffer stub_buffer3;
119 mf::SurfaceId surf_id0{0};
120 mf::SurfaceId surf_id1{1};
121 size_t const client_cache_size{3};
122};
123
124TEST_F(SurfaceTracker, only_returns_true_if_buffer_already_tracked)
125{
126 mf::SurfaceTracker tracker{client_cache_size};
127
128 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer0));
129 EXPECT_TRUE(tracker.track_buffer(surf_id0, &stub_buffer0));
130
131 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer1));
132 EXPECT_FALSE(tracker.track_buffer(surf_id1, &stub_buffer0));
133 EXPECT_FALSE(tracker.track_buffer(surf_id1, &stub_buffer1));
134}
135
136TEST_F(SurfaceTracker, removals_remove_buffer_instances)
137{
138 mf::SurfaceTracker tracker{client_cache_size};
139 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer0));
140 EXPECT_FALSE(tracker.track_buffer(surf_id1, &stub_buffer0));
141
142 EXPECT_TRUE(tracker.track_buffer(surf_id0, &stub_buffer0));
143 EXPECT_TRUE(tracker.track_buffer(surf_id1, &stub_buffer0));
144 EXPECT_EQ(&stub_buffer0, tracker.last_buffer(surf_id0));
145
146 tracker.remove_surface(surf_id0);
147 EXPECT_EQ(nullptr, tracker.last_buffer(surf_id0));
148
149 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer0));
150 EXPECT_TRUE(tracker.track_buffer(surf_id1, &stub_buffer0));
151
152 tracker.remove_surface(mf::SurfaceId{33});
153}
154
155TEST_F(SurfaceTracker, last_client_buffer)
156{
157 mf::SurfaceTracker tracker{client_cache_size};
158
159 tracker.track_buffer(surf_id0, &stub_buffer0);
160 EXPECT_EQ(&stub_buffer0, tracker.last_buffer(surf_id0));
161 tracker.track_buffer(surf_id0, &stub_buffer1);
162 EXPECT_EQ(&stub_buffer1, tracker.last_buffer(surf_id0));
163
164 EXPECT_EQ(nullptr, tracker.last_buffer(surf_id1));
165
166 tracker.track_buffer(surf_id1, &stub_buffer0);
167 EXPECT_EQ(&stub_buffer0, tracker.last_buffer(surf_id1));
168}
169
170TEST_F(SurfaceTracker, buffers_expire_if_they_overrun_cache_size)
171{
172 mf::SurfaceTracker tracker{client_cache_size};
173
174 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer0));
175 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer1));
176 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer2));
177 //stub_buffer0 forced out
178 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer3));
179 //tracker reports its never seen stub_buffer0
180 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer0));
181 EXPECT_TRUE(tracker.track_buffer(surf_id0, &stub_buffer3));
182
183 EXPECT_EQ(&stub_buffer3, tracker.last_buffer(surf_id0));
184
185 EXPECT_TRUE(tracker.track_buffer(surf_id0, &stub_buffer3));
186 EXPECT_TRUE(tracker.track_buffer(surf_id0, &stub_buffer0));
187 EXPECT_TRUE(tracker.track_buffer(surf_id0, &stub_buffer2));
188 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer1));
189}
190
191TEST_F(SurfaceTracker, buffers_only_affect_associated_surfaces)
192{
193 mf::SurfaceTracker tracker{client_cache_size};
194
195 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer0));
196 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer1));
197 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer2));
198 EXPECT_EQ(&stub_buffer2, tracker.last_buffer(surf_id0));
199
200 EXPECT_FALSE(tracker.track_buffer(surf_id1, &stub_buffer0));
201 EXPECT_EQ(&stub_buffer2, tracker.last_buffer(surf_id0));
202 EXPECT_EQ(&stub_buffer0, tracker.last_buffer(surf_id1));
203
204 EXPECT_FALSE(tracker.track_buffer(surf_id0, &stub_buffer3));
205 EXPECT_EQ(&stub_buffer3, tracker.last_buffer(surf_id0));
206 EXPECT_EQ(&stub_buffer0, tracker.last_buffer(surf_id1));
207}
109208
=== modified file 'tests/unit-tests/frontend/test_session_mediator.cpp'
--- tests/unit-tests/frontend/test_session_mediator.cpp 2014-08-15 17:55:26 +0000
+++ tests/unit-tests/frontend/test_session_mediator.cpp 2014-08-15 17:55:26 +0000
@@ -20,6 +20,7 @@
20#include "src/server/frontend/session_mediator.h"20#include "src/server/frontend/session_mediator.h"
21#include "src/server/report/null_report_factory.h"21#include "src/server/report/null_report_factory.h"
22#include "src/server/frontend/resource_cache.h"22#include "src/server/frontend/resource_cache.h"
23#include "src/server/frontend/surface_tracker.h"
23#include "src/server/scene/application_session.h"24#include "src/server/scene/application_session.h"
24#include "mir/graphics/display.h"25#include "mir/graphics/display.h"
25#include "mir/graphics/display_configuration.h"26#include "mir/graphics/display_configuration.h"
@@ -244,6 +245,16 @@
244 mp::DRMMagic drm_request;245 mp::DRMMagic drm_request;
245 mp::DRMAuthMagicStatus drm_response;246 mp::DRMAuthMagicStatus drm_response;
246247
248 mtd::StubBuffer buffer1;
249 mtd::StubBuffer buffer2;
250
251 void toggle_buffers(mg::Buffer* b, std::function<void(mg::Buffer* new_buffer)> complete)
252 {
253 if ((!b) || (b == &buffer1))
254 complete(&buffer2);
255 if (b == &buffer2)
256 complete(&buffer1);
257 }
247};258};
248}259}
249260
@@ -405,34 +416,22 @@
405TEST_F(SessionMediator, session_only_sends_mininum_information_for_buffers)416TEST_F(SessionMediator, session_only_sends_mininum_information_for_buffers)
406{417{
407 using namespace testing;418 using namespace testing;
408 mtd::StubBuffer buffer1;419 mf::SurfaceId surf_id{0};
409 mtd::StubBuffer buffer2;420 auto surface = stubbed_session->mock_surface_at(surf_id);
410 mp::Buffer buffer_response[3];421 ON_CALL(*surface, swap_buffers(_,_))
411 auto surface = stubbed_session->mock_surface_at(mf::SurfaceId{0});422 .WillByDefault(Invoke(this, &SessionMediator::toggle_buffers));
412 Sequence seq;
413423
414 //create424 //create
415 EXPECT_CALL(*surface, swap_buffers(_, _))425 Sequence seq;
416 .InSequence(seq)
417 .WillOnce(InvokeArgument<1>(&buffer2));
418 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer2, mg::BufferIpcMsgType::full_msg))426 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer2, mg::BufferIpcMsgType::full_msg))
419 .InSequence(seq);427 .InSequence(seq);
420 //swap1428 //swap1
421 EXPECT_CALL(*surface, swap_buffers(&buffer2, _))
422 .InSequence(seq)
423 .WillOnce(InvokeArgument<1>(&buffer1));
424 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer1, mg::BufferIpcMsgType::full_msg))429 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer1, mg::BufferIpcMsgType::full_msg))
425 .InSequence(seq);430 .InSequence(seq);
426 //swap2431 //swap2
427 EXPECT_CALL(*surface, swap_buffers(&buffer1, _))
428 .InSequence(seq)
429 .WillOnce(InvokeArgument<1>(&buffer2));
430 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer2, mg::BufferIpcMsgType::update_msg))432 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer2, mg::BufferIpcMsgType::update_msg))
431 .InSequence(seq);433 .InSequence(seq);
432 //swap3434 //swap3
433 EXPECT_CALL(*surface, swap_buffers(&buffer2, _))
434 .InSequence(seq)
435 .WillOnce(InvokeArgument<1>(&buffer1));
436 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer1, mg::BufferIpcMsgType::update_msg))435 EXPECT_CALL(*graphics_platform, fill_buffer_package(_, &buffer1, mg::BufferIpcMsgType::update_msg))
437 .InSequence(seq);436 .InSequence(seq);
438437
@@ -440,57 +439,64 @@
440439
441 mediator.create_surface(nullptr, &surface_parameters, &surface_response, null_callback.get());440 mediator.create_surface(nullptr, &surface_parameters, &surface_response, null_callback.get());
442 surface_id_request = surface_response.id();441 surface_id_request = surface_response.id();
443 mediator.next_buffer(nullptr, &surface_id_request, &buffer_response[0], null_callback.get());442 mediator.next_buffer(nullptr, &surface_id_request, &buffer_response, null_callback.get());
444 mediator.next_buffer(nullptr, &surface_id_request, &buffer_response[1], null_callback.get());443 mediator.next_buffer(nullptr, &surface_id_request, &buffer_response, null_callback.get());
445 mediator.next_buffer(nullptr, &surface_id_request, &buffer_response[2], null_callback.get());444 mediator.next_buffer(nullptr, &surface_id_request, &buffer_response, null_callback.get());
446 mediator.disconnect(nullptr, nullptr, nullptr, null_callback.get());445 mediator.disconnect(nullptr, nullptr, nullptr, null_callback.get());
447}446}
448447
449TEST_F(SessionMediator, session_with_multiple_surfaces_only_sends_needed_buffers)448TEST_F(SessionMediator, session_with_multiple_surfaces_only_sends_needed_buffers)
450{449{
451 using namespace testing;450 using namespace testing;
452 mtd::StubBuffer buffer[4];451 auto surface0 = stubbed_session->mock_surface_at(mf::SurfaceId{0});
453 mf::SurfaceId first_id{0};452 auto surface1 = stubbed_session->mock_surface_at(mf::SurfaceId{1});
454 mf::SurfaceId second_id{1};453 ON_CALL(*surface0, swap_buffers(_,_))
455454 .WillByDefault(Invoke(this, &SessionMediator::toggle_buffers));
455 ON_CALL(*surface1, swap_buffers(_,_))
456 .WillByDefault(Invoke(this, &SessionMediator::toggle_buffers));
457 EXPECT_CALL(*graphics_platform, fill_buffer_package(_,_,mg::BufferIpcMsgType::full_msg))
458 .Times(4);
459 EXPECT_CALL(*graphics_platform, fill_buffer_package(_,_,mg::BufferIpcMsgType::update_msg))
460 .Times(4);
461
462 mediator.connect(nullptr, &connect_parameters, &connection, null_callback.get());
463
464 mp::Surface surface_response[2];
456 mp::SurfaceId buffer_request[2];465 mp::SurfaceId buffer_request[2];
457 buffer_request[0].set_value(first_id.as_value());
458 buffer_request[1].set_value(second_id.as_value());
459
460 auto surface1 = stubbed_session->mock_surface_at(first_id);
461 auto surface2 = stubbed_session->mock_surface_at(second_id);
462 EXPECT_CALL(*surface1, swap_buffers(_,_))
463 .WillOnce(InvokeArgument<1>(&buffer[0]))
464 .WillOnce(InvokeArgument<1>(&buffer[1]))
465 .WillOnce(InvokeArgument<1>(&buffer[0]))
466 .WillOnce(InvokeArgument<1>(&buffer[1]));
467 EXPECT_CALL(*surface2, swap_buffers(_,_))
468 .WillOnce(InvokeArgument<1>(&buffer[2]))
469 .WillOnce(InvokeArgument<1>(&buffer[3]))
470 .WillOnce(InvokeArgument<1>(&buffer[2]))
471 .WillOnce(InvokeArgument<1>(&buffer[3]));
472
473 mediator.connect(nullptr, &connect_parameters, &connection, null_callback.get());
474
475 mediator.connect(nullptr, &connect_parameters, &connection, null_callback.get());
476
477 mp::Surface surface_response[2];
478 mp::Buffer buffer_response[6];
479
480 EXPECT_CALL(*graphics_platform, fill_buffer_package(_,_,mg::BufferIpcMsgType::full_msg))
481 .Times(4);
482 EXPECT_CALL(*graphics_platform, fill_buffer_package(_,_,mg::BufferIpcMsgType::update_msg))
483 .Times(4);
484
485 mediator.create_surface(nullptr, &surface_parameters, &surface_response[0], null_callback.get());466 mediator.create_surface(nullptr, &surface_parameters, &surface_response[0], null_callback.get());
486 mediator.create_surface(nullptr, &surface_parameters, &surface_response[1], null_callback.get());467 mediator.create_surface(nullptr, &surface_parameters, &surface_response[1], null_callback.get());
487 mediator.next_buffer(nullptr, &buffer_request[0], &buffer_response[0], null_callback.get());468 buffer_request[0] = surface_response[0].id();
488 mediator.next_buffer(nullptr, &buffer_request[1], &buffer_response[1], null_callback.get());469 buffer_request[1] = surface_response[1].id();
489 mediator.next_buffer(nullptr, &buffer_request[0], &buffer_response[2], null_callback.get());470
490 mediator.next_buffer(nullptr, &buffer_request[1], &buffer_response[3], null_callback.get());471 mediator.next_buffer(nullptr, &buffer_request[0], &buffer_response, null_callback.get());
491 mediator.next_buffer(nullptr, &buffer_request[0], &buffer_response[4], null_callback.get());472 mediator.next_buffer(nullptr, &buffer_request[1], &buffer_response, null_callback.get());
492 mediator.next_buffer(nullptr, &buffer_request[1], &buffer_response[5], null_callback.get());473 mediator.next_buffer(nullptr, &buffer_request[0], &buffer_response, null_callback.get());
493474 mediator.next_buffer(nullptr, &buffer_request[1], &buffer_response, null_callback.get());
475 mediator.next_buffer(nullptr, &buffer_request[0], &buffer_response, null_callback.get());
476 mediator.next_buffer(nullptr, &buffer_request[1], &buffer_response, null_callback.get());
477
478 mediator.disconnect(nullptr, nullptr, nullptr, null_callback.get());
479}
480
481TEST_F(SessionMediator, destroys_tracker_associated_with_destroyed_surface)
482{
483 using namespace testing;
484 mf::SurfaceId first_id{0};
485 mp::Surface surface_response;
486
487 EXPECT_CALL(*graphics_platform, fill_buffer_package(_,_,mg::BufferIpcMsgType::full_msg))
488 .Times(2);
489
490 mediator.connect(nullptr, &connect_parameters, &connection, null_callback.get());
491 mediator.create_surface(nullptr, &surface_parameters, &surface_response, null_callback.get());
492 surface_id_request.set_value(first_id.as_value());
493 mediator.release_surface(nullptr, &surface_id_request, nullptr, null_callback.get());
494
495 stubbed_session->last_surface_id = first_id.as_value();
496
497 mediator.create_surface(nullptr, &surface_parameters, &surface_response, null_callback.get());
498 surface_id_request.set_value(first_id.as_value());
499 mediator.release_surface(nullptr, &surface_id_request, nullptr, null_callback.get());
494 mediator.disconnect(nullptr, nullptr, nullptr, null_callback.get());500 mediator.disconnect(nullptr, nullptr, nullptr, null_callback.get());
495}501}
496502
@@ -503,8 +509,8 @@
503 mp::Surface surface_response;509 mp::Surface surface_response;
504510
505 auto surface1 = stubbed_session->mock_surface_at(mf::SurfaceId{0});511 auto surface1 = stubbed_session->mock_surface_at(mf::SurfaceId{0});
506 EXPECT_CALL(*surface1, swap_buffers(_, _))512 ON_CALL(*surface1, swap_buffers(_,_))
507 .WillOnce(InvokeArgument<1>(&buffer));513 .WillByDefault(InvokeArgument<1>(&buffer));
508514
509 mediator.create_surface(nullptr, &surface_request, &surface_response, null_callback.get());515 mediator.create_surface(nullptr, &surface_request, &surface_response, null_callback.get());
510 mp::SurfaceId our_surface{surface_response.id()};516 mp::SurfaceId our_surface{surface_response.id()};
@@ -512,6 +518,7 @@
512 /* Creating a new surface should not affect our surfaces' buffers */518 /* Creating a new surface should not affect our surfaces' buffers */
513 EXPECT_CALL(*surface1, swap_buffers(_, _)).Times(0);519 EXPECT_CALL(*surface1, swap_buffers(_, _)).Times(0);
514 mediator.create_surface(nullptr, &surface_request, &surface_response, null_callback.get());520 mediator.create_surface(nullptr, &surface_request, &surface_response, null_callback.get());
521 Mock::VerifyAndClearExpectations(surface1.get());
515522
516 mp::SurfaceId new_surface{surface_response.id()};523 mp::SurfaceId new_surface{surface_response.id()};
517 mp::Buffer buffer_response;524 mp::Buffer buffer_response;
@@ -520,7 +527,7 @@
520 mediator.next_buffer(nullptr, &new_surface, &buffer_response, null_callback.get());527 mediator.next_buffer(nullptr, &new_surface, &buffer_response, null_callback.get());
521528
522 /* Getting the next buffer of our surface should post the original */529 /* Getting the next buffer of our surface should post the original */
523 EXPECT_CALL(*surface1, swap_buffers(Eq(&buffer), _)).Times(1);530 EXPECT_CALL(*surface1, swap_buffers(Eq(&buffer),_)).Times(1);
524531
525 mediator.next_buffer(nullptr, &our_surface, &buffer_response, null_callback.get());532 mediator.next_buffer(nullptr, &our_surface, &buffer_response, null_callback.get());
526 mediator.disconnect(nullptr, nullptr, nullptr, null_callback.get());533 mediator.disconnect(nullptr, nullptr, nullptr, null_callback.get());
@@ -559,8 +566,9 @@
559 mf::SessionMediator mediator{566 mf::SessionMediator mediator{
560 shell, graphics_platform, mock_display_selector,567 shell, graphics_platform, mock_display_selector,
561 surface_pixel_formats, report,568 surface_pixel_formats, report,
562 std::make_shared<mtd::NullEventSink>(),569 std::make_shared<mtd::NullEventSink>(), resource_cache,
563 resource_cache, stub_screencast, &connector, nullptr};570 std::make_shared<mtd::NullScreencast>(),
571 nullptr, nullptr};
564572
565 mediator.connect(nullptr, &connect_parameters, &connection, null_callback.get());573 mediator.connect(nullptr, &connect_parameters, &connection, null_callback.get());
566574

Subscribers

People subscribed via source and target branches