2 * FreeRDP: A Remote Desktop Protocol Client
3 * Clipboard Virtual Channel Unit Tests
5 * Copyright 2011 Vic Lee
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
23 #include <freerdp/freerdp.h>
24 #include <freerdp/constants.h>
25 #include <freerdp/channels/channels.h>
26 #include <freerdp/utils/event.h>
27 #include <freerdp/utils/hexdump.h>
28 #include <freerdp/utils/memory.h>
29 #include <freerdp/plugins/cliprdr.h>
31 #include "test_cliprdr.h"
33 int init_cliprdr_suite(void)
35 freerdp_channels_global_init();
39 int clean_cliprdr_suite(void)
41 freerdp_channels_global_uninit();
45 int add_cliprdr_suite(void)
47 add_test_suite(cliprdr);
49 add_test_function(cliprdr);
54 static const uint8 test_clip_caps_data[] =
56 "\x07\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x01\x00\x0C\x00"
57 "\x02\x00\x00\x00\x0E\x00\x00\x00"
60 static const uint8 test_monitor_ready_data[] =
62 "\x01\x00\x00\x00\x00\x00\x00\x00"
65 static const uint8 test_format_list_data[] =
67 "\x02\x00\x00\x00\x48\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
68 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
69 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xd0\x00\x00"
70 "\x48\x00\x54\x00\x4D\x00\x4C\x00\x20\x00\x46\x00\x6F\x00\x72\x00"
71 "\x6D\x00\x61\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
74 static const uint8 test_format_list_response_data[] =
76 "\x03\x00\x01\x00\x00\x00\x00\x00"
79 static const uint8 test_data_request_data[] =
81 "\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00"
84 static const uint8 test_data_response_data[] =
86 "\x05\x00\x01\x00\x18\x00\x00\x00\x68\x00\x65\x00\x6C\x00\x6C\x00"
87 "\x6F\x00\x20\x00\x77\x00\x6F\x00\x72\x00\x6c\x00\x64\x00\x00\x00"
90 static int test_rdp_channel_data(freerdp* instance, int chan_id, uint8* data, int data_size)
92 printf("chan_id %d data_size %d\n", chan_id, data_size);
93 freerdp_hexdump(data, data_size);
97 static int event_processed;
99 static void event_process_callback(RDP_EVENT* event)
101 printf("Event %d processed.\n", event->event_type);
105 void test_cliprdr(void)
108 rdpChannels* channels;
109 rdpSettings settings = { 0 };
110 freerdp instance = { 0 };
112 RDP_CB_FORMAT_LIST_EVENT* format_list_event;
113 RDP_CB_DATA_REQUEST_EVENT* data_request_event;
114 RDP_CB_DATA_RESPONSE_EVENT* data_response_event;
116 settings.hostname = "testhost";
117 instance.settings = &settings;
118 instance.SendChannelData = test_rdp_channel_data;
120 channels = freerdp_channels_new();
122 freerdp_channels_load_plugin(channels, &settings, "../channels/cliprdr/cliprdr.so", NULL);
123 freerdp_channels_pre_connect(channels, &instance);
124 freerdp_channels_post_connect(channels, &instance);
126 /* server sends cliprdr capabilities and monitor ready PDU */
127 freerdp_channels_data(&instance, 0, (char*)test_clip_caps_data, sizeof(test_clip_caps_data) - 1,
128 CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_clip_caps_data) - 1);
130 freerdp_channels_data(&instance, 0, (char*)test_monitor_ready_data, sizeof(test_monitor_ready_data) - 1,
131 CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_monitor_ready_data) - 1);
133 /* cliprdr sends clipboard_sync event to UI */
134 while ((event = freerdp_channels_pop_event(channels)) == NULL)
136 freerdp_channels_check_fds(channels, &instance);
138 printf("Got event %d\n", event->event_type);
139 CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_MONITOR_READY);
140 freerdp_event_free(event);
142 /* UI sends format_list event to cliprdr */
143 event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_FORMAT_LIST, event_process_callback, NULL);
144 format_list_event = (RDP_CB_FORMAT_LIST_EVENT*) event;
145 format_list_event->num_formats = 2;
146 format_list_event->formats = (uint32*) xmalloc(sizeof(uint32) * 2);
147 format_list_event->formats[0] = CB_FORMAT_TEXT;
148 format_list_event->formats[1] = CB_FORMAT_HTML;
150 freerdp_channels_send_event(channels, event);
152 /* cliprdr sends format list PDU to server */
153 while (!event_processed)
155 freerdp_channels_check_fds(channels, &instance);
158 /* server sends format list response PDU to cliprdr */
159 freerdp_channels_data(&instance, 0, (char*)test_format_list_response_data, sizeof(test_format_list_response_data) - 1,
160 CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_response_data) - 1);
162 /* server sends format list PDU to cliprdr */
163 freerdp_channels_data(&instance, 0, (char*)test_format_list_data, sizeof(test_format_list_data) - 1,
164 CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_data) - 1);
166 /* cliprdr sends format_list event to UI */
167 while ((event = freerdp_channels_pop_event(channels)) == NULL)
169 freerdp_channels_check_fds(channels, &instance);
171 printf("Got event %d\n", event->event_type);
172 CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_FORMAT_LIST);
173 if (event->event_type == RDP_EVENT_TYPE_CB_FORMAT_LIST)
175 format_list_event = (RDP_CB_FORMAT_LIST_EVENT*)event;
176 for (i = 0; i < format_list_event->num_formats; i++)
177 printf("Format: 0x%X\n", format_list_event->formats[i]);
179 freerdp_event_free(event);
181 /* server sends data request PDU to cliprdr */
182 freerdp_channels_data(&instance, 0, (char*)test_data_request_data, sizeof(test_data_request_data) - 1,
183 CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_request_data) - 1);
185 /* cliprdr sends data request event to UI */
186 while ((event = freerdp_channels_pop_event(channels)) == NULL)
188 freerdp_channels_check_fds(channels, &instance);
190 printf("Got event %d\n", event->event_type);
191 CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_DATA_REQUEST);
192 if (event->event_type == RDP_EVENT_TYPE_CB_DATA_REQUEST)
194 data_request_event = (RDP_CB_DATA_REQUEST_EVENT*)event;
195 printf("Requested format: 0x%X\n", data_request_event->format);
197 freerdp_event_free(event);
199 /* UI sends data response event to cliprdr */
200 event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_DATA_RESPONSE, event_process_callback, NULL);
201 data_response_event = (RDP_CB_DATA_RESPONSE_EVENT*)event;
202 data_response_event->data = (uint8*)xmalloc(6);
203 strcpy((char*)data_response_event->data, "hello");
204 data_response_event->size = 6;
206 freerdp_channels_send_event(channels, event);
208 /* cliprdr sends data response PDU to server */
209 while (!event_processed)
211 freerdp_channels_check_fds(channels, &instance);
214 /* UI sends data request event to cliprdr */
215 event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_DATA_REQUEST, event_process_callback, NULL);
216 data_request_event = (RDP_CB_DATA_REQUEST_EVENT*)event;
217 data_request_event->format = CB_FORMAT_UNICODETEXT;
219 freerdp_channels_send_event(channels, event);
221 /* cliprdr sends data request PDU to server */
222 while (!event_processed)
224 freerdp_channels_check_fds(channels, &instance);
227 /* server sends data response PDU to cliprdr */
228 freerdp_channels_data(&instance, 0, (char*)test_data_response_data, sizeof(test_data_response_data) - 1,
229 CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_response_data) - 1);
231 /* cliprdr sends data response event to UI */
232 while ((event = freerdp_channels_pop_event(channels)) == NULL)
234 freerdp_channels_check_fds(channels, &instance);
236 printf("Got event %d\n", event->event_type);
237 CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_DATA_RESPONSE);
238 if (event->event_type == RDP_EVENT_TYPE_CB_DATA_RESPONSE)
240 data_response_event = (RDP_CB_DATA_RESPONSE_EVENT*)event;
241 printf("Data response size: %d\n", data_response_event->size);
242 freerdp_hexdump(data_response_event->data, data_response_event->size);
244 freerdp_event_free(event);
246 freerdp_channels_close(channels, &instance);
247 freerdp_channels_free(channels);