Mir

Merge lp:~alan-griffiths/mir/rework-test_client_library.cpp-mk2 into lp:mir

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
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 }

Subscribers

People subscribed via source and target branches