1 /* 2 * Copyright 2012 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sublicense, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the 13 * next paragraph) shall be included in all copies or substantial 14 * portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 */ 25 26 #include <math.h> 27 #include <stdio.h> 28 #include <stdlib.h> 29 #include <stdarg.h> 30 #include <stdint.h> 31 #include <string.h> 32 #include <assert.h> 33 #include <sys/socket.h> 34 #include <unistd.h> 35 #include <errno.h> 36 #include <sys/types.h> 37 #include <sys/stat.h> 38 #include <poll.h> 39 40 #include "wayland-private.h" 41 #include "test-runner.h" 42 #include "test-compositor.h" 43 44 static const char message[] = "Hello, world"; 45 46 static struct wl_connection * 47 setup(int *s) 48 { 49 struct wl_connection *connection; 50 51 assert(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, s) == 0); 52 53 connection = wl_connection_create(s[0]); 54 assert(connection); 55 56 return connection; 57 } 58 59 TEST(connection_create) 60 { 61 struct wl_connection *connection; 62 int s[2]; 63 64 connection = setup(s); 65 wl_connection_destroy(connection); 66 close(s[0]); 67 close(s[1]); 68 } 69 70 TEST(connection_write) 71 { 72 struct wl_connection *connection; 73 int s[2]; 74 char buffer[64]; 75 76 connection = setup(s); 77 78 assert(wl_connection_write(connection, message, sizeof message) == 0); 79 assert(wl_connection_flush(connection) == sizeof message); 80 assert(read(s[1], buffer, sizeof buffer) == sizeof message); 81 assert(memcmp(message, buffer, sizeof message) == 0); 82 83 wl_connection_destroy(connection); 84 close(s[0]); 85 close(s[1]); 86 } 87 88 TEST(connection_data) 89 { 90 struct wl_connection *connection; 91 int s[2]; 92 char buffer[64]; 93 94 connection = setup(s); 95 96 assert(write(s[1], message, sizeof message) == sizeof message); 97 assert(wl_connection_read(connection) == sizeof message); 98 wl_connection_copy(connection, buffer, sizeof message); 99 assert(memcmp(message, buffer, sizeof message) == 0); 100 wl_connection_consume(connection, sizeof message); 101 102 wl_connection_destroy(connection); 103 close(s[0]); 104 close(s[1]); 105 } 106 107 TEST(connection_queue) 108 { 109 struct wl_connection *connection; 110 int s[2]; 111 char buffer[64]; 112 113 connection = setup(s); 114 115 /* Test that wl_connection_queue() puts data in the output 116 * buffer without flush it. Verify that the data did get in 117 * the buffer by writing another message and making sure that 118 * we receive the two messages on the other fd. */ 119 120 assert(wl_connection_queue(connection, message, sizeof message) == 0); 121 assert(wl_connection_flush(connection) == 0); 122 assert(wl_connection_write(connection, message, sizeof message) == 0); 123 assert(wl_connection_flush(connection) == 2 * sizeof message); 124 assert(read(s[1], buffer, sizeof buffer) == 2 * sizeof message); 125 assert(memcmp(message, buffer, sizeof message) == 0); 126 assert(memcmp(message, buffer + sizeof message, sizeof message) == 0); 127 128 wl_connection_destroy(connection); 129 close(s[0]); 130 close(s[1]); 131 } 132 133 struct marshal_data { 134 struct wl_connection *read_connection; 135 struct wl_connection *write_connection; 136 int s[2]; 137 uint32_t buffer[10]; 138 union { 139 uint32_t u; 140 int32_t i; 141 const char *s; 142 int h; 143 } value; 144 }; 145 146 static void 147 setup_marshal_data(struct marshal_data *data) 148 { 149 assert(socketpair(AF_UNIX, 150 SOCK_STREAM | SOCK_CLOEXEC, 0, data->s) == 0); 151 data->read_connection = wl_connection_create(data->s[0]); 152 assert(data->read_connection); 153 data->write_connection = wl_connection_create(data->s[1]); 154 assert(data->write_connection); 155 } 156 157 static void 158 release_marshal_data(struct marshal_data *data) 159 { 160 close(wl_connection_destroy(data->read_connection)); 161 close(wl_connection_destroy(data->write_connection)); 162 } 163 164 static void 165 marshal(struct marshal_data *data, const char *format, int size, ...) 166 { 167 struct wl_closure *closure; 168 static const uint32_t opcode = 4444; 169 static struct wl_object sender = { NULL, NULL, 1234 }; 170 struct wl_message message = { "test", format, NULL }; 171 va_list ap; 172 173 va_start(ap, size); 174 closure = wl_closure_vmarshal(&sender, opcode, ap, &message); 175 va_end(ap); 176 177 assert(closure); 178 assert(wl_closure_send(closure, data->write_connection) == 0); 179 wl_closure_destroy(closure); 180 assert(wl_connection_flush(data->write_connection) == size); 181 assert(read(data->s[0], data->buffer, sizeof data->buffer) == size); 182 183 assert(data->buffer[0] == sender.id); 184 assert(data->buffer[1] == (opcode | (size << 16))); 185 } 186 187 TEST(connection_marshal) 188 { 189 struct marshal_data data; 190 struct wl_object object; 191 struct wl_array array; 192 static const char text[] = "curry"; 193 194 setup_marshal_data(&data); 195 196 marshal(&data, "i", 12, 42); 197 assert(data.buffer[2] == 42); 198 199 marshal(&data, "u", 12, 55); 200 assert(data.buffer[2] == 55); 201 202 marshal(&data, "s", 20, "frappo"); 203 assert(data.buffer[2] == 7); 204 assert(strcmp((char *) &data.buffer[3], "frappo") == 0); 205 206 object.id = 557799; 207 marshal(&data, "o", 12, &object); 208 assert(data.buffer[2] == object.id); 209 210 marshal(&data, "n", 12, &object); 211 assert(data.buffer[2] == object.id); 212 213 marshal(&data, "?n", 12, NULL); 214 assert(data.buffer[2] == 0); 215 216 array.data = (void *) text; 217 array.size = sizeof text; 218 marshal(&data, "a", 20, &array); 219 assert(data.buffer[2] == array.size); 220 assert(memcmp(&data.buffer[3], text, array.size) == 0); 221 222 release_marshal_data(&data); 223 } 224 225 static void 226 expected_fail_marshal(int expected_error, const char *format, ...) 227 { 228 struct wl_closure *closure; 229 static const uint32_t opcode = 4444; 230 static const struct wl_interface test_interface = { 231 .name = "test_object" 232 }; 233 static struct wl_object sender = { 0 }; 234 struct wl_message message = { "test", format, NULL }; 235 236 sender.interface = &test_interface; 237 sender.id = 1234; 238 va_list ap; 239 240 va_start(ap, format); 241 closure = wl_closure_vmarshal(&sender, opcode, ap, &message); 242 va_end(ap); 243 244 assert(closure == NULL); 245 assert(errno == expected_error); 246 } 247 248 static void 249 expected_fail_marshal_send(struct marshal_data *data, int expected_error, 250 const char *format, ...) 251 { 252 struct wl_closure *closure; 253 static const uint32_t opcode = 4444; 254 static struct wl_object sender = { NULL, NULL, 1234 }; 255 struct wl_message message = { "test", format, NULL }; 256 va_list ap; 257 258 va_start(ap, format); 259 closure = wl_closure_vmarshal(&sender, opcode, ap, &message); 260 va_end(ap); 261 262 assert(closure); 263 assert(wl_closure_send(closure, data->write_connection) < 0); 264 assert(errno == expected_error); 265 266 wl_closure_destroy(closure); 267 } 268 269 TEST(connection_marshal_nullables) 270 { 271 struct marshal_data data; 272 struct wl_object object; 273 struct wl_array array; 274 const char text[] = "curry"; 275 276 setup_marshal_data(&data); 277 278 expected_fail_marshal(EINVAL, "o", NULL); 279 expected_fail_marshal(EINVAL, "s", NULL); 280 expected_fail_marshal(EINVAL, "a", NULL); 281 282 marshal(&data, "?o", 12, NULL); 283 assert(data.buffer[2] == 0); 284 285 marshal(&data, "?a", 12, NULL); 286 assert(data.buffer[2] == 0); 287 288 marshal(&data, "?s", 12, NULL); 289 assert(data.buffer[2] == 0); 290 291 object.id = 55293; 292 marshal(&data, "?o", 12, &object); 293 assert(data.buffer[2] == object.id); 294 295 array.data = (void *) text; 296 array.size = sizeof text; 297 marshal(&data, "?a", 20, &array); 298 assert(data.buffer[2] == array.size); 299 assert(memcmp(&data.buffer[3], text, array.size) == 0); 300 301 marshal(&data, "?s", 20, text); 302 assert(data.buffer[2] == sizeof text); 303 assert(strcmp((char *) &data.buffer[3], text) == 0); 304 305 release_marshal_data(&data); 306 } 307 308 static void 309 validate_demarshal_u(struct marshal_data *data, 310 struct wl_object *object, uint32_t u) 311 { 312 assert(data->value.u == u); 313 } 314 315 static void 316 validate_demarshal_i(struct marshal_data *data, 317 struct wl_object *object, int32_t i) 318 { 319 assert(data->value.i == i); 320 } 321 322 static void 323 validate_demarshal_s(struct marshal_data *data, 324 struct wl_object *object, const char *s) 325 { 326 if (data->value.s != NULL) 327 assert(strcmp(data->value.s, s) == 0); 328 else 329 assert(s == NULL); 330 } 331 332 static void 333 validate_demarshal_h(struct marshal_data *data, 334 struct wl_object *object, int fd) 335 { 336 struct stat buf1, buf2; 337 338 assert(fd != data->value.h); 339 fstat(fd, &buf1); 340 fstat(data->value.h, &buf2); 341 assert(buf1.st_dev == buf2.st_dev); 342 assert(buf1.st_ino == buf2.st_ino); 343 close(fd); 344 close(data->value.h); 345 } 346 347 static void 348 validate_demarshal_f(struct marshal_data *data, 349 struct wl_object *object, wl_fixed_t f) 350 { 351 assert(data->value.i == f); 352 } 353 354 static void 355 demarshal(struct marshal_data *data, const char *format, 356 uint32_t *msg, void (*func)(void)) 357 { 358 struct wl_message message = { "test", format, NULL }; 359 struct wl_closure *closure; 360 struct wl_map objects; 361 struct wl_object object = { NULL, &func, 0 }; 362 int size = msg[1]; 363 364 assert(write(data->s[1], msg, size) == size); 365 assert(wl_connection_read(data->read_connection) == size); 366 367 wl_map_init(&objects, WL_MAP_SERVER_SIDE); 368 object.id = msg[0]; 369 closure = wl_connection_demarshal(data->read_connection, 370 size, &objects, &message); 371 assert(closure); 372 wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, 0, data); 373 wl_closure_destroy(closure); 374 } 375 376 TEST(connection_demarshal) 377 { 378 struct marshal_data data; 379 uint32_t msg[10]; 380 381 setup_marshal_data(&data); 382 383 data.value.u = 8000; 384 msg[0] = 400200; /* object id */ 385 msg[1] = 12; /* size = 12, opcode = 0 */ 386 msg[2] = data.value.u; 387 demarshal(&data, "u", msg, (void *) validate_demarshal_u); 388 389 data.value.i = -557799; 390 msg[0] = 400200; 391 msg[1] = 12; 392 msg[2] = data.value.i; 393 demarshal(&data, "i", msg, (void *) validate_demarshal_i); 394 395 data.value.s = "superdude"; 396 msg[0] = 400200; 397 msg[1] = 24; 398 msg[2] = 10; 399 memcpy(&msg[3], data.value.s, msg[2]); 400 demarshal(&data, "s", msg, (void *) validate_demarshal_s); 401 402 data.value.s = "superdude"; 403 msg[0] = 400200; 404 msg[1] = 24; 405 msg[2] = 10; 406 memcpy(&msg[3], data.value.s, msg[2]); 407 demarshal(&data, "?s", msg, (void *) validate_demarshal_s); 408 409 data.value.i = wl_fixed_from_double(-90000.2390); 410 msg[0] = 400200; 411 msg[1] = 12; 412 msg[2] = data.value.i; 413 demarshal(&data, "f", msg, (void *) validate_demarshal_f); 414 415 data.value.s = NULL; 416 msg[0] = 400200; 417 msg[1] = 12; 418 msg[2] = 0; 419 demarshal(&data, "?s", msg, (void *) validate_demarshal_s); 420 421 release_marshal_data(&data); 422 } 423 424 static void 425 marshal_demarshal(struct marshal_data *data, 426 void (*func)(void), int size, const char *format, ...) 427 { 428 struct wl_closure *closure; 429 static const int opcode = 4444; 430 static struct wl_object sender = { NULL, NULL, 1234 }; 431 struct wl_message message = { "test", format, NULL }; 432 struct wl_map objects; 433 struct wl_object object = { NULL, &func, 0 }; 434 va_list ap; 435 uint32_t msg[1] = { 1234 }; 436 437 va_start(ap, format); 438 closure = wl_closure_vmarshal(&sender, opcode, ap, &message); 439 va_end(ap); 440 441 assert(closure); 442 assert(wl_closure_send(closure, data->write_connection) == 0); 443 wl_closure_destroy(closure); 444 assert(wl_connection_flush(data->write_connection) == size); 445 446 assert(wl_connection_read(data->read_connection) == size); 447 448 wl_map_init(&objects, WL_MAP_SERVER_SIDE); 449 object.id = msg[0]; 450 closure = wl_connection_demarshal(data->read_connection, 451 size, &objects, &message); 452 assert(closure); 453 wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, 0, data); 454 wl_closure_destroy(closure); 455 } 456 457 TEST(connection_marshal_demarshal) 458 { 459 struct marshal_data data; 460 char f[] = "/tmp/wayland-tests-XXXXXX"; 461 462 setup_marshal_data(&data); 463 464 data.value.u = 889911; 465 marshal_demarshal(&data, (void *) validate_demarshal_u, 466 12, "u", data.value.u); 467 468 data.value.i = -13; 469 marshal_demarshal(&data, (void *) validate_demarshal_i, 470 12, "i", data.value.i); 471 472 data.value.s = "cookie robots"; 473 marshal_demarshal(&data, (void *) validate_demarshal_s, 474 28, "s", data.value.s); 475 476 data.value.s = "cookie robots"; 477 marshal_demarshal(&data, (void *) validate_demarshal_s, 478 28, "?s", data.value.s); 479 480 data.value.h = mkstemp(f); 481 assert(data.value.h >= 0); 482 unlink(f); 483 marshal_demarshal(&data, (void *) validate_demarshal_h, 484 8, "h", data.value.h); 485 486 data.value.i = wl_fixed_from_double(1234.5678); 487 marshal_demarshal(&data, (void *) validate_demarshal_f, 488 12, "f", data.value.i); 489 490 data.value.i = wl_fixed_from_double(-90000.2390); 491 marshal_demarshal(&data, (void *) validate_demarshal_f, 492 12, "f", data.value.i); 493 494 data.value.i = wl_fixed_from_double((1 << 23) - 1 + 0.0941); 495 marshal_demarshal(&data, (void *) validate_demarshal_f, 496 12, "f", data.value.i); 497 498 release_marshal_data(&data); 499 } 500 501 TEST(connection_marshal_alot) 502 { 503 struct marshal_data data; 504 char f[64]; 505 int i; 506 507 setup_marshal_data(&data); 508 509 /* We iterate enough to make sure we wrap the circular buffers 510 * for both regular data an fds. */ 511 512 for (i = 0; i < 2000; i++) { 513 strcpy(f, "/tmp/wayland-tests-XXXXXX"); 514 data.value.h = mkstemp(f); 515 assert(data.value.h >= 0); 516 unlink(f); 517 marshal_demarshal(&data, (void *) validate_demarshal_h, 518 8, "h", data.value.h); 519 } 520 521 release_marshal_data(&data); 522 } 523 524 TEST(connection_marshal_too_big) 525 { 526 struct marshal_data data; 527 char *big_string = malloc(5000); 528 529 assert(big_string); 530 531 memset(big_string, ' ', 4999); 532 big_string[4999] = '\0'; 533 534 setup_marshal_data(&data); 535 536 expected_fail_marshal_send(&data, E2BIG, "s", big_string); 537 538 release_marshal_data(&data); 539 free(big_string); 540 } 541 542 static void 543 marshal_helper(const char *format, void *handler, ...) 544 { 545 struct wl_closure *closure; 546 static struct wl_object sender = { NULL, NULL, 1234 }; 547 struct wl_object object = { NULL, &handler, 0 }; 548 static const int opcode = 4444; 549 struct wl_message message = { "test", format, NULL }; 550 va_list ap; 551 int done; 552 553 va_start(ap, handler); 554 closure = wl_closure_vmarshal(&sender, opcode, ap, &message); 555 va_end(ap); 556 557 assert(closure); 558 done = 0; 559 wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, 0, &done); 560 wl_closure_destroy(closure); 561 assert(done); 562 } 563 564 static void 565 suu_handler(void *data, struct wl_object *object, 566 const char *s, uint32_t u1, uint32_t u2) 567 { 568 int *done = data; 569 570 assert(strcmp(s, "foo") == 0); 571 assert(u1 = 500); 572 assert(u2 = 404040); 573 *done = 1; 574 } 575 576 TEST(invoke_closure) 577 { 578 marshal_helper("suu", suu_handler, "foo", 500, 404040); 579 } 580 581 static void 582 leak_closure(void) 583 { 584 struct wl_callback *cb; 585 struct pollfd pfd; 586 struct client *c = client_connect(); 587 588 cb = wl_display_sync(c->wl_display); 589 assert(cb); 590 assert(wl_display_flush(c->wl_display) > 0); 591 592 /* we don't need it, it is referenced */ 593 wl_callback_destroy(cb); 594 595 pfd.fd = wl_display_get_fd(c->wl_display); 596 pfd.events = POLLIN; 597 598 test_set_timeout(2); 599 assert(poll(&pfd, 1, -1) == 1); 600 601 /* read events, but do not dispatch them */ 602 assert(wl_display_prepare_read(c->wl_display) == 0); 603 assert(wl_display_read_events(c->wl_display) == 0); 604 605 /* 606 * now we have wl_callback.done and wl_display.delete_id queued; 607 * if we now release the queue (in wl_display_disconnect()) 608 * we should not leak memory 609 */ 610 611 client_disconnect(c); 612 } 613 614 TEST(closure_leaks) 615 { 616 struct display *d = display_create(); 617 618 client_create_noarg(d, leak_closure); 619 display_run(d); 620 621 display_destroy(d); 622 } 623 624 static void 625 leak_after_error(void) 626 { 627 struct client *c = client_connect(); 628 629 /* this should return -1, because we'll send error 630 * from server. */ 631 assert(stop_display(c, 1) == -1); 632 assert(wl_display_dispatch_pending(c->wl_display) == -1); 633 assert(wl_display_get_error(c->wl_display) == ENOMEM); 634 635 /* after we got error, we have display_resume event 636 * in the queue. It should be freed in wl_display_disconnect(). 637 * Let's see! */ 638 639 wl_proxy_destroy((struct wl_proxy *) c->tc); 640 wl_display_disconnect(c->wl_display); 641 free(c); 642 } 643 644 TEST(closure_leaks_after_error) 645 { 646 struct display *d = display_create(); 647 struct client_info *cl; 648 649 cl = client_create_noarg(d, leak_after_error); 650 display_run(d); 651 652 wl_client_post_no_memory(cl->wl_client); 653 display_resume(d); 654 655 display_destroy(d); 656 } 657