Merge lp:~alan-griffiths/mir/rework-test_client_library.cpp-mk2 into lp:mir
- rework-test_client_library.cpp-mk2
- Merge into development-branch
Proposed by
Alan Griffiths
Status: | Merged |
---|---|
Approved by: | Alan Griffiths |
Approved revision: | no longer in the source branch. |
Merged at revision: | 1677 |
Proposed branch: | lp:~alan-griffiths/mir/rework-test_client_library.cpp-mk2 |
Merge into: | lp:mir |
Diff against target: |
1735 lines (+753/-951) 3 files modified
tests/acceptance-tests/CMakeLists.txt (+1/-0) tests/acceptance-tests/test_client_library.cpp (+752/-0) tests/acceptance-tests/test_client_library_old.cpp (+0/-951) |
To merge this branch: | bzr merge lp:~alan-griffiths/mir/rework-test_client_library.cpp-mk2 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Kevin DuBois (community) | Approve | ||
PS Jenkins bot (community) | continuous-integration | Approve | |
Review via email: mp+221854@code.launchpad.net |
Commit message
tests: Move (most of) client library tests into a single process
Description of the change
tests: Move (most of) client library tests into a single process
This is a variant on lp:~alan-griffiths/mir/rework-test_client_library.cpp based on not touching anything about the (almost untouched) tests that fail in CI on that MP.
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
Kevin DuBois (kdub) wrote : | # |
I think that the android ifdefs (some of which are pre-existing) could be rooted out, as I don't ever expect android code to conform to pass the tests as they are. Still looks like an improvement though.
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'tests/acceptance-tests/CMakeLists.txt' |
2 | --- tests/acceptance-tests/CMakeLists.txt 2014-06-02 17:07:02 +0000 |
3 | +++ tests/acceptance-tests/CMakeLists.txt 2014-06-03 10:33:14 +0000 |
4 | @@ -16,6 +16,7 @@ |
5 | server_configuration_wrapping.cpp |
6 | clients.cpp |
7 | test_client_library.cpp |
8 | + test_client_library_old.cpp |
9 | test_custom_input_dispatcher.cpp |
10 | test_surfaceloop.cpp |
11 | test_test_framework.cpp |
12 | |
13 | === added file 'tests/acceptance-tests/test_client_library.cpp' |
14 | --- tests/acceptance-tests/test_client_library.cpp 1970-01-01 00:00:00 +0000 |
15 | +++ tests/acceptance-tests/test_client_library.cpp 2014-06-03 10:33:14 +0000 |
16 | @@ -0,0 +1,752 @@ |
17 | +/* |
18 | + * Copyright © 2012-2014 Canonical Ltd. |
19 | + * |
20 | + * This program is free software: you can redistribute it and/or modify |
21 | + * it under the terms of the GNU General Public License version 3 as |
22 | + * published by the Free Software Foundation. |
23 | + * |
24 | + * This program is distributed in the hope that it will be useful, |
25 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
26 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
27 | + * GNU General Public License for more details. |
28 | + * |
29 | + * You should have received a copy of the GNU General Public License |
30 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
31 | + * |
32 | + * Authored by: Thomas Guest <thomas.guest@canonical.com> |
33 | + */ |
34 | + |
35 | +#include "mir_toolkit/mir_client_library.h" |
36 | +#include "mir_toolkit/mir_client_library_debug.h" |
37 | + |
38 | +#include "mir_test_framework/stubbed_server_configuration.h" |
39 | +#include "mir_test_framework/in_process_server.h" |
40 | + |
41 | +#include "src/client/client_buffer.h" |
42 | + |
43 | +#include "mir/frontend/connector.h" |
44 | + |
45 | +#include "mir_protobuf.pb.h" |
46 | + |
47 | +#ifdef ANDROID |
48 | +/* |
49 | + * MirNativeBuffer for Android is defined opaquely, but we now depend on |
50 | + * it having width and height fields, for all platforms. So need definition... |
51 | + */ |
52 | +#include <system/window.h> // for ANativeWindowBuffer AKA MirNativeBuffer |
53 | +#endif |
54 | + |
55 | +#include <gtest/gtest.h> |
56 | +#include <gmock/gmock.h> |
57 | +#include <chrono> |
58 | +#include <thread> |
59 | +#include <cstring> |
60 | + |
61 | +#include <sys/types.h> |
62 | +#include <sys/stat.h> |
63 | +#include <fcntl.h> |
64 | + |
65 | +#include <errno.h> |
66 | + |
67 | +namespace mf = mir::frontend; |
68 | +namespace mc = mir::compositor; |
69 | +namespace mcl = mir::client; |
70 | + |
71 | +namespace |
72 | +{ |
73 | +struct ClientLibrary : mir_test_framework::InProcessServer |
74 | +{ |
75 | + mir_test_framework::StubbedServerConfiguration server_configuration; |
76 | + mir::DefaultServerConfiguration& server_config() override { return server_configuration; } |
77 | + |
78 | + std::set<MirSurface*> surfaces; |
79 | + MirConnection* connection = nullptr; |
80 | + MirSurface* surface = nullptr; |
81 | + int buffers = 0; |
82 | + |
83 | + static void connection_callback(MirConnection* connection, void* context) |
84 | + { |
85 | + ClientLibrary* config = reinterpret_cast<ClientLibrary*>(context); |
86 | + config->connected(connection); |
87 | + } |
88 | + |
89 | + static void create_surface_callback(MirSurface* surface, void* context) |
90 | + { |
91 | + ClientLibrary* config = reinterpret_cast<ClientLibrary*>(context); |
92 | + config->surface_created(surface); |
93 | + } |
94 | + |
95 | + static void next_buffer_callback(MirSurface* surface, void* context) |
96 | + { |
97 | + ClientLibrary* config = reinterpret_cast<ClientLibrary*>(context); |
98 | + config->next_buffer(surface); |
99 | + } |
100 | + |
101 | + static void release_surface_callback(MirSurface* surface, void* context) |
102 | + { |
103 | + ClientLibrary* config = reinterpret_cast<ClientLibrary*>(context); |
104 | + config->surface_released(surface); |
105 | + } |
106 | + |
107 | + virtual void connected(MirConnection* new_connection) |
108 | + { |
109 | + connection = new_connection; |
110 | + } |
111 | + |
112 | + virtual void surface_created(MirSurface* new_surface) |
113 | + { |
114 | + surfaces.insert(new_surface); |
115 | + surface = new_surface; |
116 | + } |
117 | + |
118 | + virtual void next_buffer(MirSurface*) |
119 | + { |
120 | + ++buffers; |
121 | + } |
122 | + |
123 | + void surface_released(MirSurface* old_surface) |
124 | + { |
125 | + surfaces.erase(old_surface); |
126 | + surface = NULL; |
127 | + } |
128 | + |
129 | + MirSurface* any_surface() |
130 | + { |
131 | + return *surfaces.begin(); |
132 | + } |
133 | + |
134 | + size_t current_surface_count() |
135 | + { |
136 | + return surfaces.size(); |
137 | + } |
138 | + |
139 | + MirEvent last_event{}; |
140 | + MirSurface* last_event_surface = nullptr; |
141 | + |
142 | + static void event_callback(MirSurface* surface, MirEvent const* event, |
143 | + void* ctx) |
144 | + { |
145 | + ClientLibrary* self = static_cast<ClientLibrary*>(ctx); |
146 | + self->last_event = *event; |
147 | + self->last_event_surface = surface; |
148 | + } |
149 | + |
150 | + static void nosey_thread(MirSurface *surf) |
151 | + { |
152 | + for (int i = 0; i < 10; i++) |
153 | + { |
154 | + mir_wait_for_one(mir_surface_set_state(surf, |
155 | + mir_surface_state_maximized)); |
156 | + mir_wait_for_one(mir_surface_set_type(surf, |
157 | + mir_surface_type_normal)); |
158 | + mir_wait_for_one(mir_surface_set_state(surf, |
159 | + mir_surface_state_restored)); |
160 | + mir_wait_for_one(mir_surface_set_type(surf, |
161 | + mir_surface_type_utility)); |
162 | + mir_wait_for_one(mir_surface_set_state(surf, |
163 | + mir_surface_state_fullscreen)); |
164 | + mir_wait_for_one(mir_surface_set_type(surf, |
165 | + mir_surface_type_dialog)); |
166 | + mir_wait_for_one(mir_surface_set_state(surf, |
167 | + mir_surface_state_minimized)); |
168 | + } |
169 | + } |
170 | +}; |
171 | +} |
172 | + |
173 | +using namespace testing; |
174 | + |
175 | +TEST_F(ClientLibrary, client_library_connects_and_disconnects) |
176 | +{ |
177 | + MirWaitHandle* wh = mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this); |
178 | + EXPECT_THAT(wh, NotNull()); |
179 | + mir_wait_for(wh); |
180 | + |
181 | + ASSERT_THAT(connection, NotNull()); |
182 | + EXPECT_TRUE(mir_connection_is_valid(connection)); |
183 | + EXPECT_THAT(mir_connection_get_error_message(connection), StrEq("")); |
184 | + |
185 | + mir_connection_release(connection); |
186 | +} |
187 | + |
188 | +TEST_F(ClientLibrary, synchronous_connection) |
189 | +{ |
190 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
191 | + |
192 | + EXPECT_THAT(connection, NotNull()); |
193 | + EXPECT_TRUE(mir_connection_is_valid(connection)); |
194 | + EXPECT_THAT(mir_connection_get_error_message(connection), StrEq("")); |
195 | + |
196 | + mir_connection_release(connection); |
197 | +} |
198 | + |
199 | +TEST_F(ClientLibrary, creates_surface) |
200 | +{ |
201 | + mir_wait_for(mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this)); |
202 | + |
203 | + MirSurfaceParameters const request_params = |
204 | + { |
205 | + __PRETTY_FUNCTION__, |
206 | + 640, 480, |
207 | + mir_pixel_format_abgr_8888, |
208 | + mir_buffer_usage_hardware, |
209 | + mir_display_output_id_invalid |
210 | + }; |
211 | + |
212 | + mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
213 | + |
214 | + ASSERT_THAT(surface, NotNull()); |
215 | + EXPECT_TRUE(mir_surface_is_valid(surface)); |
216 | + EXPECT_THAT(mir_surface_get_error_message(surface), StrEq("")); |
217 | + |
218 | + MirSurfaceParameters response_params; |
219 | + mir_surface_get_parameters(surface, &response_params); |
220 | + EXPECT_EQ(request_params.width, response_params.width); |
221 | + EXPECT_EQ(request_params.height, response_params.height); |
222 | + EXPECT_EQ(request_params.pixel_format, response_params.pixel_format); |
223 | + EXPECT_EQ(request_params.buffer_usage, response_params.buffer_usage); |
224 | + |
225 | + mir_wait_for(mir_surface_release( surface, release_surface_callback, this)); |
226 | + |
227 | + ASSERT_THAT(surface, IsNull()); |
228 | + |
229 | + surface = mir_connection_create_surface_sync(connection, &request_params); |
230 | + |
231 | + ASSERT_THAT(surface, NotNull()); |
232 | + EXPECT_TRUE(mir_surface_is_valid(surface)); |
233 | + EXPECT_THAT(mir_surface_get_error_message(surface), StrEq("")); |
234 | + |
235 | + mir_surface_get_parameters(surface, &response_params); |
236 | + EXPECT_THAT(response_params.width, Eq(request_params.width)); |
237 | + EXPECT_THAT(response_params.height, Eq(request_params.height)); |
238 | + EXPECT_THAT(response_params.pixel_format, Eq(request_params.pixel_format)); |
239 | + EXPECT_THAT(response_params.buffer_usage, Eq(request_params.buffer_usage)); |
240 | + |
241 | + mir_surface_release_sync(surface); |
242 | + mir_connection_release(connection); |
243 | +} |
244 | + |
245 | +TEST_F(ClientLibrary, can_set_surface_types) |
246 | +{ |
247 | + mir_wait_for(mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this)); |
248 | + |
249 | + MirSurfaceParameters const request_params = |
250 | + { |
251 | + __PRETTY_FUNCTION__, |
252 | + 640, 480, |
253 | + mir_pixel_format_abgr_8888, |
254 | + mir_buffer_usage_hardware, |
255 | + mir_display_output_id_invalid |
256 | + }; |
257 | + |
258 | + mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
259 | + |
260 | + EXPECT_THAT(mir_surface_get_type(surface), Eq(mir_surface_type_normal)); |
261 | + |
262 | + mir_wait_for(mir_surface_set_type(surface, mir_surface_type_freestyle)); |
263 | + EXPECT_THAT(mir_surface_get_type(surface), Eq(mir_surface_type_freestyle)); |
264 | + |
265 | + mir_wait_for(mir_surface_set_type(surface, static_cast<MirSurfaceType>(999))); |
266 | + EXPECT_THAT(mir_surface_get_type(surface), Eq(mir_surface_type_freestyle)); |
267 | + |
268 | + mir_wait_for(mir_surface_set_type(surface, mir_surface_type_dialog)); |
269 | + EXPECT_THAT(mir_surface_get_type(surface), Eq(mir_surface_type_dialog)); |
270 | + |
271 | + mir_wait_for(mir_surface_set_type(surface, static_cast<MirSurfaceType>(888))); |
272 | + EXPECT_THAT(mir_surface_get_type(surface), Eq(mir_surface_type_dialog)); |
273 | + |
274 | + // Stress-test synchronization logic with some flooding |
275 | + for (int i = 0; i < 100; i++) |
276 | + { |
277 | + mir_surface_set_type(surface, mir_surface_type_normal); |
278 | + mir_surface_set_type(surface, mir_surface_type_utility); |
279 | + mir_surface_set_type(surface, mir_surface_type_dialog); |
280 | + mir_surface_set_type(surface, mir_surface_type_overlay); |
281 | + mir_surface_set_type(surface, mir_surface_type_freestyle); |
282 | + mir_wait_for(mir_surface_set_type(surface, mir_surface_type_popover)); |
283 | + ASSERT_THAT(mir_surface_get_type(surface), Eq(mir_surface_type_popover)); |
284 | + } |
285 | + |
286 | + mir_wait_for(mir_surface_release(surface, release_surface_callback, this)); |
287 | + mir_connection_release(connection); |
288 | +} |
289 | + |
290 | +TEST_F(ClientLibrary, can_set_surface_state) |
291 | +{ |
292 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
293 | + |
294 | + MirSurfaceParameters const request_params = |
295 | + { |
296 | + __PRETTY_FUNCTION__, |
297 | + 640, 480, |
298 | + mir_pixel_format_abgr_8888, |
299 | + mir_buffer_usage_hardware, |
300 | + mir_display_output_id_invalid |
301 | + }; |
302 | + |
303 | + surface = mir_connection_create_surface_sync(connection, &request_params); |
304 | + |
305 | + EXPECT_THAT(mir_surface_get_state(surface), Eq(mir_surface_state_restored)); |
306 | + |
307 | + mir_wait_for(mir_surface_set_state(surface, mir_surface_state_fullscreen)); |
308 | + EXPECT_THAT(mir_surface_get_state(surface), Eq(mir_surface_state_fullscreen)); |
309 | + |
310 | + mir_wait_for(mir_surface_set_state(surface, static_cast<MirSurfaceState>(999))); |
311 | + EXPECT_THAT(mir_surface_get_state(surface), Eq(mir_surface_state_fullscreen)); |
312 | + |
313 | + mir_wait_for(mir_surface_set_state(surface, mir_surface_state_minimized)); |
314 | + EXPECT_THAT(mir_surface_get_state(surface), Eq(mir_surface_state_minimized)); |
315 | + |
316 | + mir_wait_for(mir_surface_set_state(surface, static_cast<MirSurfaceState>(888))); |
317 | + EXPECT_THAT(mir_surface_get_state(surface), Eq(mir_surface_state_minimized)); |
318 | + |
319 | + // Stress-test synchronization logic with some flooding |
320 | + for (int i = 0; i < 100; i++) |
321 | + { |
322 | + mir_surface_set_state(surface, mir_surface_state_maximized); |
323 | + mir_surface_set_state(surface, mir_surface_state_restored); |
324 | + mir_wait_for(mir_surface_set_state(surface, mir_surface_state_fullscreen)); |
325 | + ASSERT_THAT(mir_surface_get_state(surface), Eq(mir_surface_state_fullscreen)); |
326 | + } |
327 | + |
328 | + mir_surface_release_sync(surface); |
329 | + mir_connection_release(connection); |
330 | +} |
331 | + |
332 | +TEST_F(ClientLibrary, receives_surface_state_events) |
333 | +{ |
334 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
335 | + |
336 | + MirSurfaceParameters const request_params = |
337 | + { |
338 | + __PRETTY_FUNCTION__, |
339 | + 640, 480, |
340 | + mir_pixel_format_abgr_8888, |
341 | + mir_buffer_usage_hardware, |
342 | + mir_display_output_id_invalid |
343 | + }; |
344 | + |
345 | + MirEventDelegate delegate{&event_callback, this}; |
346 | + MirSurface* other_surface = mir_connection_create_surface_sync(connection, &request_params); |
347 | + ASSERT_TRUE(mir_surface_is_valid(other_surface)); |
348 | + |
349 | + mir_surface_set_event_handler(other_surface, nullptr); |
350 | + |
351 | + surface = mir_connection_create_surface_sync(connection, &request_params); |
352 | + ASSERT_TRUE(mir_surface_is_valid(surface)); |
353 | + |
354 | + mir_surface_set_event_handler(surface, &delegate); |
355 | + |
356 | + int surface_id = mir_debug_surface_id(surface); |
357 | + |
358 | + mir_wait_for(mir_surface_set_state(surface, mir_surface_state_fullscreen)); |
359 | + mir_wait_for(mir_surface_set_state(other_surface, mir_surface_state_minimized)); |
360 | + EXPECT_THAT(last_event_surface, Eq(surface)); |
361 | + EXPECT_THAT(last_event.type, Eq(mir_event_type_surface)); |
362 | + EXPECT_THAT(last_event.surface.id, Eq(surface_id)); |
363 | + EXPECT_THAT(last_event.surface.attrib, Eq(mir_surface_attrib_state)); |
364 | + EXPECT_THAT(last_event.surface.value, Eq(mir_surface_state_fullscreen)); |
365 | + |
366 | + mir_wait_for(mir_surface_set_state(surface, static_cast<MirSurfaceState>(999))); |
367 | + EXPECT_THAT(last_event_surface, Eq(surface)); |
368 | + EXPECT_THAT(last_event.type, Eq(mir_event_type_surface)); |
369 | + EXPECT_THAT(last_event.surface.id, Eq(surface_id)); |
370 | + EXPECT_THAT(last_event.surface.attrib, Eq(mir_surface_attrib_state)); |
371 | + EXPECT_THAT(last_event.surface.value, Eq(mir_surface_state_fullscreen)); |
372 | + |
373 | + memset(&last_event, 0, sizeof last_event); |
374 | + last_event_surface = nullptr; |
375 | + |
376 | + mir_wait_for(mir_surface_set_state(surface, mir_surface_state_minimized)); |
377 | + EXPECT_THAT(last_event_surface, Eq(surface)); |
378 | + EXPECT_THAT(last_event.type, Eq(mir_event_type_surface)); |
379 | + EXPECT_THAT(last_event.surface.id, Eq(surface_id)); |
380 | + EXPECT_THAT(last_event.surface.attrib, Eq(mir_surface_attrib_state)); |
381 | + EXPECT_THAT(last_event.surface.value, Eq(mir_surface_state_minimized)); |
382 | + |
383 | + memset(&last_event, 0, sizeof last_event); |
384 | + last_event_surface = nullptr; |
385 | + |
386 | + mir_wait_for(mir_surface_set_state(surface, static_cast<MirSurfaceState>(777))); |
387 | + mir_wait_for(mir_surface_set_state(other_surface, mir_surface_state_maximized)); |
388 | + EXPECT_THAT(last_event_surface, IsNull()); |
389 | + EXPECT_THAT(last_event.type, Eq(0)); |
390 | + EXPECT_THAT(last_event.surface.id, Eq(0)); |
391 | + EXPECT_THAT(last_event.surface.attrib, Eq(0)); |
392 | + EXPECT_THAT(last_event.surface.value, Eq(0)); |
393 | + |
394 | + mir_surface_release_sync(surface); |
395 | + mir_surface_release_sync(other_surface); |
396 | + mir_connection_release(connection); |
397 | +} |
398 | + |
399 | +TEST_F(ClientLibrary, receives_surface_dpi_value) |
400 | +{ |
401 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
402 | + |
403 | + MirSurfaceParameters const request_params = |
404 | + { |
405 | + __PRETTY_FUNCTION__, |
406 | + 640, 480, |
407 | + mir_pixel_format_abgr_8888, |
408 | + mir_buffer_usage_hardware, |
409 | + mir_display_output_id_invalid |
410 | + }; |
411 | + |
412 | + surface = mir_connection_create_surface_sync(connection, &request_params); |
413 | + |
414 | + // Expect zero (not wired up to detect the physical display yet) |
415 | + EXPECT_THAT(mir_surface_get_dpi(surface), Eq(0)); |
416 | + |
417 | + mir_surface_release_sync(surface); |
418 | + mir_connection_release(connection); |
419 | +} |
420 | + |
421 | +#ifndef ANDROID |
422 | +TEST_F(ClientLibrary, surface_scanout_flag_toggles) |
423 | +{ |
424 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
425 | + |
426 | + MirSurfaceParameters parm = |
427 | + { |
428 | + __PRETTY_FUNCTION__, |
429 | + 1280, 1024, |
430 | + mir_pixel_format_abgr_8888, |
431 | + mir_buffer_usage_hardware, |
432 | + mir_display_output_id_invalid |
433 | + }; |
434 | + |
435 | + surface = mir_connection_create_surface_sync(connection, &parm); |
436 | + |
437 | + MirNativeBuffer *native; |
438 | + mir_surface_get_current_buffer(surface, &native); |
439 | + EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
440 | + mir_surface_swap_buffers_sync(surface); |
441 | + EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
442 | + mir_surface_release_sync(surface); |
443 | + |
444 | + parm.width = 100; |
445 | + parm.height = 100; |
446 | + |
447 | + surface = mir_connection_create_surface_sync(connection, &parm); |
448 | + mir_surface_get_current_buffer(surface, &native); |
449 | + EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
450 | + mir_surface_swap_buffers_sync(surface); |
451 | + EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
452 | + mir_surface_release_sync(surface); |
453 | + |
454 | + parm.width = 800; |
455 | + parm.height = 600; |
456 | + parm.buffer_usage = mir_buffer_usage_software; |
457 | + |
458 | + surface = mir_connection_create_surface_sync(connection, &parm); |
459 | + mir_surface_get_current_buffer(surface, &native); |
460 | + EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
461 | + mir_surface_swap_buffers_sync(surface); |
462 | + EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
463 | + mir_surface_release_sync(surface); |
464 | + |
465 | + parm.buffer_usage = mir_buffer_usage_hardware; |
466 | + |
467 | + surface = mir_connection_create_surface_sync(connection, &parm); |
468 | + mir_surface_get_current_buffer(surface, &native); |
469 | + EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
470 | + mir_surface_swap_buffers_sync(surface); |
471 | + EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
472 | + mir_surface_release_sync(surface); |
473 | + |
474 | + mir_connection_release(connection); |
475 | +} |
476 | +#endif |
477 | + |
478 | +#ifdef ANDROID |
479 | +// Mir's Android test infrastructure isn't quite ready for this yet. |
480 | +TEST_F(ClientLibrary, DISABLED_gets_buffer_dimensions) |
481 | +#else |
482 | +TEST_F(ClientLibrary, gets_buffer_dimensions) |
483 | +#endif |
484 | +{ |
485 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
486 | + |
487 | + MirSurfaceParameters parm = |
488 | + { |
489 | + __PRETTY_FUNCTION__, |
490 | + 0, 0, |
491 | + mir_pixel_format_abgr_8888, |
492 | + mir_buffer_usage_hardware, |
493 | + mir_display_output_id_invalid |
494 | + }; |
495 | + |
496 | + struct {int width, height;} const sizes[] = |
497 | + { |
498 | + {12, 34}, |
499 | + {56, 78}, |
500 | + {90, 21}, |
501 | + }; |
502 | + |
503 | + for (auto const& size : sizes) |
504 | + { |
505 | + parm.width = size.width; |
506 | + parm.height = size.height; |
507 | + |
508 | + surface = mir_connection_create_surface_sync(connection, &parm); |
509 | + |
510 | + MirNativeBuffer *native = NULL; |
511 | + mir_surface_get_current_buffer(surface, &native); |
512 | + ASSERT_THAT(native, NotNull()); |
513 | + EXPECT_THAT(native->width, Eq(parm.width)); |
514 | + ASSERT_THAT(native->height, Eq(parm.height)); |
515 | + |
516 | + mir_surface_swap_buffers_sync(surface); |
517 | + mir_surface_get_current_buffer(surface, &native); |
518 | + ASSERT_THAT(native, NotNull()); |
519 | + EXPECT_THAT(native->width, Eq(parm.width)); |
520 | + ASSERT_THAT(native->height, Eq(parm.height)); |
521 | + |
522 | + mir_surface_release_sync(surface); |
523 | + } |
524 | + |
525 | + mir_connection_release(connection); |
526 | +} |
527 | + |
528 | +TEST_F(ClientLibrary, creates_multiple_surfaces) |
529 | +{ |
530 | + int const n_surfaces = 13; |
531 | + size_t old_surface_count = 0; |
532 | + |
533 | + mir_wait_for(mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this)); |
534 | + |
535 | + for (int i = 0; i != n_surfaces; ++i) |
536 | + { |
537 | + old_surface_count = current_surface_count(); |
538 | + |
539 | + MirSurfaceParameters const request_params = |
540 | + { |
541 | + __PRETTY_FUNCTION__, |
542 | + 640, 480, |
543 | + mir_pixel_format_abgr_8888, |
544 | + mir_buffer_usage_hardware, |
545 | + mir_display_output_id_invalid |
546 | + }; |
547 | + |
548 | + mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
549 | + |
550 | + ASSERT_THAT(current_surface_count(), Eq(old_surface_count + 1)); |
551 | + } |
552 | + for (int i = 0; i != n_surfaces; ++i) |
553 | + { |
554 | + old_surface_count = current_surface_count(); |
555 | + |
556 | + ASSERT_THAT(old_surface_count, Ne(0u)); |
557 | + |
558 | + MirSurface * surface = any_surface(); |
559 | + mir_wait_for(mir_surface_release( surface, release_surface_callback, this)); |
560 | + |
561 | + ASSERT_THAT(current_surface_count(), Eq(old_surface_count - 1)); |
562 | + } |
563 | + |
564 | + mir_connection_release(connection); |
565 | +} |
566 | + |
567 | +TEST_F(ClientLibrary, client_library_accesses_and_advances_buffers) |
568 | +{ |
569 | + mir_wait_for(mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this)); |
570 | + |
571 | + MirSurfaceParameters const request_params = |
572 | + { |
573 | + __PRETTY_FUNCTION__, |
574 | + 640, 480, |
575 | + mir_pixel_format_abgr_8888, |
576 | + mir_buffer_usage_hardware, |
577 | + mir_display_output_id_invalid |
578 | + }; |
579 | + |
580 | + mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
581 | + |
582 | + buffers = 0; |
583 | + mir_wait_for(mir_surface_swap_buffers(surface, next_buffer_callback, this)); |
584 | + EXPECT_THAT(buffers, Eq(1)); |
585 | + |
586 | + mir_wait_for(mir_surface_release(surface, release_surface_callback, this)); |
587 | + |
588 | + ASSERT_THAT(surface, IsNull()); |
589 | + |
590 | + mir_connection_release(connection); |
591 | +} |
592 | + |
593 | +TEST_F(ClientLibrary, fully_synchronous_client) |
594 | +{ |
595 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
596 | + |
597 | + MirSurfaceParameters const request_params = |
598 | + { |
599 | + __PRETTY_FUNCTION__, |
600 | + 640, 480, |
601 | + mir_pixel_format_abgr_8888, |
602 | + mir_buffer_usage_software, |
603 | + mir_display_output_id_invalid |
604 | + }; |
605 | + |
606 | + surface = mir_connection_create_surface_sync(connection, &request_params); |
607 | + |
608 | + mir_surface_swap_buffers_sync(surface); |
609 | + EXPECT_TRUE(mir_surface_is_valid(surface)); |
610 | + EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
611 | + |
612 | + mir_surface_release_sync(surface); |
613 | + |
614 | + EXPECT_TRUE(mir_connection_is_valid(connection)); |
615 | + EXPECT_STREQ("", mir_connection_get_error_message(connection)); |
616 | + mir_connection_release(connection); |
617 | +} |
618 | + |
619 | +TEST_F(ClientLibrary, highly_threaded_client) |
620 | +{ |
621 | + connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
622 | + |
623 | + MirSurfaceParameters const request_params = |
624 | + { |
625 | + __PRETTY_FUNCTION__, |
626 | + 640, 480, |
627 | + mir_pixel_format_abgr_8888, |
628 | + mir_buffer_usage_software, |
629 | + mir_display_output_id_invalid |
630 | + }; |
631 | + |
632 | + surface = mir_connection_create_surface_sync(connection, &request_params); |
633 | + |
634 | + std::thread a(nosey_thread, surface); |
635 | + std::thread b(nosey_thread, surface); |
636 | + std::thread c(nosey_thread, surface); |
637 | + |
638 | + a.join(); |
639 | + b.join(); |
640 | + c.join(); |
641 | + |
642 | + EXPECT_THAT(mir_surface_get_type(surface), Eq(mir_surface_type_dialog)); |
643 | + EXPECT_THAT(mir_surface_get_type(surface), Eq(mir_surface_state_minimized)); |
644 | + |
645 | + mir_surface_release_sync(surface); |
646 | + |
647 | + EXPECT_TRUE(mir_connection_is_valid(connection)); |
648 | + EXPECT_THAT(mir_connection_get_error_message(connection), StrEq("")); |
649 | + mir_connection_release(connection); |
650 | +} |
651 | + |
652 | +TEST_F(ClientLibrary, accesses_platform_package) |
653 | +{ |
654 | + mir_wait_for(mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this)); |
655 | + |
656 | + MirPlatformPackage platform_package; |
657 | + platform_package.data_items = -1; |
658 | + platform_package.fd_items = -1; |
659 | + |
660 | + mir_connection_get_platform(connection, &platform_package); |
661 | + EXPECT_GE(0, platform_package.data_items); |
662 | + EXPECT_GE(0, platform_package.fd_items); |
663 | + |
664 | + mir_connection_release(connection); |
665 | +} |
666 | + |
667 | +TEST_F(ClientLibrary, accesses_display_info) |
668 | +{ |
669 | + mir_wait_for(mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this)); |
670 | + |
671 | + auto configuration = mir_connection_create_display_config(connection); |
672 | + ASSERT_THAT(configuration, NotNull()); |
673 | + ASSERT_GT(configuration->num_outputs, 0u); |
674 | + ASSERT_THAT(configuration->outputs, NotNull()); |
675 | + for (auto i=0u; i < configuration->num_outputs; i++) |
676 | + { |
677 | + MirDisplayOutput* disp = &configuration->outputs[i]; |
678 | + ASSERT_THAT(disp, NotNull()); |
679 | + EXPECT_GE(disp->num_modes, disp->current_mode); |
680 | + EXPECT_GE(disp->num_output_formats, disp->current_format); |
681 | + } |
682 | + |
683 | + mir_display_config_destroy(configuration); |
684 | + mir_connection_release(connection); |
685 | +} |
686 | + |
687 | +TEST_F(ClientLibrary, connect_errors_handled) |
688 | +{ |
689 | + mir_wait_for(mir_connect("garbage", __PRETTY_FUNCTION__, connection_callback, this)); |
690 | + ASSERT_THAT(connection, NotNull()); |
691 | + |
692 | + char const* error = mir_connection_get_error_message(connection); |
693 | + |
694 | + if (std::strcmp("connect: No such file or directory", error) && |
695 | + std::strcmp("Can't find MIR server", error) && |
696 | + std::strcmp("Failed to connect to server socket", error)) |
697 | + { |
698 | + FAIL() << error; |
699 | + } |
700 | +} |
701 | + |
702 | +TEST_F(ClientLibrary, connect_errors_dont_blow_up) |
703 | +{ |
704 | + mir_wait_for(mir_connect("garbage", __PRETTY_FUNCTION__, connection_callback, this)); |
705 | + |
706 | + MirSurfaceParameters const request_params = |
707 | + { |
708 | + __PRETTY_FUNCTION__, |
709 | + 640, 480, |
710 | + mir_pixel_format_abgr_8888, |
711 | + mir_buffer_usage_hardware, |
712 | + mir_display_output_id_invalid |
713 | + }; |
714 | + |
715 | + mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
716 | +// TODO surface_create needs to fail safe too. After that is done we should add the following: |
717 | +// TODO mir_wait_for(mir_surface_swap_buffers(surface, next_buffer_callback, this)); |
718 | +// TODO mir_wait_for(mir_surface_release( surface, release_surface_callback, this)); |
719 | + |
720 | + mir_connection_release(connection); |
721 | +} |
722 | + |
723 | +TEST_F(ClientLibrary, MultiSurfaceClientTracksBufferFdsCorrectly) |
724 | +{ |
725 | + mir_wait_for(mir_connect(new_connection().c_str(), __PRETTY_FUNCTION__, connection_callback, this)); |
726 | + |
727 | + MirSurfaceParameters const request_params = |
728 | + { |
729 | + __PRETTY_FUNCTION__, |
730 | + 640, 480, |
731 | + mir_pixel_format_abgr_8888, |
732 | + mir_buffer_usage_hardware, |
733 | + mir_display_output_id_invalid |
734 | + }; |
735 | + |
736 | + MirSurface* surf_one = mir_connection_create_surface_sync(connection, &request_params); |
737 | + MirSurface* surf_two = mir_connection_create_surface_sync(connection, &request_params); |
738 | + |
739 | + ASSERT_THAT(surf_one, NotNull()); |
740 | + ASSERT_THAT(surf_two, NotNull()); |
741 | + |
742 | + buffers = 0; |
743 | + |
744 | + while (buffers < 1024) |
745 | + { |
746 | + mir_surface_swap_buffers_sync(surf_one); |
747 | + mir_surface_swap_buffers_sync(surf_two); |
748 | + |
749 | + buffers++; |
750 | + } |
751 | + |
752 | + /* We should not have any stray fds hanging around. |
753 | + Test this by trying to open a new one */ |
754 | + int canary_fd; |
755 | + canary_fd = open("/dev/null", O_RDONLY); |
756 | + |
757 | + ASSERT_THAT(canary_fd, Gt(0)) << "Failed to open canary file descriptor: "<< strerror(errno); |
758 | + EXPECT_THAT(canary_fd, Lt(1024)); |
759 | + |
760 | + close(canary_fd); |
761 | + |
762 | + mir_wait_for(mir_surface_release(surf_one, release_surface_callback, this)); |
763 | + mir_wait_for(mir_surface_release(surf_two, release_surface_callback, this)); |
764 | + |
765 | + ASSERT_THAT(current_surface_count(), testing::Eq(0)); |
766 | + |
767 | + mir_connection_release(connection); |
768 | +} |
769 | |
770 | === renamed file 'tests/acceptance-tests/test_client_library.cpp' => 'tests/acceptance-tests/test_client_library_old.cpp' |
771 | --- tests/acceptance-tests/test_client_library.cpp 2014-06-02 17:07:02 +0000 |
772 | +++ tests/acceptance-tests/test_client_library_old.cpp 2014-06-03 10:33:14 +0000 |
773 | @@ -118,885 +118,6 @@ |
774 | }; |
775 | } |
776 | |
777 | -TEST_F(DefaultDisplayServerTestFixture, client_library_connects_and_disconnects) |
778 | -{ |
779 | - struct ClientConfig : ClientConfigCommon |
780 | - { |
781 | - void exec() |
782 | - { |
783 | - MirWaitHandle* wh = |
784 | - mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this); |
785 | - EXPECT_TRUE(wh != NULL); |
786 | - mir_wait_for(wh); |
787 | - ASSERT_TRUE(connection != NULL); |
788 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
789 | - EXPECT_STREQ(mir_connection_get_error_message(connection), ""); |
790 | - |
791 | - mir_connection_release(connection); |
792 | - } |
793 | - } client_config; |
794 | - |
795 | - launch_client_process(client_config); |
796 | -} |
797 | - |
798 | -TEST_F(DefaultDisplayServerTestFixture, synchronous_connection) |
799 | -{ |
800 | - struct ClientConfig : ClientConfigCommon |
801 | - { |
802 | - void exec() |
803 | - { |
804 | - connection = NULL; |
805 | - connection = mir_connect_sync(mir_test_socket, |
806 | - __PRETTY_FUNCTION__); |
807 | - |
808 | - ASSERT_TRUE(connection); |
809 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
810 | - EXPECT_STREQ(mir_connection_get_error_message(connection), ""); |
811 | - |
812 | - mir_connection_release(connection); |
813 | - } |
814 | - } client_config; |
815 | - |
816 | - launch_client_process(client_config); |
817 | -} |
818 | - |
819 | -TEST_F(DefaultDisplayServerTestFixture, client_library_creates_surface) |
820 | -{ |
821 | - struct ClientConfig : ClientConfigCommon |
822 | - { |
823 | - void exec() |
824 | - { |
825 | - |
826 | - mir_wait_for(mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this)); |
827 | - |
828 | - ASSERT_TRUE(connection != NULL); |
829 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
830 | - EXPECT_STREQ(mir_connection_get_error_message(connection), ""); |
831 | - |
832 | - MirSurfaceParameters const request_params = |
833 | - { |
834 | - __PRETTY_FUNCTION__, |
835 | - 640, 480, |
836 | - mir_pixel_format_abgr_8888, |
837 | - mir_buffer_usage_hardware, |
838 | - mir_display_output_id_invalid |
839 | - }; |
840 | - |
841 | - mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
842 | - |
843 | - ASSERT_TRUE(surface != NULL); |
844 | - EXPECT_TRUE(mir_surface_is_valid(surface)); |
845 | - EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
846 | - |
847 | - MirSurfaceParameters response_params; |
848 | - mir_surface_get_parameters(surface, &response_params); |
849 | - EXPECT_EQ(request_params.width, response_params.width); |
850 | - EXPECT_EQ(request_params.height, response_params.height); |
851 | - EXPECT_EQ(request_params.pixel_format, response_params.pixel_format); |
852 | - EXPECT_EQ(request_params.buffer_usage, response_params.buffer_usage); |
853 | - |
854 | - |
855 | - mir_wait_for(mir_surface_release( surface, release_surface_callback, this)); |
856 | - |
857 | - ASSERT_TRUE(surface == NULL); |
858 | - |
859 | - surface = mir_connection_create_surface_sync(connection, &request_params); |
860 | - |
861 | - ASSERT_TRUE(surface != NULL); |
862 | - EXPECT_TRUE(mir_surface_is_valid(surface)); |
863 | - EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
864 | - |
865 | - mir_surface_get_parameters(surface, &response_params); |
866 | - EXPECT_EQ(request_params.width, response_params.width); |
867 | - EXPECT_EQ(request_params.height, response_params.height); |
868 | - EXPECT_EQ(request_params.pixel_format, |
869 | - response_params.pixel_format); |
870 | - EXPECT_EQ(request_params.buffer_usage, |
871 | - response_params.buffer_usage); |
872 | - |
873 | - mir_surface_release_sync(surface); |
874 | - |
875 | - mir_connection_release(connection); |
876 | - } |
877 | - } client_config; |
878 | - |
879 | - launch_client_process(client_config); |
880 | -} |
881 | - |
882 | -TEST_F(DefaultDisplayServerTestFixture, surface_types) |
883 | -{ |
884 | - struct ClientConfig : ClientConfigCommon |
885 | - { |
886 | - void exec() |
887 | - { |
888 | - |
889 | - mir_wait_for(mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this)); |
890 | - |
891 | - ASSERT_TRUE(connection != NULL); |
892 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
893 | - EXPECT_STREQ(mir_connection_get_error_message(connection), ""); |
894 | - |
895 | - MirSurfaceParameters const request_params = |
896 | - { |
897 | - __PRETTY_FUNCTION__, |
898 | - 640, 480, |
899 | - mir_pixel_format_abgr_8888, |
900 | - mir_buffer_usage_hardware, |
901 | - mir_display_output_id_invalid |
902 | - }; |
903 | - |
904 | - mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
905 | - |
906 | - ASSERT_TRUE(surface != NULL); |
907 | - EXPECT_TRUE(mir_surface_is_valid(surface)); |
908 | - EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
909 | - |
910 | - EXPECT_EQ(mir_surface_type_normal, |
911 | - mir_surface_get_type(surface)); |
912 | - |
913 | - mir_wait_for(mir_surface_set_type(surface, |
914 | - mir_surface_type_freestyle)); |
915 | - EXPECT_EQ(mir_surface_type_freestyle, |
916 | - mir_surface_get_type(surface)); |
917 | - |
918 | - mir_wait_for(mir_surface_set_type(surface, |
919 | - static_cast<MirSurfaceType>(999))); |
920 | - EXPECT_EQ(mir_surface_type_freestyle, |
921 | - mir_surface_get_type(surface)); |
922 | - |
923 | - mir_wait_for(mir_surface_set_type(surface, |
924 | - mir_surface_type_dialog)); |
925 | - EXPECT_EQ(mir_surface_type_dialog, |
926 | - mir_surface_get_type(surface)); |
927 | - |
928 | - mir_wait_for(mir_surface_set_type(surface, |
929 | - static_cast<MirSurfaceType>(888))); |
930 | - EXPECT_EQ(mir_surface_type_dialog, |
931 | - mir_surface_get_type(surface)); |
932 | - |
933 | - // Stress-test synchronization logic with some flooding |
934 | - for (int i = 0; i < 100; i++) |
935 | - { |
936 | - mir_surface_set_type(surface, mir_surface_type_normal); |
937 | - mir_surface_set_type(surface, mir_surface_type_utility); |
938 | - mir_surface_set_type(surface, mir_surface_type_dialog); |
939 | - mir_surface_set_type(surface, mir_surface_type_overlay); |
940 | - mir_surface_set_type(surface, mir_surface_type_freestyle); |
941 | - mir_wait_for(mir_surface_set_type(surface, |
942 | - mir_surface_type_popover)); |
943 | - ASSERT_EQ(mir_surface_type_popover, |
944 | - mir_surface_get_type(surface)); |
945 | - } |
946 | - |
947 | - mir_wait_for(mir_surface_release(surface, release_surface_callback, |
948 | - this)); |
949 | - |
950 | - mir_connection_release(connection); |
951 | - } |
952 | - } client_config; |
953 | - |
954 | - launch_client_process(client_config); |
955 | -} |
956 | - |
957 | -TEST_F(DefaultDisplayServerTestFixture, client_can_set_surface_state) |
958 | -{ |
959 | - struct ClientConfig : ClientConfigCommon |
960 | - { |
961 | - void exec() |
962 | - { |
963 | - connection = mir_connect_sync(mir_test_socket, __PRETTY_FUNCTION__); |
964 | - ASSERT_TRUE(connection != NULL); |
965 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
966 | - EXPECT_STREQ(mir_connection_get_error_message(connection), ""); |
967 | - |
968 | - MirSurfaceParameters const request_params = |
969 | - { |
970 | - __PRETTY_FUNCTION__, |
971 | - 640, 480, |
972 | - mir_pixel_format_abgr_8888, |
973 | - mir_buffer_usage_hardware, |
974 | - mir_display_output_id_invalid |
975 | - }; |
976 | - |
977 | - surface = mir_connection_create_surface_sync(connection, |
978 | - &request_params); |
979 | - ASSERT_TRUE(surface != NULL); |
980 | - EXPECT_TRUE(mir_surface_is_valid(surface)); |
981 | - EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
982 | - |
983 | - EXPECT_EQ(mir_surface_state_restored, |
984 | - mir_surface_get_state(surface)); |
985 | - |
986 | - mir_wait_for(mir_surface_set_state(surface, |
987 | - mir_surface_state_fullscreen)); |
988 | - EXPECT_EQ(mir_surface_state_fullscreen, |
989 | - mir_surface_get_state(surface)); |
990 | - |
991 | - mir_wait_for(mir_surface_set_state(surface, |
992 | - static_cast<MirSurfaceState>(999))); |
993 | - EXPECT_EQ(mir_surface_state_fullscreen, |
994 | - mir_surface_get_state(surface)); |
995 | - |
996 | - mir_wait_for(mir_surface_set_state(surface, |
997 | - mir_surface_state_minimized)); |
998 | - EXPECT_EQ(mir_surface_state_minimized, |
999 | - mir_surface_get_state(surface)); |
1000 | - |
1001 | - mir_wait_for(mir_surface_set_state(surface, |
1002 | - static_cast<MirSurfaceState>(888))); |
1003 | - EXPECT_EQ(mir_surface_state_minimized, |
1004 | - mir_surface_get_state(surface)); |
1005 | - |
1006 | - // Stress-test synchronization logic with some flooding |
1007 | - for (int i = 0; i < 100; i++) |
1008 | - { |
1009 | - mir_surface_set_state(surface, mir_surface_state_maximized); |
1010 | - mir_surface_set_state(surface, mir_surface_state_restored); |
1011 | - mir_wait_for(mir_surface_set_state(surface, |
1012 | - mir_surface_state_fullscreen)); |
1013 | - ASSERT_EQ(mir_surface_state_fullscreen, |
1014 | - mir_surface_get_state(surface)); |
1015 | - } |
1016 | - |
1017 | - mir_surface_release_sync(surface); |
1018 | - mir_connection_release(connection); |
1019 | - } |
1020 | - } client_config; |
1021 | - |
1022 | - launch_client_process(client_config); |
1023 | -} |
1024 | - |
1025 | -TEST_F(DefaultDisplayServerTestFixture, client_receives_surface_state_events) |
1026 | -{ |
1027 | - struct ClientConfig : ClientConfigCommon |
1028 | - { |
1029 | - static void event_callback(MirSurface* surface, MirEvent const* event, |
1030 | - void* ctx) |
1031 | - { |
1032 | - ClientConfig* self = static_cast<ClientConfig*>(ctx); |
1033 | - self->last_event = *event; |
1034 | - self->last_event_surface = surface; |
1035 | - } |
1036 | - |
1037 | - void exec() |
1038 | - { |
1039 | - connection = mir_connect_sync(mir_test_socket, __PRETTY_FUNCTION__); |
1040 | - ASSERT_TRUE(connection != NULL); |
1041 | - ASSERT_TRUE(mir_connection_is_valid(connection)); |
1042 | - |
1043 | - MirSurfaceParameters const request_params = |
1044 | - { |
1045 | - __PRETTY_FUNCTION__, |
1046 | - 640, 480, |
1047 | - mir_pixel_format_abgr_8888, |
1048 | - mir_buffer_usage_hardware, |
1049 | - mir_display_output_id_invalid |
1050 | - }; |
1051 | - |
1052 | - memset(&last_event, 0, sizeof last_event); |
1053 | - last_event_surface = nullptr; |
1054 | - |
1055 | - MirEventDelegate delegate{&event_callback, this}; |
1056 | - MirSurface* other_surface = |
1057 | - mir_connection_create_surface_sync(connection, &request_params); |
1058 | - ASSERT_TRUE(other_surface != NULL); |
1059 | - ASSERT_TRUE(mir_surface_is_valid(other_surface)); |
1060 | - mir_surface_set_event_handler(other_surface, nullptr); |
1061 | - |
1062 | - surface = |
1063 | - mir_connection_create_surface_sync(connection, &request_params); |
1064 | - ASSERT_TRUE(surface != NULL); |
1065 | - ASSERT_TRUE(mir_surface_is_valid(surface)); |
1066 | - |
1067 | - mir_surface_set_event_handler(surface, &delegate); |
1068 | - |
1069 | - int surface_id = mir_debug_surface_id(surface); |
1070 | - |
1071 | - mir_wait_for(mir_surface_set_state(surface, |
1072 | - mir_surface_state_fullscreen)); |
1073 | - mir_wait_for(mir_surface_set_state(other_surface, |
1074 | - mir_surface_state_minimized)); |
1075 | - EXPECT_EQ(surface, last_event_surface); |
1076 | - EXPECT_EQ(mir_event_type_surface, last_event.type); |
1077 | - EXPECT_EQ(surface_id, last_event.surface.id); |
1078 | - EXPECT_EQ(mir_surface_attrib_state, last_event.surface.attrib); |
1079 | - EXPECT_EQ(mir_surface_state_fullscreen, last_event.surface.value); |
1080 | - |
1081 | - mir_wait_for(mir_surface_set_state(surface, |
1082 | - static_cast<MirSurfaceState>(999))); |
1083 | - EXPECT_EQ(surface, last_event_surface); |
1084 | - EXPECT_EQ(mir_event_type_surface, last_event.type); |
1085 | - EXPECT_EQ(surface_id, last_event.surface.id); |
1086 | - EXPECT_EQ(mir_surface_attrib_state, last_event.surface.attrib); |
1087 | - EXPECT_EQ(mir_surface_state_fullscreen, last_event.surface.value); |
1088 | - |
1089 | - memset(&last_event, 0, sizeof last_event); |
1090 | - last_event_surface = nullptr; |
1091 | - |
1092 | - mir_wait_for(mir_surface_set_state(surface, |
1093 | - mir_surface_state_minimized)); |
1094 | - EXPECT_EQ(surface, last_event_surface); |
1095 | - EXPECT_EQ(mir_event_type_surface, last_event.type); |
1096 | - EXPECT_EQ(surface_id, last_event.surface.id); |
1097 | - EXPECT_EQ(mir_surface_attrib_state, last_event.surface.attrib); |
1098 | - EXPECT_EQ(mir_surface_state_minimized, last_event.surface.value); |
1099 | - |
1100 | - memset(&last_event, 0, sizeof last_event); |
1101 | - last_event_surface = nullptr; |
1102 | - |
1103 | - mir_wait_for(mir_surface_set_state(surface, |
1104 | - static_cast<MirSurfaceState>(777))); |
1105 | - mir_wait_for(mir_surface_set_state(other_surface, |
1106 | - mir_surface_state_maximized)); |
1107 | - EXPECT_EQ(0, last_event_surface); |
1108 | - EXPECT_EQ(0, last_event.type); |
1109 | - EXPECT_EQ(0, last_event.surface.id); |
1110 | - EXPECT_EQ(0, last_event.surface.attrib); |
1111 | - EXPECT_EQ(0, last_event.surface.value); |
1112 | - |
1113 | - mir_surface_release_sync(surface); |
1114 | - mir_surface_release_sync(other_surface); |
1115 | - mir_connection_release(connection); |
1116 | - } |
1117 | - |
1118 | - MirEvent last_event; |
1119 | - MirSurface* last_event_surface; |
1120 | - } client_config; |
1121 | - |
1122 | - launch_client_process(client_config); |
1123 | -} |
1124 | - |
1125 | -TEST_F(DefaultDisplayServerTestFixture, client_receives_surface_dpi_value) |
1126 | -{ |
1127 | - struct ClientConfig : ClientConfigCommon |
1128 | - { |
1129 | - void exec() |
1130 | - { |
1131 | - connection = mir_connect_sync(mir_test_socket, __PRETTY_FUNCTION__); |
1132 | - ASSERT_TRUE(connection != NULL); |
1133 | - ASSERT_TRUE(mir_connection_is_valid(connection)); |
1134 | - |
1135 | - MirSurfaceParameters const request_params = |
1136 | - { |
1137 | - __PRETTY_FUNCTION__, |
1138 | - 640, 480, |
1139 | - mir_pixel_format_abgr_8888, |
1140 | - mir_buffer_usage_hardware, |
1141 | - mir_display_output_id_invalid |
1142 | - }; |
1143 | - |
1144 | - surface = |
1145 | - mir_connection_create_surface_sync(connection, &request_params); |
1146 | - ASSERT_TRUE(surface != NULL); |
1147 | - ASSERT_TRUE(mir_surface_is_valid(surface)); |
1148 | - |
1149 | - // Expect zero (not wired up to detect the physical display yet) |
1150 | - EXPECT_EQ(0, mir_surface_get_dpi(surface)); |
1151 | - |
1152 | - mir_surface_release_sync(surface); |
1153 | - mir_connection_release(connection); |
1154 | - } |
1155 | - } client_config; |
1156 | - |
1157 | - launch_client_process(client_config); |
1158 | -} |
1159 | - |
1160 | -#ifndef ANDROID |
1161 | -TEST_F(DefaultDisplayServerTestFixture, surface_scanout_flag_toggles) |
1162 | -{ |
1163 | - struct ClientConfig : ClientConfigCommon |
1164 | - { |
1165 | - void exec() |
1166 | - { |
1167 | - connection = mir_connect_sync(mir_test_socket, __PRETTY_FUNCTION__); |
1168 | - ASSERT_TRUE(connection != NULL); |
1169 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1170 | - EXPECT_STREQ(mir_connection_get_error_message(connection), ""); |
1171 | - |
1172 | - MirSurfaceParameters parm = |
1173 | - { |
1174 | - __PRETTY_FUNCTION__, |
1175 | - 1280, 1024, |
1176 | - mir_pixel_format_abgr_8888, |
1177 | - mir_buffer_usage_hardware, |
1178 | - mir_display_output_id_invalid |
1179 | - }; |
1180 | - |
1181 | - surface = mir_connection_create_surface_sync(connection, &parm); |
1182 | - ASSERT_TRUE(mir_surface_is_valid(surface)); |
1183 | - MirNativeBuffer *native; |
1184 | - mir_surface_get_current_buffer(surface, &native); |
1185 | - EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
1186 | - mir_surface_swap_buffers_sync(surface); |
1187 | - EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
1188 | - mir_surface_release_sync(surface); |
1189 | - |
1190 | - parm.width = 100; |
1191 | - parm.height = 100; |
1192 | - |
1193 | - surface = mir_connection_create_surface_sync(connection, &parm); |
1194 | - ASSERT_TRUE(mir_surface_is_valid(surface)); |
1195 | - mir_surface_get_current_buffer(surface, &native); |
1196 | - EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
1197 | - mir_surface_swap_buffers_sync(surface); |
1198 | - EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
1199 | - mir_surface_release_sync(surface); |
1200 | - |
1201 | - parm.width = 800; |
1202 | - parm.height = 600; |
1203 | - parm.buffer_usage = mir_buffer_usage_software; |
1204 | - |
1205 | - surface = mir_connection_create_surface_sync(connection, &parm); |
1206 | - ASSERT_TRUE(mir_surface_is_valid(surface)); |
1207 | - mir_surface_get_current_buffer(surface, &native); |
1208 | - EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
1209 | - mir_surface_swap_buffers_sync(surface); |
1210 | - EXPECT_FALSE(native->flags & mir_buffer_flag_can_scanout); |
1211 | - mir_surface_release_sync(surface); |
1212 | - |
1213 | - parm.buffer_usage = mir_buffer_usage_hardware; |
1214 | - |
1215 | - surface = mir_connection_create_surface_sync(connection, &parm); |
1216 | - ASSERT_TRUE(mir_surface_is_valid(surface)); |
1217 | - mir_surface_get_current_buffer(surface, &native); |
1218 | - EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
1219 | - mir_surface_swap_buffers_sync(surface); |
1220 | - EXPECT_TRUE(native->flags & mir_buffer_flag_can_scanout); |
1221 | - mir_surface_release_sync(surface); |
1222 | - |
1223 | - mir_connection_release(connection); |
1224 | - } |
1225 | - |
1226 | - // this test relies on gbm drivers, use real graphics always |
1227 | - bool use_real_graphics(mir::options::Option const&) override |
1228 | - { |
1229 | - return true; |
1230 | - } |
1231 | - } client_config; |
1232 | - |
1233 | - launch_client_process(client_config); |
1234 | -} |
1235 | -#endif |
1236 | - |
1237 | -#ifdef ANDROID |
1238 | -// Mir's Android test infrastructure isn't quite ready for this yet. |
1239 | -TEST_F(DefaultDisplayServerTestFixture, DISABLED_client_gets_buffer_dimensions) |
1240 | -#else |
1241 | -TEST_F(DefaultDisplayServerTestFixture, client_gets_buffer_dimensions) |
1242 | -#endif |
1243 | -{ |
1244 | - struct ClientConfig : ClientConfigCommon |
1245 | - { |
1246 | - void exec() |
1247 | - { |
1248 | - connection = mir_connect_sync(mir_test_socket, __PRETTY_FUNCTION__); |
1249 | - ASSERT_TRUE(connection != NULL); |
1250 | - ASSERT_TRUE(mir_connection_is_valid(connection)); |
1251 | - |
1252 | - MirSurfaceParameters parm = |
1253 | - { |
1254 | - __PRETTY_FUNCTION__, |
1255 | - 0, 0, |
1256 | - mir_pixel_format_abgr_8888, |
1257 | - mir_buffer_usage_hardware, |
1258 | - mir_display_output_id_invalid |
1259 | - }; |
1260 | - |
1261 | - struct {int width, height;} const sizes[] = |
1262 | - { |
1263 | - {12, 34}, |
1264 | - {56, 78}, |
1265 | - {90, 21}, |
1266 | - }; |
1267 | - |
1268 | - for (auto const& size : sizes) |
1269 | - { |
1270 | - parm.width = size.width; |
1271 | - parm.height = size.height; |
1272 | - |
1273 | - surface = mir_connection_create_surface_sync(connection, &parm); |
1274 | - ASSERT_TRUE(surface != NULL); |
1275 | - ASSERT_TRUE(mir_surface_is_valid(surface)); |
1276 | - |
1277 | - MirNativeBuffer *native = NULL; |
1278 | - mir_surface_get_current_buffer(surface, &native); |
1279 | - ASSERT_TRUE(native != NULL); |
1280 | - EXPECT_EQ(parm.width, native->width); |
1281 | - EXPECT_EQ(parm.height, native->height); |
1282 | - |
1283 | - mir_surface_swap_buffers_sync(surface); |
1284 | - mir_surface_get_current_buffer(surface, &native); |
1285 | - ASSERT_TRUE(native != NULL); |
1286 | - EXPECT_EQ(parm.width, native->width); |
1287 | - EXPECT_EQ(parm.height, native->height); |
1288 | - |
1289 | - mir_surface_release_sync(surface); |
1290 | - } |
1291 | - |
1292 | - mir_connection_release(connection); |
1293 | - } |
1294 | - |
1295 | - bool use_real_graphics(mir::options::Option const&) override |
1296 | - { |
1297 | - return true; |
1298 | - } |
1299 | - } client_config; |
1300 | - |
1301 | - launch_client_process(client_config); |
1302 | -} |
1303 | - |
1304 | -TEST_F(DefaultDisplayServerTestFixture, client_library_creates_multiple_surfaces) |
1305 | -{ |
1306 | - int const n_surfaces = 13; |
1307 | - |
1308 | - struct ClientConfig : ClientConfigCommon |
1309 | - { |
1310 | - ClientConfig(int n_surfaces) : n_surfaces(n_surfaces) |
1311 | - { |
1312 | - } |
1313 | - |
1314 | - void surface_created(MirSurface * new_surface) |
1315 | - { |
1316 | - surfaces.insert(new_surface); |
1317 | - } |
1318 | - |
1319 | - void surface_released(MirSurface * surface) |
1320 | - { |
1321 | - surfaces.erase(surface); |
1322 | - } |
1323 | - |
1324 | - MirSurface * any_surface() |
1325 | - { |
1326 | - return *surfaces.begin(); |
1327 | - } |
1328 | - |
1329 | - size_t current_surface_count() |
1330 | - { |
1331 | - return surfaces.size(); |
1332 | - } |
1333 | - |
1334 | - void exec() |
1335 | - { |
1336 | - mir_wait_for(mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this)); |
1337 | - |
1338 | - ASSERT_TRUE(connection != NULL); |
1339 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1340 | - EXPECT_STREQ(mir_connection_get_error_message(connection), ""); |
1341 | - |
1342 | - for (int i = 0; i != n_surfaces; ++i) |
1343 | - { |
1344 | - old_surface_count = current_surface_count(); |
1345 | - |
1346 | - MirSurfaceParameters const request_params = |
1347 | - { |
1348 | - __PRETTY_FUNCTION__, |
1349 | - 640, 480, |
1350 | - mir_pixel_format_abgr_8888, |
1351 | - mir_buffer_usage_hardware, |
1352 | - mir_display_output_id_invalid |
1353 | - }; |
1354 | - |
1355 | - mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
1356 | - |
1357 | - ASSERT_EQ(old_surface_count + 1, current_surface_count()); |
1358 | - } |
1359 | - for (int i = 0; i != n_surfaces; ++i) |
1360 | - { |
1361 | - old_surface_count = current_surface_count(); |
1362 | - |
1363 | - ASSERT_NE(old_surface_count, 0u); |
1364 | - |
1365 | - MirSurface * surface = any_surface(); |
1366 | - mir_wait_for(mir_surface_release( surface, release_surface_callback, this)); |
1367 | - |
1368 | - ASSERT_EQ(old_surface_count - 1, current_surface_count()); |
1369 | - } |
1370 | - |
1371 | - mir_connection_release(connection); |
1372 | - } |
1373 | - |
1374 | - int n_surfaces; |
1375 | - std::set<MirSurface *> surfaces; |
1376 | - size_t old_surface_count; |
1377 | - } client_config(n_surfaces); |
1378 | - |
1379 | - launch_client_process(client_config); |
1380 | -} |
1381 | - |
1382 | -TEST_F(DefaultDisplayServerTestFixture, client_library_accesses_and_advances_buffers) |
1383 | -{ |
1384 | - struct ClientConfig : ClientConfigCommon |
1385 | - { |
1386 | - void exec() |
1387 | - { |
1388 | - |
1389 | - mir_wait_for(mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this)); |
1390 | - |
1391 | - ASSERT_TRUE(connection != NULL); |
1392 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1393 | - EXPECT_STREQ("", mir_connection_get_error_message(connection)); |
1394 | - |
1395 | - MirSurfaceParameters const request_params = |
1396 | - { |
1397 | - __PRETTY_FUNCTION__, |
1398 | - 640, 480, |
1399 | - mir_pixel_format_abgr_8888, |
1400 | - mir_buffer_usage_hardware, |
1401 | - mir_display_output_id_invalid |
1402 | - }; |
1403 | - |
1404 | - mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
1405 | - ASSERT_TRUE(surface != NULL); |
1406 | - |
1407 | - buffers = 0; |
1408 | - mir_wait_for(mir_surface_swap_buffers(surface, next_buffer_callback, this)); |
1409 | - EXPECT_EQ(buffers, 1); |
1410 | - |
1411 | - mir_wait_for(mir_surface_release( surface, release_surface_callback, this)); |
1412 | - |
1413 | - ASSERT_TRUE(surface == NULL); |
1414 | - |
1415 | - mir_connection_release(connection); |
1416 | - } |
1417 | - } client_config; |
1418 | - |
1419 | - launch_client_process(client_config); |
1420 | -} |
1421 | - |
1422 | -TEST_F(DefaultDisplayServerTestFixture, fully_synchronous_client) |
1423 | -{ |
1424 | - struct ClientConfig : ClientConfigCommon |
1425 | - { |
1426 | - void exec() |
1427 | - { |
1428 | - connection = mir_connect_sync(mir_test_socket, |
1429 | - __PRETTY_FUNCTION__); |
1430 | - |
1431 | - ASSERT_TRUE(connection != NULL); |
1432 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1433 | - EXPECT_STREQ("", mir_connection_get_error_message(connection)); |
1434 | - |
1435 | - MirSurfaceParameters const request_params = |
1436 | - { |
1437 | - __PRETTY_FUNCTION__, |
1438 | - 640, 480, |
1439 | - mir_pixel_format_abgr_8888, |
1440 | - mir_buffer_usage_software, |
1441 | - mir_display_output_id_invalid |
1442 | - }; |
1443 | - |
1444 | - surface = mir_connection_create_surface_sync(connection, &request_params); |
1445 | - ASSERT_TRUE(surface != NULL); |
1446 | - EXPECT_TRUE(mir_surface_is_valid(surface)); |
1447 | - EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
1448 | - |
1449 | - mir_surface_swap_buffers_sync(surface); |
1450 | - EXPECT_TRUE(mir_surface_is_valid(surface)); |
1451 | - EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
1452 | - |
1453 | - mir_surface_release_sync(surface); |
1454 | - |
1455 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1456 | - EXPECT_STREQ("", mir_connection_get_error_message(connection)); |
1457 | - mir_connection_release(connection); |
1458 | - } |
1459 | - } client_config; |
1460 | - |
1461 | - launch_client_process(client_config); |
1462 | -} |
1463 | - |
1464 | -TEST_F(DefaultDisplayServerTestFixture, highly_threaded_client) |
1465 | -{ |
1466 | - struct ClientConfig : ClientConfigCommon |
1467 | - { |
1468 | - static void nosey_thread(MirSurface *surf) |
1469 | - { |
1470 | - for (int i = 0; i < 10; i++) |
1471 | - { |
1472 | - mir_wait_for_one(mir_surface_set_state(surf, |
1473 | - mir_surface_state_maximized)); |
1474 | - mir_wait_for_one(mir_surface_set_type(surf, |
1475 | - mir_surface_type_normal)); |
1476 | - mir_wait_for_one(mir_surface_set_state(surf, |
1477 | - mir_surface_state_restored)); |
1478 | - mir_wait_for_one(mir_surface_set_type(surf, |
1479 | - mir_surface_type_utility)); |
1480 | - mir_wait_for_one(mir_surface_set_state(surf, |
1481 | - mir_surface_state_fullscreen)); |
1482 | - mir_wait_for_one(mir_surface_set_type(surf, |
1483 | - mir_surface_type_dialog)); |
1484 | - mir_wait_for_one(mir_surface_set_state(surf, |
1485 | - mir_surface_state_minimized)); |
1486 | - } |
1487 | - } |
1488 | - |
1489 | - void exec() |
1490 | - { |
1491 | - connection = mir_connect_sync(mir_test_socket, |
1492 | - __PRETTY_FUNCTION__); |
1493 | - |
1494 | - ASSERT_TRUE(connection != NULL); |
1495 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1496 | - EXPECT_STREQ("", mir_connection_get_error_message(connection)); |
1497 | - |
1498 | - MirSurfaceParameters const request_params = |
1499 | - { |
1500 | - __PRETTY_FUNCTION__, |
1501 | - 640, 480, |
1502 | - mir_pixel_format_abgr_8888, |
1503 | - mir_buffer_usage_software, |
1504 | - mir_display_output_id_invalid |
1505 | - }; |
1506 | - |
1507 | - surface = mir_connection_create_surface_sync(connection, |
1508 | - &request_params); |
1509 | - ASSERT_TRUE(surface != NULL); |
1510 | - EXPECT_TRUE(mir_surface_is_valid(surface)); |
1511 | - EXPECT_STREQ(mir_surface_get_error_message(surface), ""); |
1512 | - |
1513 | - std::thread a(nosey_thread, surface); |
1514 | - std::thread b(nosey_thread, surface); |
1515 | - std::thread c(nosey_thread, surface); |
1516 | - |
1517 | - a.join(); |
1518 | - b.join(); |
1519 | - c.join(); |
1520 | - |
1521 | - EXPECT_EQ(mir_surface_type_dialog, |
1522 | - mir_surface_get_type(surface)); |
1523 | - EXPECT_EQ(mir_surface_state_minimized, |
1524 | - mir_surface_get_state(surface)); |
1525 | - |
1526 | - mir_surface_release_sync(surface); |
1527 | - |
1528 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1529 | - EXPECT_STREQ("", mir_connection_get_error_message(connection)); |
1530 | - mir_connection_release(connection); |
1531 | - } |
1532 | - } client_config; |
1533 | - |
1534 | - launch_client_process(client_config); |
1535 | -} |
1536 | - |
1537 | -TEST_F(DefaultDisplayServerTestFixture, client_library_accesses_platform_package) |
1538 | -{ |
1539 | - struct ClientConfig : ClientConfigCommon |
1540 | - { |
1541 | - void exec() |
1542 | - { |
1543 | - mir_wait_for(mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this)); |
1544 | - ASSERT_TRUE(connection != NULL); |
1545 | - |
1546 | - MirPlatformPackage platform_package; |
1547 | - platform_package.data_items = -1; |
1548 | - platform_package.fd_items = -1; |
1549 | - |
1550 | - mir_connection_get_platform(connection, &platform_package); |
1551 | - EXPECT_GE(0, platform_package.data_items); |
1552 | - EXPECT_GE(0, platform_package.fd_items); |
1553 | - |
1554 | - mir_connection_release(connection); |
1555 | - } |
1556 | - } client_config; |
1557 | - |
1558 | - launch_client_process(client_config); |
1559 | -} |
1560 | - |
1561 | -TEST_F(DefaultDisplayServerTestFixture, client_library_accesses_display_info) |
1562 | -{ |
1563 | - struct ClientConfig : ClientConfigCommon |
1564 | - { |
1565 | - void exec() |
1566 | - { |
1567 | - mir_wait_for(mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this)); |
1568 | - ASSERT_TRUE(connection != NULL); |
1569 | - |
1570 | - auto configuration = mir_connection_create_display_config(connection); |
1571 | - ASSERT_NE(nullptr, configuration); |
1572 | - ASSERT_GT(configuration->num_outputs, 0u); |
1573 | - ASSERT_NE(nullptr, configuration->outputs); |
1574 | - for (auto i=0u; i < configuration->num_outputs; i++) |
1575 | - { |
1576 | - MirDisplayOutput* disp = &configuration->outputs[i]; |
1577 | - ASSERT_NE(nullptr, disp); |
1578 | - EXPECT_GE(disp->num_modes, disp->current_mode); |
1579 | - EXPECT_GE(disp->num_output_formats, disp->current_format); |
1580 | - } |
1581 | - |
1582 | - mir_display_config_destroy(configuration); |
1583 | - mir_connection_release(connection); |
1584 | - } |
1585 | - } client_config; |
1586 | - |
1587 | - launch_client_process(client_config); |
1588 | -} |
1589 | - |
1590 | -TEST_F(DefaultDisplayServerTestFixture, connect_errors_handled) |
1591 | -{ |
1592 | - struct ClientConfig : ClientConfigCommon |
1593 | - { |
1594 | - void exec() |
1595 | - { |
1596 | - mir_wait_for(mir_connect("garbage", __PRETTY_FUNCTION__, connection_callback, this)); |
1597 | - ASSERT_TRUE(connection != NULL); |
1598 | - |
1599 | - char const* error = mir_connection_get_error_message(connection); |
1600 | - |
1601 | - if (std::strcmp("connect: No such file or directory", error) && |
1602 | - std::strcmp("Can't find MIR server", error) && |
1603 | - std::strcmp("Failed to connect to server socket", error)) |
1604 | - { |
1605 | - FAIL() << error; |
1606 | - } |
1607 | - } |
1608 | - |
1609 | - //we are testing the connect function itself, without getting to the |
1610 | - // point where drivers are used, so force using production config |
1611 | - bool use_real_graphics(mir::options::Option const&) override |
1612 | - { |
1613 | - return true; |
1614 | - } |
1615 | - } client_config; |
1616 | - |
1617 | - launch_client_process(client_config); |
1618 | -} |
1619 | - |
1620 | -TEST_F(DefaultDisplayServerTestFixture, connect_errors_dont_blow_up) |
1621 | -{ |
1622 | - struct ClientConfig : ClientConfigCommon |
1623 | - { |
1624 | - void exec() |
1625 | - { |
1626 | - mir_wait_for(mir_connect("garbage", __PRETTY_FUNCTION__, connection_callback, this)); |
1627 | - |
1628 | - MirSurfaceParameters const request_params = |
1629 | - { |
1630 | - __PRETTY_FUNCTION__, |
1631 | - 640, 480, |
1632 | - mir_pixel_format_abgr_8888, |
1633 | - mir_buffer_usage_hardware, |
1634 | - mir_display_output_id_invalid |
1635 | - }; |
1636 | - |
1637 | - mir_wait_for(mir_connection_create_surface(connection, &request_params, create_surface_callback, this)); |
1638 | -// TODO surface_create needs to fail safe too. After that is done we should add the following: |
1639 | -// TODO mir_wait_for(mir_surface_swap_buffers(surface, next_buffer_callback, this)); |
1640 | -// TODO mir_wait_for(mir_surface_release( surface, release_surface_callback, this)); |
1641 | - |
1642 | - mir_connection_release(connection); |
1643 | - } |
1644 | - |
1645 | - //we are testing the connect function itself, without getting to the |
1646 | - // point where drivers are used, so force using production config |
1647 | - bool use_real_graphics(mir::options::Option const&) override |
1648 | - { |
1649 | - return true; |
1650 | - } |
1651 | - } client_config; |
1652 | - |
1653 | - launch_client_process(client_config); |
1654 | -} |
1655 | - |
1656 | bool signalled; |
1657 | static void SIGIO_handler(int /*signo*/) |
1658 | { |
1659 | @@ -1086,76 +207,4 @@ |
1660 | launch_client_process(client_config); |
1661 | } |
1662 | |
1663 | -TEST_F(DefaultDisplayServerTestFixture, MultiSurfaceClientTracksBufferFdsCorrectly) |
1664 | -{ |
1665 | - struct ClientConfig : ClientConfigCommon |
1666 | - { |
1667 | - void exec() |
1668 | - { |
1669 | - |
1670 | - mir_wait_for(mir_connect(mir_test_socket, __PRETTY_FUNCTION__, connection_callback, this)); |
1671 | - |
1672 | - ASSERT_TRUE(connection != NULL); |
1673 | - EXPECT_TRUE(mir_connection_is_valid(connection)); |
1674 | - EXPECT_STREQ("", mir_connection_get_error_message(connection)); |
1675 | - |
1676 | - MirSurfaceParameters const request_params = |
1677 | - { |
1678 | - __PRETTY_FUNCTION__, |
1679 | - 640, 480, |
1680 | - mir_pixel_format_abgr_8888, |
1681 | - mir_buffer_usage_hardware, |
1682 | - mir_display_output_id_invalid |
1683 | - }; |
1684 | - |
1685 | - surf_one = mir_connection_create_surface_sync(connection, &request_params); |
1686 | - surf_two = mir_connection_create_surface_sync(connection, &request_params); |
1687 | - |
1688 | - ASSERT_TRUE(surf_one != NULL); |
1689 | - ASSERT_TRUE(surf_two != NULL); |
1690 | - |
1691 | - buffers = 0; |
1692 | - |
1693 | - while (buffers < 1024) |
1694 | - { |
1695 | - mir_surface_swap_buffers_sync(surf_one); |
1696 | - mir_surface_swap_buffers_sync(surf_two); |
1697 | - |
1698 | - buffers++; |
1699 | - } |
1700 | - |
1701 | - /* We should not have any stray fds hanging around. |
1702 | - Test this by trying to open a new one */ |
1703 | - int canary_fd; |
1704 | - canary_fd = open("/dev/null", O_RDONLY); |
1705 | - |
1706 | - ASSERT_TRUE(canary_fd > 0) << "Failed to open canary file descriptor: "<< strerror(errno); |
1707 | - EXPECT_TRUE(canary_fd < 1024); |
1708 | - |
1709 | - close(canary_fd); |
1710 | - |
1711 | - mir_wait_for(mir_surface_release(surf_one, release_surface_callback, this)); |
1712 | - mir_wait_for(mir_surface_release(surf_two, release_surface_callback, this)); |
1713 | - |
1714 | - ASSERT_TRUE(surf_one == NULL); |
1715 | - ASSERT_TRUE(surf_two == NULL); |
1716 | - |
1717 | - mir_connection_release(connection); |
1718 | - } |
1719 | - |
1720 | - virtual void surface_released (MirSurface* surf) |
1721 | - { |
1722 | - if (surf == surf_one) |
1723 | - surf_one = NULL; |
1724 | - if (surf == surf_two) |
1725 | - surf_two = NULL; |
1726 | - } |
1727 | - |
1728 | - MirSurface* surf_one; |
1729 | - MirSurface* surf_two; |
1730 | - } client_config; |
1731 | - |
1732 | - launch_client_process(client_config); |
1733 | -} |
1734 | - |
1735 | } |
PASSED: Continuous integration, rev:1678 jenkins. qa.ubuntu. com/job/ mir-team- mir-development -branch- ci/1799/ jenkins. qa.ubuntu. com/job/ mir-android- utopic- i386-build/ 433 jenkins. qa.ubuntu. com/job/ mir-clang- utopic- amd64-build/ 434 jenkins. qa.ubuntu. com/job/ mir-mediumtests -utopic- touch/432 jenkins. qa.ubuntu. com/job/ mir-team- mir-development -branch- utopic- amd64-ci/ 318 jenkins. qa.ubuntu. com/job/ mir-team- mir-development -branch- utopic- amd64-ci/ 318/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ mir-team- mir-development -branch- utopic- armhf-ci/ 317 jenkins. qa.ubuntu. com/job/ mir-team- mir-development -branch- utopic- armhf-ci/ 317/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- armhf/1197 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- armhf/1197/ artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ mir-mediumtests -runner- mako/1646 s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 8015
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/mir- team-mir- development- branch- ci/1799/ rebuild
http://