Mir

Merge lp:~afrantzis/mir/platform-operation-client-api-remove-opcode into lp:mir/0.11

Proposed by Alexandros Frantzis
Status: Superseded
Proposed branch: lp:~afrantzis/mir/platform-operation-client-api-remove-opcode
Merge into: lp:mir/0.11
Diff against target: 875 lines (+313/-159)
21 files modified
client-ABI-sha1sums (+1/-1)
include/client/mir_toolkit/mir_connection.h (+1/-2)
src/client/mir_connection.cpp (+9/-22)
src/client/mir_connection.h (+0/-9)
src/client/mir_connection_api.cpp (+37/-14)
src/include/client/mir/client_platform.h (+11/-0)
src/platforms/android/client/android_client_platform.cpp (+6/-0)
src/platforms/android/client/android_client_platform.h (+1/-1)
src/platforms/mesa/client/client_platform.cpp (+46/-1)
src/platforms/mesa/client/client_platform.h (+4/-0)
src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h (+19/-2)
src/server/graphics/nested/mir_client_host_connection.cpp (+1/-1)
tests/acceptance-tests/CMakeLists.txt (+0/-1)
tests/acceptance-tests/test_client_library_drm.cpp (+0/-46)
tests/acceptance-tests/test_client_library_errors.cpp (+5/-0)
tests/acceptance-tests/test_client_platform_operation.cpp (+2/-2)
tests/include/mir_test_framework/client_platform_factory.h (+3/-9)
tests/mir_test_framework/stub_client_platform_factory.cpp (+5/-0)
tests/unit-tests/client/mesa/test_client_platform.cpp (+77/-6)
tests/unit-tests/client/test_client_mir_surface.cpp (+6/-0)
tests/unit-tests/client/test_mir_connection.cpp (+79/-42)
To merge this branch: bzr merge lp:~afrantzis/mir/platform-operation-client-api-remove-opcode
Reviewer Review Type Date Requested Status
Mir development team Pending
Review via email: mp+248255@code.launchpad.net

This proposal has been superseded by a proposal from 2015-02-02.

Commit message

client: Remove redundant opcode parameter from platform operation API

Description of the change

client: Remove redundant opcode parameter from platform operation API

During development/refactorings of the client platform operation API the redundancy of the opcode parameter (which is a mandatory parameter of a MirPlatformMessage) went unnoticed.

This is a client API/ABI break, but since the platform operation API is not currently used by external code (and could not have been used because we didn't expose any operations), we can get away with it.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'client-ABI-sha1sums'
--- client-ABI-sha1sums 2015-01-29 04:34:12 +0000
+++ client-ABI-sha1sums 2015-02-02 14:38:00 +0000
@@ -1,7 +1,7 @@
1afd66e984f4f8c0303fd25fb6fea32fa47bbd37f include/client/mir_toolkit/debug/surface.h1afd66e984f4f8c0303fd25fb6fea32fa47bbd37f include/client/mir_toolkit/debug/surface.h
2b53736bcb22ddc09aab8275cfdd05c109fdd0f12 include/client/mir_toolkit/mir_client_library_drm.h2b53736bcb22ddc09aab8275cfdd05c109fdd0f12 include/client/mir_toolkit/mir_client_library_drm.h
3532af89e0f48d8d2a7cf01621db25d3338ae3abf include/client/mir_toolkit/mir_client_library.h3532af89e0f48d8d2a7cf01621db25d3338ae3abf include/client/mir_toolkit/mir_client_library.h
4750aa35e6a5173bcba47cb524c508d05a4df746c include/client/mir_toolkit/mir_connection.h4615df675ffba805fb0594e19fb006f514f2100a7 include/client/mir_toolkit/mir_connection.h
51ef8f51a3e3f8d1559266c5af58fbfde7cfabf0a include/client/mir_toolkit/mir_cursor_configuration.h51ef8f51a3e3f8d1559266c5af58fbfde7cfabf0a include/client/mir_toolkit/mir_cursor_configuration.h
6d739af6e64db6b314a727b5fb00be662b98ccd57 include/client/mir_toolkit/mir_platform_message.h6d739af6e64db6b314a727b5fb00be662b98ccd57 include/client/mir_toolkit/mir_platform_message.h
79d50df5a141ca03ee8a79f7e844ed4b8b3b7d5d3 include/client/mir_toolkit/mir_prompt_session.h79d50df5a141ca03ee8a79f7e844ed4b8b3b7d5d3 include/client/mir_toolkit/mir_prompt_session.h
88
=== modified file 'include/client/mir_toolkit/mir_connection.h'
--- include/client/mir_toolkit/mir_connection.h 2015-01-14 06:39:13 +0000
+++ include/client/mir_toolkit/mir_connection.h 2015-02-02 14:38:00 +0000
@@ -178,14 +178,13 @@
178 * until this operation finishes.178 * until this operation finishes.
179 *179 *
180 * \param [in] connection The connection180 * \param [in] connection The connection
181 * \param [in] opcode The opcode of the operation to perform
182 * \param [in] request The message used for this operation181 * \param [in] request The message used for this operation
183 * \param [in] callback The callback to call when the operation finishes182 * \param [in] callback The callback to call when the operation finishes
184 * \param [in,out] context User data passed to the callback function183 * \param [in,out] context User data passed to the callback function
185 * \return A handle that can be passed to mir_wait_for184 * \return A handle that can be passed to mir_wait_for
186 */185 */
187MirWaitHandle* mir_connection_platform_operation(186MirWaitHandle* mir_connection_platform_operation(
188 MirConnection* connection, unsigned int opcode,187 MirConnection* connection,
189 MirPlatformMessage const* request,188 MirPlatformMessage const* request,
190 mir_platform_operation_callback callback, void* context);189 mir_platform_operation_callback callback, void* context);
191190
192191
=== modified file 'src/client/mir_connection.cpp'
--- src/client/mir_connection.cpp 2015-01-30 14:24:06 +0000
+++ src/client/mir_connection.cpp 2015-02-02 14:38:00 +0000
@@ -357,13 +357,20 @@
357}357}
358358
359MirWaitHandle* MirConnection::platform_operation(359MirWaitHandle* MirConnection::platform_operation(
360 unsigned int opcode,
361 MirPlatformMessage const* request,360 MirPlatformMessage const* request,
362 mir_platform_operation_callback callback, void* context)361 mir_platform_operation_callback callback, void* context)
363{362{
363 auto const client_response = platform->platform_operation(request);
364 if (client_response)
365 {
366 set_error_message("");
367 callback(this, client_response, context);
368 return nullptr;
369 }
370
364 mir::protobuf::PlatformOperationMessage protobuf_request;371 mir::protobuf::PlatformOperationMessage protobuf_request;
365372
366 protobuf_request.set_opcode(opcode);373 protobuf_request.set_opcode(mir_platform_message_get_opcode(request));
367 auto const request_data = mir_platform_message_get_data(request);374 auto const request_data = mir_platform_message_get_data(request);
368 auto const request_fds = mir_platform_message_get_fds(request);375 auto const request_fds = mir_platform_message_get_fds(request);
369376
@@ -420,11 +427,6 @@
420 platform_package.fd_items = platform.fd_size();427 platform_package.fd_items = platform.fd_size();
421 for (int i = 0; i != platform.fd_size(); ++i)428 for (int i = 0; i != platform.fd_size(); ++i)
422 platform_package.fd[i] = platform.fd(i);429 platform_package.fd[i] = platform.fd(i);
423
424 // TODO: Replace the extra platform data mechanism with a
425 // client side, platform specific operation
426 for (auto d : extra_platform_data)
427 platform_package.data[platform_package.data_items++] = d;
428 }430 }
429 else431 else
430 {432 {
@@ -567,21 +569,6 @@
567 return &configure_display_wait_handle;569 return &configure_display_wait_handle;
568}570}
569571
570bool MirConnection::set_extra_platform_data(
571 std::vector<int> const& extra_platform_data_arg)
572{
573 std::lock_guard<decltype(mutex)> lock(mutex);
574
575 auto const total_data_size =
576 connect_result.platform().data_size() + extra_platform_data_arg.size();
577
578 if (total_data_size > mir_platform_package_max)
579 return false;
580
581 extra_platform_data = extra_platform_data_arg;
582 return true;
583}
584
585mir::protobuf::DisplayServer& MirConnection::display_server()572mir::protobuf::DisplayServer& MirConnection::display_server()
586{573{
587 return server;574 return server;
588575
=== modified file 'src/client/mir_connection.h'
--- src/client/mir_connection.h 2015-01-30 14:24:06 +0000
+++ src/client/mir_connection.h 2015-02-02 14:38:00 +0000
@@ -107,12 +107,7 @@
107107
108 MirWaitHandle* disconnect();108 MirWaitHandle* disconnect();
109109
110 MirWaitHandle* drm_auth_magic(unsigned int magic,
111 mir_drm_auth_magic_callback callback,
112 void* context);
113
114 MirWaitHandle* platform_operation(110 MirWaitHandle* platform_operation(
115 unsigned int opcode,
116 MirPlatformMessage const* request,111 MirPlatformMessage const* request,
117 mir_platform_operation_callback callback, void* context);112 mir_platform_operation_callback callback, void* context);
118113
@@ -137,8 +132,6 @@
137 MirWaitHandle* configure_display(MirDisplayConfiguration* configuration);132 MirWaitHandle* configure_display(MirDisplayConfiguration* configuration);
138 void done_display_configure();133 void done_display_configure();
139134
140 bool set_extra_platform_data(std::vector<int> const& extra_platform_data);
141
142 std::shared_ptr<google::protobuf::RpcChannel> rpc_channel() const135 std::shared_ptr<google::protobuf::RpcChannel> rpc_channel() const
143 {136 {
144 return channel;137 return channel;
@@ -197,8 +190,6 @@
197 std::shared_ptr<mir::client::EventHandlerRegister> const event_handler_register;190 std::shared_ptr<mir::client::EventHandlerRegister> const event_handler_register;
198191
199 std::unique_ptr<mir::dispatch::SimpleDispatchThread> const eventloop;192 std::unique_ptr<mir::dispatch::SimpleDispatchThread> const eventloop;
200
201 std::vector<int> extra_platform_data;
202 193
203 std::shared_ptr<mir::client::ClientBufferStreamFactory> buffer_stream_factory;194 std::shared_ptr<mir::client::ClientBufferStreamFactory> buffer_stream_factory;
204195
205196
=== modified file 'src/client/mir_connection_api.cpp'
--- src/client/mir_connection_api.cpp 2015-01-26 15:53:18 +0000
+++ src/client/mir_connection_api.cpp 2015-02-02 14:38:00 +0000
@@ -51,11 +51,6 @@
51 *context = result;51 *context = result;
52}52}
5353
54size_t division_ceiling(size_t a, size_t b)
55{
56 return ((a - 1) / b) + 1;
57}
58
59class DefaultMirConnectionAPI : public mcl::MirConnectionAPI54class DefaultMirConnectionAPI : public mcl::MirConnectionAPI
60{55{
61public:56public:
@@ -311,13 +306,13 @@
311}306}
312307
313MirWaitHandle* mir_connection_platform_operation(308MirWaitHandle* mir_connection_platform_operation(
314 MirConnection* connection, unsigned int opcode,309 MirConnection* connection,
315 MirPlatformMessage const* request,310 MirPlatformMessage const* request,
316 mir_platform_operation_callback callback, void* context)311 mir_platform_operation_callback callback, void* context)
317{312{
318 try313 try
319 {314 {
320 return connection->platform_operation(opcode, request, callback, context);315 return connection->platform_operation(request, callback, context);
321 }316 }
322 catch (std::exception const& ex)317 catch (std::exception const& ex)
323 {318 {
@@ -356,6 +351,21 @@
356 auth_magic_context->callback(auth_response->status, auth_magic_context->context);351 auth_magic_context->callback(auth_response->status, auth_magic_context->context);
357}352}
358353
354void assign_set_gbm_device_status(
355 MirConnection*, MirPlatformMessage* response, void* context)
356{
357 auto const response_msg = mir::raii::deleter_for(
358 response,
359 &mir_platform_message_release);
360
361 auto const response_data = mir_platform_message_get_data(response_msg.get());
362 auto const set_gbm_device_response_ptr =
363 reinterpret_cast<MirMesaSetGBMDeviceResponse const*>(response_data.data);
364
365 auto status_ptr = static_cast<int*>(context);
366 *status_ptr = set_gbm_device_response_ptr->status;
367}
368
359}369}
360370
361MirWaitHandle* mir_connection_drm_auth_magic(MirConnection* connection,371MirWaitHandle* mir_connection_drm_auth_magic(MirConnection* connection,
@@ -377,7 +387,6 @@
377387
378 return mir_connection_platform_operation(388 return mir_connection_platform_operation(
379 connection,389 connection,
380 MirMesaPlatformOperation::auth_magic,
381 msg.get(),390 msg.get(),
382 platform_operation_to_auth_magic_callback,391 platform_operation_to_auth_magic_callback,
383 auth_magic_op_context);392 auth_magic_op_context);
@@ -386,10 +395,24 @@
386int mir_connection_drm_set_gbm_device(MirConnection* connection,395int mir_connection_drm_set_gbm_device(MirConnection* connection,
387 struct gbm_device* gbm_dev)396 struct gbm_device* gbm_dev)
388{397{
389 size_t const pointer_size_in_ints = division_ceiling(sizeof(gbm_dev), sizeof(int));398 MirMesaSetGBMDeviceRequest const request{gbm_dev};
390 std::vector<int> extra_data(pointer_size_in_ints);399
391400 auto const msg = mir::raii::deleter_for(
392 memcpy(extra_data.data(), &gbm_dev, sizeof(gbm_dev));401 mir_platform_message_create(MirMesaPlatformOperation::set_gbm_device),
393402 &mir_platform_message_release);
394 return connection->set_extra_platform_data(extra_data);403
404 mir_platform_message_set_data(msg.get(), &request, sizeof(request));
405
406 static int const success{0};
407 int status{-1};
408
409 auto wh = mir_connection_platform_operation(
410 connection,
411 msg.get(),
412 assign_set_gbm_device_status,
413 &status);
414
415 mir_wait_for(wh);
416
417 return status == success;
395}418}
396419
=== modified file 'src/include/client/mir/client_platform.h'
--- src/include/client/mir/client_platform.h 2015-01-29 14:57:00 +0000
+++ src/include/client/mir/client_platform.h 2015-02-02 14:38:00 +0000
@@ -49,6 +49,17 @@
4949
50 virtual MirPlatformType platform_type() const = 0;50 virtual MirPlatformType platform_type() const = 0;
51 virtual void populate(MirPlatformPackage& package) const = 0;51 virtual void populate(MirPlatformPackage& package) const = 0;
52 /**
53 * Perform a platform operation.
54 *
55 * The returned platform message is owned by the caller and should be
56 * released with mir_platform_message_release().
57 *
58 * \param [in] request The platform operation request
59 * \return The platform operation reply, or a nullptr if the
60 * requested operation is not supported
61 */
62 virtual MirPlatformMessage* platform_operation(MirPlatformMessage const* request) = 0;
52 virtual std::shared_ptr<ClientBufferFactory> create_buffer_factory() = 0;63 virtual std::shared_ptr<ClientBufferFactory> create_buffer_factory() = 0;
53 virtual std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) = 0;64 virtual std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) = 0;
54 virtual std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() = 0;65 virtual std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() = 0;
5566
=== modified file 'src/platforms/android/client/android_client_platform.cpp'
--- src/platforms/android/client/android_client_platform.cpp 2015-01-29 14:57:00 +0000
+++ src/platforms/android/client/android_client_platform.cpp 2015-02-02 14:38:00 +0000
@@ -112,6 +112,12 @@
112 context->populate_server_package(package);112 context->populate_server_package(package);
113}113}
114114
115MirPlatformMessage* mcla::AndroidClientPlatform::platform_operation(
116 MirPlatformMessage const*)
117{
118 return nullptr;
119}
120
115MirNativeBuffer* mcla::AndroidClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const121MirNativeBuffer* mcla::AndroidClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const
116{122{
117 return buf->anwb();123 return buf->anwb();
118124
=== modified file 'src/platforms/android/client/android_client_platform.h'
--- src/platforms/android/client/android_client_platform.h 2015-01-30 14:25:39 +0000
+++ src/platforms/android/client/android_client_platform.h 2015-02-02 14:38:00 +0000
@@ -35,6 +35,7 @@
35 AndroidClientPlatform(ClientContext* const context);35 AndroidClientPlatform(ClientContext* const context);
36 MirPlatformType platform_type() const override;36 MirPlatformType platform_type() const override;
37 void populate(MirPlatformPackage& package) const override;37 void populate(MirPlatformPackage& package) const override;
38 MirPlatformMessage* platform_operation(MirPlatformMessage const* request) override;
38 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;39 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;
39 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;40 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;
40 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;41 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;
@@ -42,7 +43,6 @@
4243
43private:44private:
44 ClientContext* const context;45 ClientContext* const context;
45
46};46};
4747
48}48}
4949
=== modified file 'src/platforms/mesa/client/client_platform.cpp'
--- src/platforms/mesa/client/client_platform.cpp 2015-01-29 14:57:00 +0000
+++ src/platforms/mesa/client/client_platform.cpp 2015-02-02 14:38:00 +0000
@@ -23,6 +23,9 @@
23#include "native_surface.h"23#include "native_surface.h"
24#include "mir/client_buffer_factory.h"24#include "mir/client_buffer_factory.h"
25#include "mir/client_context.h"25#include "mir/client_context.h"
26#include "mir_toolkit/mesa/platform_operation.h"
27
28#include <cstring>
2629
27namespace mcl=mir::client;30namespace mcl=mir::client;
28namespace mclm=mir::client::mesa;31namespace mclm=mir::client::mesa;
@@ -47,6 +50,11 @@
47 mcl::EGLNativeDisplayContainer& container;50 mcl::EGLNativeDisplayContainer& container;
48};51};
4952
53constexpr size_t division_ceiling(size_t a, size_t b)
54{
55 return ((a - 1) / b) + 1;
56}
57
50}58}
5159
52mclm::ClientPlatform::ClientPlatform(60mclm::ClientPlatform::ClientPlatform(
@@ -55,7 +63,8 @@
55 mcl::EGLNativeDisplayContainer& display_container)63 mcl::EGLNativeDisplayContainer& display_container)
56 : context{context},64 : context{context},
57 buffer_file_ops{buffer_file_ops},65 buffer_file_ops{buffer_file_ops},
58 display_container(display_container)66 display_container(display_container),
67 gbm_dev{nullptr}
59{68{
60}69}
6170
@@ -108,7 +117,43 @@
108117
109void mclm::ClientPlatform::populate(MirPlatformPackage& package) const118void mclm::ClientPlatform::populate(MirPlatformPackage& package) const
110{119{
120 size_t constexpr pointer_size_in_ints = division_ceiling(sizeof(gbm_dev), sizeof(int));
121
111 context->populate_server_package(package);122 context->populate_server_package(package);
123
124 auto const total_data_size = package.data_items + pointer_size_in_ints;
125 if (gbm_dev && total_data_size <= mir_platform_package_max)
126 {
127 int gbm_ptr[pointer_size_in_ints]{};
128 std::memcpy(&gbm_ptr, &gbm_dev, sizeof(gbm_dev));
129
130 for (auto i : gbm_ptr)
131 package.data[package.data_items++] = i;
132 }
133}
134
135MirPlatformMessage* mclm::ClientPlatform::platform_operation(
136 MirPlatformMessage const* msg)
137{
138 auto const op = mir_platform_message_get_opcode(msg);
139
140 if (op == MirMesaPlatformOperation::set_gbm_device)
141 {
142 auto const msg_data = mir_platform_message_get_data(msg);
143 auto const set_gbm_device_request_ptr =
144 reinterpret_cast<MirMesaSetGBMDeviceRequest const*>(msg_data.data);
145
146 gbm_dev = set_gbm_device_request_ptr->device;
147
148 static int const success{0};
149 MirMesaSetGBMDeviceResponse const response{success};
150 auto const response_msg = mir_platform_message_create(op);
151 mir_platform_message_set_data(response_msg, &response, sizeof(response));
152
153 return response_msg;
154 }
155
156 return nullptr;
112}157}
113158
114MirNativeBuffer* mclm::ClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const159MirNativeBuffer* mclm::ClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const
115160
=== modified file 'src/platforms/mesa/client/client_platform.h'
--- src/platforms/mesa/client/client_platform.h 2015-01-30 14:25:39 +0000
+++ src/platforms/mesa/client/client_platform.h 2015-02-02 14:38:00 +0000
@@ -20,6 +20,8 @@
2020
21#include "mir/client_platform.h"21#include "mir/client_platform.h"
2222
23struct gbm_device;
24
23namespace mir25namespace mir
24{26{
25namespace client27namespace client
@@ -41,6 +43,7 @@
4143
42 MirPlatformType platform_type() const override;44 MirPlatformType platform_type() const override;
43 void populate(MirPlatformPackage& package) const override;45 void populate(MirPlatformPackage& package) const override;
46 MirPlatformMessage* platform_operation(MirPlatformMessage const* request) override;
44 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;47 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;
45 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;48 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;
46 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;49 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;
@@ -50,6 +53,7 @@
50 ClientContext* const context;53 ClientContext* const context;
51 std::shared_ptr<BufferFileOps> const buffer_file_ops;54 std::shared_ptr<BufferFileOps> const buffer_file_ops;
52 EGLNativeDisplayContainer& display_container;55 EGLNativeDisplayContainer& display_container;
56 gbm_device* gbm_dev;
53};57};
5458
55}59}
5660
=== modified file 'src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h'
--- src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h 2015-01-27 14:59:08 +0000
+++ src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h 2015-02-02 14:38:00 +0000
@@ -35,7 +35,8 @@
35enum MirMesaPlatformOperation35enum MirMesaPlatformOperation
36{36{
37 auth_magic = 1,37 auth_magic = 1,
38 auth_fd = 238 auth_fd = 2,
39 set_gbm_device = 3
39};40};
4041
41/*42/*
@@ -49,7 +50,23 @@
4950
50struct MirMesaAuthMagicResponse51struct MirMesaAuthMagicResponse
51{52{
52 int status;53 int status; /* 0 on success, a positive error number on failure */
54};
55
56/*
57 * MesaPlatformOperation::set_gbm_device related structures
58 */
59
60struct gbm_device;
61
62struct MirMesaSetGBMDeviceRequest
63{
64 struct gbm_device* device;
65};
66
67struct MirMesaSetGBMDeviceResponse
68{
69 int status; /* 0 on success, a positive error number on failure */
53};70};
5471
55#ifdef __cplusplus72#ifdef __cplusplus
5673
=== modified file 'src/server/graphics/nested/mir_client_host_connection.cpp'
--- src/server/graphics/nested/mir_client_host_connection.cpp 2015-01-26 15:53:18 +0000
+++ src/server/graphics/nested/mir_client_host_connection.cpp 2015-02-02 14:38:00 +0000
@@ -185,7 +185,7 @@
185 MirPlatformMessage* raw_reply{nullptr};185 MirPlatformMessage* raw_reply{nullptr};
186186
187 auto const wh = mir_connection_platform_operation(187 auto const wh = mir_connection_platform_operation(
188 mir_connection, op, msg.get(), platform_operation_callback, &raw_reply);188 mir_connection, msg.get(), platform_operation_callback, &raw_reply);
189 mir_wait_for(wh);189 mir_wait_for(wh);
190190
191 auto const reply = mir::raii::deleter_for(191 auto const reply = mir::raii::deleter_for(
192192
=== modified file 'tests/acceptance-tests/CMakeLists.txt'
--- tests/acceptance-tests/CMakeLists.txt 2015-01-19 06:55:41 +0000
+++ tests/acceptance-tests/CMakeLists.txt 2015-02-02 14:38:00 +0000
@@ -25,7 +25,6 @@
25 test_display_configuration.cpp25 test_display_configuration.cpp
26 test_surfaces_with_output_id.cpp26 test_surfaces_with_output_id.cpp
27 test_server_disconnect.cpp27 test_server_disconnect.cpp
28 test_client_library_drm.cpp
29 test_prompt_session_client_api.cpp28 test_prompt_session_client_api.cpp
30 test_client_screencast.cpp29 test_client_screencast.cpp
31 test_client_surface_visibility.cpp30 test_client_surface_visibility.cpp
3231
=== removed file 'tests/acceptance-tests/test_client_library_drm.cpp'
--- tests/acceptance-tests/test_client_library_drm.cpp 2015-01-14 06:39:13 +0000
+++ tests/acceptance-tests/test_client_library_drm.cpp 1970-01-01 00:00:00 +0000
@@ -1,46 +0,0 @@
1/*
2 * Copyright © 2013-2014 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
17 */
18
19#include "mir_toolkit/mir_client_library_drm.h"
20
21#include "mir_test_framework/connected_client_headless_server.h"
22
23#include <gtest/gtest.h>
24#include <gmock/gmock.h>
25
26namespace mtf = mir_test_framework;
27using namespace testing;
28
29using MirClientLibraryDrmTest = mtf::ConnectedClientHeadlessServer;
30
31TEST_F(MirClientLibraryDrmTest, sets_gbm_device_in_platform_data)
32{
33 struct gbm_device* dev = reinterpret_cast<struct gbm_device*>(connection);
34
35 MirPlatformPackage pkg;
36
37 mir_connection_get_platform(connection, &pkg);
38 int const previous_data_count{pkg.data_items};
39
40 mir_connection_drm_set_gbm_device(connection, dev);
41 mir_connection_get_platform(connection, &pkg);
42
43 EXPECT_THAT(pkg.data_items, Eq(previous_data_count + (sizeof(dev) / sizeof(int))));
44 EXPECT_THAT(reinterpret_cast<struct gbm_device*>(pkg.data[previous_data_count]),
45 Eq(dev));
46}
470
=== modified file 'tests/acceptance-tests/test_client_library_errors.cpp'
--- tests/acceptance-tests/test_client_library_errors.cpp 2015-01-29 14:57:00 +0000
+++ tests/acceptance-tests/test_client_library_errors.cpp 2015-02-02 14:38:00 +0000
@@ -77,6 +77,11 @@
77 {77 {
78 }78 }
7979
80 MirPlatformMessage* platform_operation(MirPlatformMessage const*) override
81 {
82 return nullptr;
83 }
84
80 MirPlatformType platform_type() const85 MirPlatformType platform_type() const
81 {86 {
82 BOOST_THROW_EXCEPTION(std::runtime_error{exception_text});87 BOOST_THROW_EXCEPTION(std::runtime_error{exception_text});
8388
=== modified file 'tests/acceptance-tests/test_client_platform_operation.cpp'
--- tests/acceptance-tests/test_client_platform_operation.cpp 2014-12-11 08:54:04 +0000
+++ tests/acceptance-tests/test_client_platform_operation.cpp 2015-02-02 14:38:00 +0000
@@ -39,7 +39,7 @@
39 MirPlatformMessage* reply;39 MirPlatformMessage* reply;
4040
41 auto const platform_op_done = mir_connection_platform_operation(41 auto const platform_op_done = mir_connection_platform_operation(
42 connection, add_opcode, request, assign_reply, &reply);42 connection, request, assign_reply, &reply);
43 mir_wait_for(platform_op_done);43 mir_wait_for(platform_op_done);
4444
45 mir_platform_message_release(request);45 mir_platform_message_release(request);
@@ -57,7 +57,7 @@
57 MirPlatformMessage* reply;57 MirPlatformMessage* reply;
5858
59 auto const platform_op_done = mir_connection_platform_operation(59 auto const platform_op_done = mir_connection_platform_operation(
60 connection, echo_fd_opcode, request, assign_reply, &reply);60 connection, request, assign_reply, &reply);
61 mir_wait_for(platform_op_done);61 mir_wait_for(platform_op_done);
6262
63 mir_platform_message_release(request);63 mir_platform_message_release(request);
6464
=== modified file 'tests/include/mir_test_framework/client_platform_factory.h'
--- tests/include/mir_test_framework/client_platform_factory.h 2015-01-29 14:57:00 +0000
+++ tests/include/mir_test_framework/client_platform_factory.h 2015-02-02 14:38:00 +0000
@@ -42,19 +42,13 @@
42 return platform_factory(&ctx);42 return platform_factory(&ctx);
43}43}
4444
45std::shared_ptr<mir::client::ClientPlatform> create_mesa_client_platform()45std::shared_ptr<mir::client::ClientPlatform> create_mesa_client_platform(
46 mir::client::ClientContext* client_context)
46{47{
47 using namespace testing;48 using namespace testing;
48 mtd::MockClientContext ctx;
49 ON_CALL(ctx, populate_server_package(_))
50 .WillByDefault(Invoke([](MirPlatformPackage& package)
51 {
52 ::memset(&package, 0, sizeof(package));
53 package.fd_items = 1;
54 }));
55 platform_library = std::make_shared<mir::SharedLibrary>(client_platform("mesa.so"));49 platform_library = std::make_shared<mir::SharedLibrary>(client_platform("mesa.so"));
56 auto platform_factory = platform_library->load_function<mir::client::CreateClientPlatform>("create_client_platform");50 auto platform_factory = platform_library->load_function<mir::client::CreateClientPlatform>("create_client_platform");
57 return platform_factory(&ctx);51 return platform_factory(client_context);
58}52}
5953
60std::shared_ptr<mir::SharedLibrary>54std::shared_ptr<mir::SharedLibrary>
6155
=== modified file 'tests/mir_test_framework/stub_client_platform_factory.cpp'
--- tests/mir_test_framework/stub_client_platform_factory.cpp 2015-01-29 14:57:00 +0000
+++ tests/mir_test_framework/stub_client_platform_factory.cpp 2015-02-02 14:38:00 +0000
@@ -50,6 +50,11 @@
50 context->populate_server_package(package);50 context->populate_server_package(package);
51 }51 }
5252
53 MirPlatformMessage* platform_operation(MirPlatformMessage const*) override
54 {
55 return nullptr;
56 }
57
53 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()58 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()
54 {59 {
55 return std::make_shared<mtd::StubClientBufferFactory>();60 return std::make_shared<mtd::StubClientBufferFactory>();
5661
=== modified file 'tests/unit-tests/client/mesa/test_client_platform.cpp'
--- tests/unit-tests/client/mesa/test_client_platform.cpp 2015-01-22 21:42:26 +0000
+++ tests/unit-tests/client/mesa/test_client_platform.cpp 2015-02-02 14:38:00 +0000
@@ -18,23 +18,56 @@
1818
19#include "mir/client_platform.h"19#include "mir/client_platform.h"
20#include "mir/shared_library.h"20#include "mir/shared_library.h"
21#include "mir/raii.h"
21#include "src/platforms/mesa/client/mesa_native_display_container.h"22#include "src/platforms/mesa/client/mesa_native_display_container.h"
22#include "mir_test_framework/client_platform_factory.h"23#include "mir_test_framework/client_platform_factory.h"
23#include "mir_test_doubles/mock_egl_native_surface.h"
2424
25#include "mir_toolkit/mir_client_library.h"
25#include "mir_toolkit/mesa/native_display.h"26#include "mir_toolkit/mesa/native_display.h"
27#include "mir_toolkit/mesa/platform_operation.h"
2628
27#include <gtest/gtest.h>29#include <gtest/gtest.h>
30#include <gmock/gmock.h>
2831
29namespace mcl = mir::client;32namespace mcl = mir::client;
30namespace mclm = mir::client::mesa;33namespace mclm = mir::client::mesa;
31namespace mt = mir::test;
32namespace mtd = mir::test::doubles;
33namespace mtf = mir_test_framework;34namespace mtf = mir_test_framework;
3435
35TEST(MesaClientPlatformTest, egl_native_display_is_valid_until_released)36namespace
36{37{
37 auto platform = mtf::create_mesa_client_platform();38
39struct StubClientContext : mcl::ClientContext
40{
41 void populate_server_package(MirPlatformPackage& platform_package) override
42 {
43 platform_package.data_items = 0;
44 platform_package.fd_items = 1;
45 }
46
47};
48
49struct MesaClientPlatformTest : testing::Test
50{
51 MirPlatformMessage* set_gbm_device(gbm_device* dev)
52 {
53 auto request_msg = mir::raii::deleter_for(
54 mir_platform_message_create(MirMesaPlatformOperation::set_gbm_device),
55 &mir_platform_message_release);
56 MirMesaSetGBMDeviceRequest const request{dev};
57 mir_platform_message_set_data(request_msg.get(), &request, sizeof(request));
58
59 return platform->platform_operation(request_msg.get());
60 }
61
62 StubClientContext client_context;
63 std::shared_ptr<mir::client::ClientPlatform> platform =
64 mtf::create_mesa_client_platform(&client_context);
65};
66
67}
68
69TEST_F(MesaClientPlatformTest, egl_native_display_is_valid_until_released)
70{
38 auto platform_lib = mtf::get_platform_library();71 auto platform_lib = mtf::get_platform_library();
3972
40 MirMesaEGLNativeDisplay* nd;73 MirMesaEGLNativeDisplay* nd;
@@ -47,3 +80,41 @@
47 }80 }
48 EXPECT_EQ(MIR_MESA_FALSE, mclm::mir_client_mesa_egl_native_display_is_valid(nd));81 EXPECT_EQ(MIR_MESA_FALSE, mclm::mir_client_mesa_egl_native_display_is_valid(nd));
49}82}
83
84TEST_F(MesaClientPlatformTest, handles_set_gbm_device_platform_operation)
85{
86 using namespace testing;
87
88 int const success{0};
89 auto const gbm_dev_dummy = reinterpret_cast<gbm_device*>(this);
90
91 auto response_msg = mir::raii::deleter_for(
92 set_gbm_device(gbm_dev_dummy),
93 &mir_platform_message_release);
94
95 ASSERT_THAT(response_msg, NotNull());
96 auto const response_data = mir_platform_message_get_data(response_msg.get());
97 ASSERT_THAT(response_data.size, Eq(sizeof(MirMesaSetGBMDeviceResponse)));
98 auto const response_ptr =
99 reinterpret_cast<MirMesaSetGBMDeviceResponse const*>(response_data.data);
100 EXPECT_THAT(response_ptr->status, Eq(success));
101}
102
103TEST_F(MesaClientPlatformTest, appends_gbm_device_to_platform_package)
104{
105 using namespace testing;
106
107 MirPlatformPackage pkg;
108 platform->populate(pkg);
109 int const previous_data_count{pkg.data_items};
110 auto const gbm_dev_dummy = reinterpret_cast<gbm_device*>(this);
111
112 auto response_msg = mir::raii::deleter_for(
113 set_gbm_device(gbm_dev_dummy),
114 &mir_platform_message_release);
115
116 platform->populate(pkg);
117 EXPECT_THAT(pkg.data_items, Eq(previous_data_count + (sizeof(gbm_dev_dummy) / sizeof(int))));
118 EXPECT_THAT(reinterpret_cast<struct gbm_device*>(pkg.data[previous_data_count]),
119 Eq(gbm_dev_dummy));
120}
50121
=== modified file 'tests/unit-tests/client/test_client_mir_surface.cpp'
--- tests/unit-tests/client/test_client_mir_surface.cpp 2015-01-29 14:57:00 +0000
+++ tests/unit-tests/client/test_client_mir_surface.cpp 2015-02-02 14:38:00 +0000
@@ -211,6 +211,12 @@
211 {211 {
212 }212 }
213213
214 MirPlatformMessage* platform_operation(
215 MirPlatformMessage const*) override
216 {
217 return nullptr;
218 }
219
214 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()220 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()
215 {221 {
216 return std::make_shared<mtd::StubClientBufferFactory>();222 return std::make_shared<mtd::StubClientBufferFactory>();
217223
=== modified file 'tests/unit-tests/client/test_mir_connection.cpp'
--- tests/unit-tests/client/test_mir_connection.cpp 2015-01-30 14:24:06 +0000
+++ tests/unit-tests/client/test_mir_connection.cpp 2015-02-02 14:38:00 +0000
@@ -28,6 +28,7 @@
28#include "src/client/mir_surface.h"28#include "src/client/mir_surface.h"
29#include "mir/client_buffer_factory.h"29#include "mir/client_buffer_factory.h"
30#include "mir/dispatch/dispatchable.h"30#include "mir/dispatch/dispatchable.h"
31#include "mir/raii.h"
3132
32#include "src/server/frontend/resource_cache.h" /* needed by test_server.h */33#include "src/server/frontend/resource_cache.h" /* needed by test_server.h */
33#include "mir_test/test_protobuf_server.h"34#include "mir_test/test_protobuf_server.h"
@@ -74,12 +75,19 @@
74 {75 {
75 configure_display_sent(static_cast<mp::DisplayConfiguration const*>(parameters));76 configure_display_sent(static_cast<mp::DisplayConfiguration const*>(parameters));
76 }77 }
78 else if (method->name() == "platform_operation")
79 {
80 platform_operation(static_cast<mp::PlatformOperationMessage const*>(parameters),
81 static_cast<mp::PlatformOperationMessage*>(response));
82 }
7783
78 complete->Run();84 complete->Run();
79 }85 }
8086
81 MOCK_METHOD2(connect, void(mp::ConnectParameters const*,mp::Connection*));87 MOCK_METHOD2(connect, void(mp::ConnectParameters const*,mp::Connection*));
82 MOCK_METHOD1(configure_display_sent, void(mp::DisplayConfiguration const*));88 MOCK_METHOD1(configure_display_sent, void(mp::DisplayConfiguration const*));
89 MOCK_METHOD2(platform_operation,
90 void(mp::PlatformOperationMessage const*, mp::PlatformOperationMessage*));
8391
84 MOCK_CONST_METHOD0(watch_fd, mir::Fd());92 MOCK_CONST_METHOD0(watch_fd, mir::Fd());
85 MOCK_METHOD1(dispatch, bool(md::FdEvents));93 MOCK_METHOD1(dispatch, bool(md::FdEvents));
@@ -101,6 +109,8 @@
101 .WillByDefault(Return(std::make_shared<mtd::StubClientBufferFactory>()));109 .WillByDefault(Return(std::make_shared<mtd::StubClientBufferFactory>()));
102 ON_CALL(*this, create_egl_native_window(_))110 ON_CALL(*this, create_egl_native_window(_))
103 .WillByDefault(Return(std::shared_ptr<EGLNativeWindowType>()));111 .WillByDefault(Return(std::shared_ptr<EGLNativeWindowType>()));
112 ON_CALL(*this, platform_operation(_))
113 .WillByDefault(Return(nullptr));
104 }114 }
105115
106 void set_client_context(mcl::ClientContext* ctx)116 void set_client_context(mcl::ClientContext* ctx)
@@ -115,6 +125,7 @@
115125
116 MOCK_CONST_METHOD1(convert_native_buffer, MirNativeBuffer*(mir::graphics::NativeBuffer*));126 MOCK_CONST_METHOD1(convert_native_buffer, MirNativeBuffer*(mir::graphics::NativeBuffer*));
117 MOCK_CONST_METHOD0(platform_type, MirPlatformType());127 MOCK_CONST_METHOD0(platform_type, MirPlatformType());
128 MOCK_METHOD1(platform_operation, MirPlatformMessage*(MirPlatformMessage const*));
118 MOCK_METHOD0(create_buffer_factory, std::shared_ptr<mcl::ClientBufferFactory>());129 MOCK_METHOD0(create_buffer_factory, std::shared_ptr<mcl::ClientBufferFactory>());
119 MOCK_METHOD1(create_egl_native_window, std::shared_ptr<EGLNativeWindowType>(mcl::EGLNativeSurface*));130 MOCK_METHOD1(create_egl_native_window, std::shared_ptr<EGLNativeWindowType>(mcl::EGLNativeSurface*));
120 MOCK_METHOD0(create_egl_native_display, std::shared_ptr<EGLNativeDisplayType>());131 MOCK_METHOD0(create_egl_native_display, std::shared_ptr<EGLNativeDisplayType>());
@@ -568,46 +579,72 @@
568namespace579namespace
569{580{
570581
571ACTION_P(FillPlatformDataWith, sample_data)582void assign_response(MirConnection*, MirPlatformMessage* response, void* context)
572{583{
573 for (auto d : sample_data)584 auto response_ptr = static_cast<MirPlatformMessage**>(context);
574 arg1->mutable_platform()->add_data(d);585 *response_ptr = response;
575}586}
576587
577}588ACTION(CopyRequestToResponse)
578589{
579TEST_F(MirConnectionTest, sets_extra_platform_data)590 *arg1 = *arg0;
580{591}
581 using namespace testing;592}
582 std::vector<int> const initial_data{0x66, 0x67, 0x68};593
583 std::vector<int> const extra_data{0x11, 0x12, 0x13};594TEST_F(MirConnectionTest, uses_client_platform_for_platform_operation)
584595{
585 EXPECT_CALL(*mock_channel, connect(_,_))596 using namespace testing;
586 .WillOnce(FillPlatformDataWith(initial_data));597
587598 unsigned int const opcode{42};
588 MirWaitHandle *wait_handle =599 auto const request = mir::raii::deleter_for(
589 connection->connect("MirClientSurfaceTest", &connected_callback, nullptr);600 mir_platform_message_create(opcode),
590 wait_handle->wait_for_all();601 &mir_platform_message_release);
591602 auto const response = mir::raii::deleter_for(
592 MirPlatformPackage pkg;603 mir_platform_message_create(opcode),
593604 &mir_platform_message_release);
594 /* Check initial data */605
595 connection->populate(pkg);606 EXPECT_CALL(*mock_platform, platform_operation(request.get()))
596607 .WillOnce(Return(response.get()));
597 EXPECT_EQ(initial_data.size(), static_cast<size_t>(pkg.data_items));608 EXPECT_CALL(*mock_channel, platform_operation(_,_))
598 for (size_t i = 0; i < initial_data.size(); i++)609 .Times(0);
599 EXPECT_EQ(initial_data[i], pkg.data[i]) << " i=" << i;610
600611 auto connect_wh =
601 /* Check initial data plus extra data*/612 connection->connect("MirClientSurfaceTest", &connected_callback, nullptr);
602 connection->set_extra_platform_data(extra_data);613 mir_wait_for(connect_wh);
603 connection->populate(pkg);614
604615 MirPlatformMessage* returned_response{nullptr};
605 EXPECT_EQ(initial_data.size() + extra_data.size(),616
606 static_cast<size_t>(pkg.data_items));617 auto op_wh = connection->platform_operation(
607618 request.get(), assign_response, &returned_response);
608 for (size_t i = 0; i < initial_data.size(); i++)619 mir_wait_for(op_wh);
609 EXPECT_EQ(initial_data[i], pkg.data[i]) << " i=" << i;620
610621 EXPECT_THAT(returned_response, Eq(response.get()));
611 for (size_t i = 0; i < extra_data.size(); i++)622}
612 EXPECT_EQ(extra_data[i], pkg.data[i + initial_data.size()]) << " i=" << i;623
624TEST_F(MirConnectionTest, contacts_server_if_client_platform_cannot_handle_platform_operation)
625{
626 using namespace testing;
627
628 unsigned int const opcode{42};
629 auto const request = mir::raii::deleter_for(
630 mir_platform_message_create(opcode),
631 &mir_platform_message_release);
632
633 EXPECT_CALL(*mock_platform, platform_operation(_))
634 .WillOnce(Return(nullptr));
635 EXPECT_CALL(*mock_channel, platform_operation(_,_))
636 .WillOnce(CopyRequestToResponse());
637
638 auto connect_wh =
639 connection->connect("MirClientSurfaceTest", &connected_callback, nullptr);
640 mir_wait_for(connect_wh);
641
642 MirPlatformMessage* returned_response{nullptr};
643
644 auto op_wh = connection->platform_operation(
645 request.get(), assign_response, &returned_response);
646 mir_wait_for(op_wh);
647
648 EXPECT_THAT(mir_platform_message_get_opcode(returned_response), Eq(opcode));
649 mir_platform_message_release(returned_response);
613}650}

Subscribers

People subscribed via source and target branches