1 /* 2 * Copyright (c) 2003, 2004 Niels Provos <provos (at) citi.umich.edu> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifdef WIN32 29 #include <winsock2.h> 30 #include <windows.h> 31 #endif 32 33 #ifdef HAVE_CONFIG_H 34 #include "config.h" 35 #endif 36 37 #include <sys/types.h> 38 #include <sys/stat.h> 39 #ifdef HAVE_SYS_TIME_H 40 #include <sys/time.h> 41 #endif 42 #include <sys/queue.h> 43 #ifndef WIN32 44 #include <sys/socket.h> 45 #include <sys/wait.h> 46 #include <signal.h> 47 #include <unistd.h> 48 #include <netdb.h> 49 #endif 50 #include <assert.h> 51 #include <fcntl.h> 52 #include <signal.h> 53 #include <stdlib.h> 54 #include <stdio.h> 55 #include <string.h> 56 #include <errno.h> 57 58 #include "event.h" 59 #include "evutil.h" 60 #include "event-internal.h" 61 #include "log.h" 62 63 #include "regress.h" 64 #ifndef WIN32 65 #include "regress.gen.h" 66 #endif 67 68 int pair[2]; 69 int test_ok; 70 static int called; 71 static char wbuf[4096]; 72 static char rbuf[4096]; 73 static int woff; 74 static int roff; 75 static int usepersist; 76 static struct timeval tset; 77 static struct timeval tcalled; 78 static struct event_base *global_base; 79 80 #define TEST1 "this is a test" 81 #define SECONDS 1 82 83 #ifndef SHUT_WR 84 #define SHUT_WR 1 85 #endif 86 87 #ifdef WIN32 88 #define write(fd,buf,len) send((fd),(buf),(len),0) 89 #define read(fd,buf,len) recv((fd),(buf),(len),0) 90 #endif 91 92 static void 93 simple_read_cb(int fd, short event, void *arg) 94 { 95 char buf[256]; 96 int len; 97 98 if (arg == NULL) 99 return; 100 101 len = read(fd, buf, sizeof(buf)); 102 103 if (len) { 104 if (!called) { 105 if (event_add(arg, NULL) == -1) 106 exit(1); 107 } 108 } else if (called == 1) 109 test_ok = 1; 110 111 called++; 112 } 113 114 static void 115 simple_write_cb(int fd, short event, void *arg) 116 { 117 int len; 118 119 if (arg == NULL) 120 return; 121 122 len = write(fd, TEST1, strlen(TEST1) + 1); 123 if (len == -1) 124 test_ok = 0; 125 else 126 test_ok = 1; 127 } 128 129 static void 130 multiple_write_cb(int fd, short event, void *arg) 131 { 132 struct event *ev = arg; 133 int len; 134 135 len = 128; 136 if (woff + len >= sizeof(wbuf)) 137 len = sizeof(wbuf) - woff; 138 139 len = write(fd, wbuf + woff, len); 140 if (len == -1) { 141 fprintf(stderr, "%s: write\n", __func__); 142 if (usepersist) 143 event_del(ev); 144 return; 145 } 146 147 woff += len; 148 149 if (woff >= sizeof(wbuf)) { 150 shutdown(fd, SHUT_WR); 151 if (usepersist) 152 event_del(ev); 153 return; 154 } 155 156 if (!usepersist) { 157 if (event_add(ev, NULL) == -1) 158 exit(1); 159 } 160 } 161 162 static void 163 multiple_read_cb(int fd, short event, void *arg) 164 { 165 struct event *ev = arg; 166 int len; 167 168 len = read(fd, rbuf + roff, sizeof(rbuf) - roff); 169 if (len == -1) 170 fprintf(stderr, "%s: read\n", __func__); 171 if (len <= 0) { 172 if (usepersist) 173 event_del(ev); 174 return; 175 } 176 177 roff += len; 178 if (!usepersist) { 179 if (event_add(ev, NULL) == -1) 180 exit(1); 181 } 182 } 183 184 static void 185 timeout_cb(int fd, short event, void *arg) 186 { 187 struct timeval tv; 188 int diff; 189 190 evutil_gettimeofday(&tcalled, NULL); 191 if (evutil_timercmp(&tcalled, &tset, >)) 192 evutil_timersub(&tcalled, &tset, &tv); 193 else 194 evutil_timersub(&tset, &tcalled, &tv); 195 196 diff = tv.tv_sec*1000 + tv.tv_usec/1000 - SECONDS * 1000; 197 if (diff < 0) 198 diff = -diff; 199 200 if (diff < 100) 201 test_ok = 1; 202 } 203 204 #ifndef WIN32 205 static void 206 signal_cb_sa(int sig) 207 { 208 test_ok = 2; 209 } 210 211 static void 212 signal_cb(int fd, short event, void *arg) 213 { 214 struct event *ev = arg; 215 216 signal_del(ev); 217 test_ok = 1; 218 } 219 #endif 220 221 struct both { 222 struct event ev; 223 int nread; 224 }; 225 226 static void 227 combined_read_cb(int fd, short event, void *arg) 228 { 229 struct both *both = arg; 230 char buf[128]; 231 int len; 232 233 len = read(fd, buf, sizeof(buf)); 234 if (len == -1) 235 fprintf(stderr, "%s: read\n", __func__); 236 if (len <= 0) 237 return; 238 239 both->nread += len; 240 if (event_add(&both->ev, NULL) == -1) 241 exit(1); 242 } 243 244 static void 245 combined_write_cb(int fd, short event, void *arg) 246 { 247 struct both *both = arg; 248 char buf[128]; 249 int len; 250 251 len = sizeof(buf); 252 if (len > both->nread) 253 len = both->nread; 254 255 len = write(fd, buf, len); 256 if (len == -1) 257 fprintf(stderr, "%s: write\n", __func__); 258 if (len <= 0) { 259 shutdown(fd, SHUT_WR); 260 return; 261 } 262 263 both->nread -= len; 264 if (event_add(&both->ev, NULL) == -1) 265 exit(1); 266 } 267 268 /* Test infrastructure */ 269 270 static int 271 setup_test(const char *name) 272 { 273 274 fprintf(stdout, "%s", name); 275 276 if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) { 277 fprintf(stderr, "%s: socketpair\n", __func__); 278 exit(1); 279 } 280 281 #ifdef HAVE_FCNTL 282 if (fcntl(pair[0], F_SETFL, O_NONBLOCK) == -1) 283 fprintf(stderr, "fcntl(O_NONBLOCK)"); 284 285 if (fcntl(pair[1], F_SETFL, O_NONBLOCK) == -1) 286 fprintf(stderr, "fcntl(O_NONBLOCK)"); 287 #endif 288 289 test_ok = 0; 290 called = 0; 291 return (0); 292 } 293 294 static int 295 cleanup_test(void) 296 { 297 #ifndef WIN32 298 close(pair[0]); 299 close(pair[1]); 300 #else 301 CloseHandle((HANDLE)pair[0]); 302 CloseHandle((HANDLE)pair[1]); 303 #endif 304 if (test_ok) 305 fprintf(stdout, "OK\n"); 306 else { 307 fprintf(stdout, "FAILED\n"); 308 exit(1); 309 } 310 test_ok = 0; 311 return (0); 312 } 313 314 static void 315 test_registerfds(void) 316 { 317 int i, j; 318 int pair[2]; 319 struct event read_evs[512]; 320 struct event write_evs[512]; 321 322 struct event_base *base = event_base_new(); 323 324 fprintf(stdout, "Testing register fds: "); 325 326 for (i = 0; i < 512; ++i) { 327 if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) { 328 /* run up to the limit of file descriptors */ 329 break; 330 } 331 event_set(&read_evs[i], pair[0], 332 EV_READ|EV_PERSIST, simple_read_cb, NULL); 333 event_base_set(base, &read_evs[i]); 334 event_add(&read_evs[i], NULL); 335 event_set(&write_evs[i], pair[1], 336 EV_WRITE|EV_PERSIST, simple_write_cb, NULL); 337 event_base_set(base, &write_evs[i]); 338 event_add(&write_evs[i], NULL); 339 340 /* just loop once */ 341 event_base_loop(base, EVLOOP_ONCE); 342 } 343 344 /* now delete everything */ 345 for (j = 0; j < i; ++j) { 346 event_del(&read_evs[j]); 347 event_del(&write_evs[j]); 348 #ifndef WIN32 349 close(read_evs[j].ev_fd); 350 close(write_evs[j].ev_fd); 351 #else 352 CloseHandle((HANDLE)read_evs[j].ev_fd); 353 CloseHandle((HANDLE)write_evs[j].ev_fd); 354 #endif 355 356 /* just loop once */ 357 event_base_loop(base, EVLOOP_ONCE); 358 } 359 360 event_base_free(base); 361 362 fprintf(stdout, "OK\n"); 363 } 364 365 static void 366 test_simpleread(void) 367 { 368 struct event ev; 369 370 /* Very simple read test */ 371 setup_test("Simple read: "); 372 373 write(pair[0], TEST1, strlen(TEST1)+1); 374 shutdown(pair[0], SHUT_WR); 375 376 event_set(&ev, pair[1], EV_READ, simple_read_cb, &ev); 377 if (event_add(&ev, NULL) == -1) 378 exit(1); 379 event_dispatch(); 380 381 cleanup_test(); 382 } 383 384 static void 385 test_simplewrite(void) 386 { 387 struct event ev; 388 389 /* Very simple write test */ 390 setup_test("Simple write: "); 391 392 event_set(&ev, pair[0], EV_WRITE, simple_write_cb, &ev); 393 if (event_add(&ev, NULL) == -1) 394 exit(1); 395 event_dispatch(); 396 397 cleanup_test(); 398 } 399 400 static void 401 test_multiple(void) 402 { 403 struct event ev, ev2; 404 int i; 405 406 /* Multiple read and write test */ 407 setup_test("Multiple read/write: "); 408 memset(rbuf, 0, sizeof(rbuf)); 409 for (i = 0; i < sizeof(wbuf); i++) 410 wbuf[i] = i; 411 412 roff = woff = 0; 413 usepersist = 0; 414 415 event_set(&ev, pair[0], EV_WRITE, multiple_write_cb, &ev); 416 if (event_add(&ev, NULL) == -1) 417 exit(1); 418 event_set(&ev2, pair[1], EV_READ, multiple_read_cb, &ev2); 419 if (event_add(&ev2, NULL) == -1) 420 exit(1); 421 event_dispatch(); 422 423 if (roff == woff) 424 test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0; 425 426 cleanup_test(); 427 } 428 429 static void 430 test_persistent(void) 431 { 432 struct event ev, ev2; 433 int i; 434 435 /* Multiple read and write test with persist */ 436 setup_test("Persist read/write: "); 437 memset(rbuf, 0, sizeof(rbuf)); 438 for (i = 0; i < sizeof(wbuf); i++) 439 wbuf[i] = i; 440 441 roff = woff = 0; 442 usepersist = 1; 443 444 event_set(&ev, pair[0], EV_WRITE|EV_PERSIST, multiple_write_cb, &ev); 445 if (event_add(&ev, NULL) == -1) 446 exit(1); 447 event_set(&ev2, pair[1], EV_READ|EV_PERSIST, multiple_read_cb, &ev2); 448 if (event_add(&ev2, NULL) == -1) 449 exit(1); 450 event_dispatch(); 451 452 if (roff == woff) 453 test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0; 454 455 cleanup_test(); 456 } 457 458 static void 459 test_combined(void) 460 { 461 struct both r1, r2, w1, w2; 462 463 setup_test("Combined read/write: "); 464 memset(&r1, 0, sizeof(r1)); 465 memset(&r2, 0, sizeof(r2)); 466 memset(&w1, 0, sizeof(w1)); 467 memset(&w2, 0, sizeof(w2)); 468 469 w1.nread = 4096; 470 w2.nread = 8192; 471 472 event_set(&r1.ev, pair[0], EV_READ, combined_read_cb, &r1); 473 event_set(&w1.ev, pair[0], EV_WRITE, combined_write_cb, &w1); 474 event_set(&r2.ev, pair[1], EV_READ, combined_read_cb, &r2); 475 event_set(&w2.ev, pair[1], EV_WRITE, combined_write_cb, &w2); 476 if (event_add(&r1.ev, NULL) == -1) 477 exit(1); 478 if (event_add(&w1.ev, NULL)) 479 exit(1); 480 if (event_add(&r2.ev, NULL)) 481 exit(1); 482 if (event_add(&w2.ev, NULL)) 483 exit(1); 484 485 event_dispatch(); 486 487 if (r1.nread == 8192 && r2.nread == 4096) 488 test_ok = 1; 489 490 cleanup_test(); 491 } 492 493 static void 494 test_simpletimeout(void) 495 { 496 struct timeval tv; 497 struct event ev; 498 499 setup_test("Simple timeout: "); 500 501 tv.tv_usec = 0; 502 tv.tv_sec = SECONDS; 503 evtimer_set(&ev, timeout_cb, NULL); 504 evtimer_add(&ev, &tv); 505 506 evutil_gettimeofday(&tset, NULL); 507 event_dispatch(); 508 509 cleanup_test(); 510 } 511 512 #ifndef WIN32 513 extern struct event_base *current_base; 514 515 static void 516 child_signal_cb(int fd, short event, void *arg) 517 { 518 struct timeval tv; 519 int *pint = arg; 520 521 *pint = 1; 522 523 tv.tv_usec = 500000; 524 tv.tv_sec = 0; 525 event_loopexit(&tv); 526 } 527 528 static void 529 test_fork(void) 530 { 531 int status, got_sigchld = 0; 532 struct event ev, sig_ev; 533 pid_t pid; 534 535 setup_test("After fork: "); 536 537 write(pair[0], TEST1, strlen(TEST1)+1); 538 539 event_set(&ev, pair[1], EV_READ, simple_read_cb, &ev); 540 if (event_add(&ev, NULL) == -1) 541 exit(1); 542 543 signal_set(&sig_ev, SIGCHLD, child_signal_cb, &got_sigchld); 544 signal_add(&sig_ev, NULL); 545 546 if ((pid = fork()) == 0) { 547 /* in the child */ 548 if (event_reinit(current_base) == -1) { 549 fprintf(stderr, "FAILED (reinit)\n"); 550 exit(1); 551 } 552 553 signal_del(&sig_ev); 554 555 called = 0; 556 557 event_dispatch(); 558 559 /* we do not send an EOF; simple_read_cb requires an EOF 560 * to set test_ok. we just verify that the callback was 561 * called. */ 562 exit(test_ok != 0 || called != 2 ? -2 : 76); 563 } 564 565 /* wait for the child to read the data */ 566 sleep(1); 567 568 write(pair[0], TEST1, strlen(TEST1)+1); 569 570 if (waitpid(pid, &status, 0) == -1) { 571 fprintf(stderr, "FAILED (fork)\n"); 572 exit(1); 573 } 574 575 if (WEXITSTATUS(status) != 76) { 576 fprintf(stderr, "FAILED (exit): %d\n", WEXITSTATUS(status)); 577 exit(1); 578 } 579 580 /* test that the current event loop still works */ 581 write(pair[0], TEST1, strlen(TEST1)+1); 582 shutdown(pair[0], SHUT_WR); 583 584 event_dispatch(); 585 586 if (!got_sigchld) { 587 fprintf(stdout, "FAILED (sigchld)\n"); 588 exit(1); 589 } 590 591 signal_del(&sig_ev); 592 593 cleanup_test(); 594 } 595 596 static void 597 test_simplesignal(void) 598 { 599 struct event ev; 600 struct itimerval itv; 601 602 setup_test("Simple signal: "); 603 signal_set(&ev, SIGALRM, signal_cb, &ev); 604 signal_add(&ev, NULL); 605 /* find bugs in which operations are re-ordered */ 606 signal_del(&ev); 607 signal_add(&ev, NULL); 608 609 memset(&itv, 0, sizeof(itv)); 610 itv.it_value.tv_sec = 1; 611 if (setitimer(ITIMER_REAL, &itv, NULL) == -1) 612 goto skip_simplesignal; 613 614 event_dispatch(); 615 skip_simplesignal: 616 if (signal_del(&ev) == -1) 617 test_ok = 0; 618 619 cleanup_test(); 620 } 621 622 static void 623 test_multiplesignal(void) 624 { 625 struct event ev_one, ev_two; 626 struct itimerval itv; 627 628 setup_test("Multiple signal: "); 629 630 signal_set(&ev_one, SIGALRM, signal_cb, &ev_one); 631 signal_add(&ev_one, NULL); 632 633 signal_set(&ev_two, SIGALRM, signal_cb, &ev_two); 634 signal_add(&ev_two, NULL); 635 636 memset(&itv, 0, sizeof(itv)); 637 itv.it_value.tv_sec = 1; 638 if (setitimer(ITIMER_REAL, &itv, NULL) == -1) 639 goto skip_simplesignal; 640 641 event_dispatch(); 642 643 skip_simplesignal: 644 if (signal_del(&ev_one) == -1) 645 test_ok = 0; 646 if (signal_del(&ev_two) == -1) 647 test_ok = 0; 648 649 cleanup_test(); 650 } 651 652 static void 653 test_immediatesignal(void) 654 { 655 struct event ev; 656 657 test_ok = 0; 658 printf("Immediate signal: "); 659 signal_set(&ev, SIGUSR1, signal_cb, &ev); 660 signal_add(&ev, NULL); 661 raise(SIGUSR1); 662 event_loop(EVLOOP_NONBLOCK); 663 signal_del(&ev); 664 cleanup_test(); 665 } 666 667 static void 668 test_signal_dealloc(void) 669 { 670 /* make sure that signal_event is event_del'ed and pipe closed */ 671 struct event ev; 672 struct event_base *base = event_init(); 673 printf("Signal dealloc: "); 674 signal_set(&ev, SIGUSR1, signal_cb, &ev); 675 signal_add(&ev, NULL); 676 signal_del(&ev); 677 event_base_free(base); 678 /* If we got here without asserting, we're fine. */ 679 test_ok = 1; 680 cleanup_test(); 681 } 682 683 static void 684 test_signal_pipeloss(void) 685 { 686 /* make sure that the base1 pipe is closed correctly. */ 687 struct event_base *base1, *base2; 688 int pipe1; 689 test_ok = 0; 690 printf("Signal pipeloss: "); 691 base1 = event_init(); 692 pipe1 = base1->sig.ev_signal_pair[0]; 693 base2 = event_init(); 694 event_base_free(base2); 695 event_base_free(base1); 696 if (close(pipe1) != -1 || errno!=EBADF) { 697 /* fd must be closed, so second close gives -1, EBADF */ 698 printf("signal pipe not closed. "); 699 test_ok = 0; 700 } else { 701 test_ok = 1; 702 } 703 cleanup_test(); 704 } 705 706 /* 707 * make two bases to catch signals, use both of them. this only works 708 * for event mechanisms that use our signal pipe trick. kqueue handles 709 * signals internally, and all interested kqueues get all the signals. 710 */ 711 static void 712 test_signal_switchbase(void) 713 { 714 struct event ev1, ev2; 715 struct event_base *base1, *base2; 716 int is_kqueue; 717 test_ok = 0; 718 printf("Signal switchbase: "); 719 base1 = event_init(); 720 base2 = event_init(); 721 is_kqueue = !strcmp(event_get_method(),"kqueue"); 722 signal_set(&ev1, SIGUSR1, signal_cb, &ev1); 723 signal_set(&ev2, SIGUSR1, signal_cb, &ev2); 724 if (event_base_set(base1, &ev1) || 725 event_base_set(base2, &ev2) || 726 event_add(&ev1, NULL) || 727 event_add(&ev2, NULL)) { 728 fprintf(stderr, "%s: cannot set base, add\n", __func__); 729 exit(1); 730 } 731 732 test_ok = 0; 733 /* can handle signal before loop is called */ 734 raise(SIGUSR1); 735 event_base_loop(base2, EVLOOP_NONBLOCK); 736 if (is_kqueue) { 737 if (!test_ok) 738 goto done; 739 test_ok = 0; 740 } 741 event_base_loop(base1, EVLOOP_NONBLOCK); 742 if (test_ok && !is_kqueue) { 743 test_ok = 0; 744 745 /* set base1 to handle signals */ 746 event_base_loop(base1, EVLOOP_NONBLOCK); 747 raise(SIGUSR1); 748 event_base_loop(base1, EVLOOP_NONBLOCK); 749 event_base_loop(base2, EVLOOP_NONBLOCK); 750 } 751 done: 752 event_base_free(base1); 753 event_base_free(base2); 754 cleanup_test(); 755 } 756 757 /* 758 * assert that a signal event removed from the event queue really is 759 * removed - with no possibility of it's parent handler being fired. 760 */ 761 static void 762 test_signal_assert(void) 763 { 764 struct event ev; 765 struct event_base *base = event_init(); 766 test_ok = 0; 767 printf("Signal handler assert: "); 768 /* use SIGCONT so we don't kill ourselves when we signal to nowhere */ 769 signal_set(&ev, SIGCONT, signal_cb, &ev); 770 signal_add(&ev, NULL); 771 /* 772 * if signal_del() fails to reset the handler, it's current handler 773 * will still point to evsignal_handler(). 774 */ 775 signal_del(&ev); 776 777 raise(SIGCONT); 778 /* only way to verify we were in evsignal_handler() */ 779 if (base->sig.evsignal_caught) 780 test_ok = 0; 781 else 782 test_ok = 1; 783 784 event_base_free(base); 785 cleanup_test(); 786 return; 787 } 788 789 /* 790 * assert that we restore our previous signal handler properly. 791 */ 792 static void 793 test_signal_restore(void) 794 { 795 struct event ev; 796 struct event_base *base = event_init(); 797 #ifdef HAVE_SIGACTION 798 struct sigaction sa; 799 #endif 800 801 test_ok = 0; 802 printf("Signal handler restore: "); 803 #ifdef HAVE_SIGACTION 804 sa.sa_handler = signal_cb_sa; 805 sa.sa_flags = 0x0; 806 sigemptyset(&sa.sa_mask); 807 if (sigaction(SIGUSR1, &sa, NULL) == -1) 808 goto out; 809 #else 810 if (signal(SIGUSR1, signal_cb_sa) == SIG_ERR) 811 goto out; 812 #endif 813 signal_set(&ev, SIGUSR1, signal_cb, &ev); 814 signal_add(&ev, NULL); 815 signal_del(&ev); 816 817 raise(SIGUSR1); 818 /* 1 == signal_cb, 2 == signal_cb_sa, we want our previous handler */ 819 if (test_ok != 2) 820 test_ok = 0; 821 out: 822 event_base_free(base); 823 cleanup_test(); 824 return; 825 } 826 827 static void 828 signal_cb_swp(int sig, short event, void *arg) 829 { 830 called++; 831 if (called < 5) 832 raise(sig); 833 else 834 event_loopexit(NULL); 835 } 836 static void 837 timeout_cb_swp(int fd, short event, void *arg) 838 { 839 if (called == -1) { 840 struct timeval tv = {5, 0}; 841 842 called = 0; 843 evtimer_add((struct event *)arg, &tv); 844 raise(SIGUSR1); 845 return; 846 } 847 test_ok = 0; 848 event_loopexit(NULL); 849 } 850 851 static void 852 test_signal_while_processing(void) 853 { 854 struct event_base *base = event_init(); 855 struct event ev, ev_timer; 856 struct timeval tv = {0, 0}; 857 858 setup_test("Receiving a signal while processing other signal: "); 859 860 called = -1; 861 test_ok = 1; 862 signal_set(&ev, SIGUSR1, signal_cb_swp, NULL); 863 signal_add(&ev, NULL); 864 evtimer_set(&ev_timer, timeout_cb_swp, &ev_timer); 865 evtimer_add(&ev_timer, &tv); 866 event_dispatch(); 867 868 event_base_free(base); 869 cleanup_test(); 870 return; 871 } 872 #endif 873 874 static void 875 test_free_active_base(void) 876 { 877 struct event_base *base1; 878 struct event ev1; 879 setup_test("Free active base: "); 880 base1 = event_init(); 881 event_set(&ev1, pair[1], EV_READ, simple_read_cb, &ev1); 882 event_base_set(base1, &ev1); 883 event_add(&ev1, NULL); 884 /* event_del(&ev1); */ 885 event_base_free(base1); 886 test_ok = 1; 887 cleanup_test(); 888 } 889 890 static void 891 test_event_base_new(void) 892 { 893 struct event_base *base; 894 struct event ev1; 895 setup_test("Event base new: "); 896 897 write(pair[0], TEST1, strlen(TEST1)+1); 898 shutdown(pair[0], SHUT_WR); 899 900 base = event_base_new(); 901 event_set(&ev1, pair[1], EV_READ, simple_read_cb, &ev1); 902 event_base_set(base, &ev1); 903 event_add(&ev1, NULL); 904 905 event_base_dispatch(base); 906 907 event_base_free(base); 908 test_ok = 1; 909 cleanup_test(); 910 } 911 912 static void 913 test_loopexit(void) 914 { 915 struct timeval tv, tv_start, tv_end; 916 struct event ev; 917 918 setup_test("Loop exit: "); 919 920 tv.tv_usec = 0; 921 tv.tv_sec = 60*60*24; 922 evtimer_set(&ev, timeout_cb, NULL); 923 evtimer_add(&ev, &tv); 924 925 tv.tv_usec = 0; 926 tv.tv_sec = 1; 927 event_loopexit(&tv); 928 929 evutil_gettimeofday(&tv_start, NULL); 930 event_dispatch(); 931 evutil_gettimeofday(&tv_end, NULL); 932 evutil_timersub(&tv_end, &tv_start, &tv_end); 933 934 evtimer_del(&ev); 935 936 if (tv.tv_sec < 2) 937 test_ok = 1; 938 939 cleanup_test(); 940 } 941 942 static void 943 test_loopexit_multiple(void) 944 { 945 struct timeval tv; 946 struct event_base *base; 947 948 setup_test("Loop Multiple exit: "); 949 950 base = event_base_new(); 951 952 tv.tv_usec = 0; 953 tv.tv_sec = 1; 954 event_base_loopexit(base, &tv); 955 956 tv.tv_usec = 0; 957 tv.tv_sec = 2; 958 event_base_loopexit(base, &tv); 959 960 event_base_dispatch(base); 961 962 event_base_free(base); 963 964 test_ok = 1; 965 966 cleanup_test(); 967 } 968 969 static void 970 break_cb(int fd, short events, void *arg) 971 { 972 test_ok = 1; 973 event_loopbreak(); 974 } 975 976 static void 977 fail_cb(int fd, short events, void *arg) 978 { 979 test_ok = 0; 980 } 981 982 static void 983 test_loopbreak(void) 984 { 985 struct event ev1, ev2; 986 struct timeval tv; 987 988 setup_test("Loop break: "); 989 990 tv.tv_sec = 0; 991 tv.tv_usec = 0; 992 evtimer_set(&ev1, break_cb, NULL); 993 evtimer_add(&ev1, &tv); 994 evtimer_set(&ev2, fail_cb, NULL); 995 evtimer_add(&ev2, &tv); 996 997 event_dispatch(); 998 999 evtimer_del(&ev1); 1000 evtimer_del(&ev2); 1001 1002 cleanup_test(); 1003 } 1004 1005 static void 1006 test_evbuffer(void) { 1007 1008 struct evbuffer *evb = evbuffer_new(); 1009 setup_test("Testing Evbuffer: "); 1010 1011 evbuffer_add_printf(evb, "%s/%d", "hello", 1); 1012 1013 if (EVBUFFER_LENGTH(evb) == 7 && 1014 strcmp((char*)EVBUFFER_DATA(evb), "hello/1") == 0) 1015 test_ok = 1; 1016 1017 evbuffer_free(evb); 1018 1019 cleanup_test(); 1020 } 1021 1022 static void 1023 test_evbuffer_find(void) 1024 { 1025 u_char* p; 1026 const char* test1 = "1234567890\r\n"; 1027 const char* test2 = "1234567890\r"; 1028 #define EVBUFFER_INITIAL_LENGTH 256 1029 char test3[EVBUFFER_INITIAL_LENGTH]; 1030 unsigned int i; 1031 struct evbuffer * buf = evbuffer_new(); 1032 1033 /* make sure evbuffer_find doesn't match past the end of the buffer */ 1034 fprintf(stdout, "Testing evbuffer_find 1: "); 1035 evbuffer_add(buf, (u_char*)test1, strlen(test1)); 1036 evbuffer_drain(buf, strlen(test1)); 1037 evbuffer_add(buf, (u_char*)test2, strlen(test2)); 1038 p = evbuffer_find(buf, (u_char*)"\r\n", 2); 1039 if (p == NULL) { 1040 fprintf(stdout, "OK\n"); 1041 } else { 1042 fprintf(stdout, "FAILED\n"); 1043 exit(1); 1044 } 1045 1046 /* 1047 * drain the buffer and do another find; in r309 this would 1048 * read past the allocated buffer causing a valgrind error. 1049 */ 1050 fprintf(stdout, "Testing evbuffer_find 2: "); 1051 evbuffer_drain(buf, strlen(test2)); 1052 for (i = 0; i < EVBUFFER_INITIAL_LENGTH; ++i) 1053 test3[i] = 'a'; 1054 test3[EVBUFFER_INITIAL_LENGTH - 1] = 'x'; 1055 evbuffer_add(buf, (u_char *)test3, EVBUFFER_INITIAL_LENGTH); 1056 p = evbuffer_find(buf, (u_char *)"xy", 2); 1057 if (p == NULL) { 1058 printf("OK\n"); 1059 } else { 1060 fprintf(stdout, "FAILED\n"); 1061 exit(1); 1062 } 1063 1064 /* simple test for match at end of allocated buffer */ 1065 fprintf(stdout, "Testing evbuffer_find 3: "); 1066 p = evbuffer_find(buf, (u_char *)"ax", 2); 1067 if (p != NULL && strncmp((char*)p, "ax", 2) == 0) { 1068 printf("OK\n"); 1069 } else { 1070 fprintf(stdout, "FAILED\n"); 1071 exit(1); 1072 } 1073 1074 evbuffer_free(buf); 1075 } 1076 1077 /* 1078 * simple bufferevent test 1079 */ 1080 1081 static void 1082 readcb(struct bufferevent *bev, void *arg) 1083 { 1084 if (EVBUFFER_LENGTH(bev->input) == 8333) { 1085 bufferevent_disable(bev, EV_READ); 1086 test_ok++; 1087 } 1088 } 1089 1090 static void 1091 writecb(struct bufferevent *bev, void *arg) 1092 { 1093 if (EVBUFFER_LENGTH(bev->output) == 0) 1094 test_ok++; 1095 } 1096 1097 static void 1098 errorcb(struct bufferevent *bev, short what, void *arg) 1099 { 1100 test_ok = -2; 1101 } 1102 1103 static void 1104 test_bufferevent(void) 1105 { 1106 struct bufferevent *bev1, *bev2; 1107 char buffer[8333]; 1108 int i; 1109 1110 setup_test("Bufferevent: "); 1111 1112 bev1 = bufferevent_new(pair[0], readcb, writecb, errorcb, NULL); 1113 bev2 = bufferevent_new(pair[1], readcb, writecb, errorcb, NULL); 1114 1115 bufferevent_disable(bev1, EV_READ); 1116 bufferevent_enable(bev2, EV_READ); 1117 1118 for (i = 0; i < sizeof(buffer); i++) 1119 buffer[i] = i; 1120 1121 bufferevent_write(bev1, buffer, sizeof(buffer)); 1122 1123 event_dispatch(); 1124 1125 bufferevent_free(bev1); 1126 bufferevent_free(bev2); 1127 1128 if (test_ok != 2) 1129 test_ok = 0; 1130 1131 cleanup_test(); 1132 } 1133 1134 /* 1135 * test watermarks and bufferevent 1136 */ 1137 1138 static void 1139 wm_readcb(struct bufferevent *bev, void *arg) 1140 { 1141 int len = EVBUFFER_LENGTH(bev->input); 1142 static int nread; 1143 1144 assert(len >= 10 && len <= 20); 1145 1146 evbuffer_drain(bev->input, len); 1147 1148 nread += len; 1149 if (nread == 65000) { 1150 bufferevent_disable(bev, EV_READ); 1151 test_ok++; 1152 } 1153 } 1154 1155 static void 1156 wm_writecb(struct bufferevent *bev, void *arg) 1157 { 1158 if (EVBUFFER_LENGTH(bev->output) == 0) 1159 test_ok++; 1160 } 1161 1162 static void 1163 wm_errorcb(struct bufferevent *bev, short what, void *arg) 1164 { 1165 test_ok = -2; 1166 } 1167 1168 static void 1169 test_bufferevent_watermarks(void) 1170 { 1171 struct bufferevent *bev1, *bev2; 1172 char buffer[65000]; 1173 int i; 1174 1175 setup_test("Bufferevent Watermarks: "); 1176 1177 bev1 = bufferevent_new(pair[0], NULL, wm_writecb, wm_errorcb, NULL); 1178 bev2 = bufferevent_new(pair[1], wm_readcb, NULL, wm_errorcb, NULL); 1179 1180 bufferevent_disable(bev1, EV_READ); 1181 bufferevent_enable(bev2, EV_READ); 1182 1183 for (i = 0; i < sizeof(buffer); i++) 1184 buffer[i] = i; 1185 1186 bufferevent_write(bev1, buffer, sizeof(buffer)); 1187 1188 /* limit the reading on the receiving bufferevent */ 1189 bufferevent_setwatermark(bev2, EV_READ, 10, 20); 1190 1191 event_dispatch(); 1192 1193 bufferevent_free(bev1); 1194 bufferevent_free(bev2); 1195 1196 if (test_ok != 2) 1197 test_ok = 0; 1198 1199 cleanup_test(); 1200 } 1201 1202 struct test_pri_event { 1203 struct event ev; 1204 int count; 1205 }; 1206 1207 static void 1208 test_priorities_cb(int fd, short what, void *arg) 1209 { 1210 struct test_pri_event *pri = arg; 1211 struct timeval tv; 1212 1213 if (pri->count == 3) { 1214 event_loopexit(NULL); 1215 return; 1216 } 1217 1218 pri->count++; 1219 1220 evutil_timerclear(&tv); 1221 event_add(&pri->ev, &tv); 1222 } 1223 1224 static void 1225 test_priorities(int npriorities) 1226 { 1227 char buf[32]; 1228 struct test_pri_event one, two; 1229 struct timeval tv; 1230 1231 evutil_snprintf(buf, sizeof(buf), "Testing Priorities %d: ", npriorities); 1232 setup_test(buf); 1233 1234 event_base_priority_init(global_base, npriorities); 1235 1236 memset(&one, 0, sizeof(one)); 1237 memset(&two, 0, sizeof(two)); 1238 1239 timeout_set(&one.ev, test_priorities_cb, &one); 1240 if (event_priority_set(&one.ev, 0) == -1) { 1241 fprintf(stderr, "%s: failed to set priority", __func__); 1242 exit(1); 1243 } 1244 1245 timeout_set(&two.ev, test_priorities_cb, &two); 1246 if (event_priority_set(&two.ev, npriorities - 1) == -1) { 1247 fprintf(stderr, "%s: failed to set priority", __func__); 1248 exit(1); 1249 } 1250 1251 evutil_timerclear(&tv); 1252 1253 if (event_add(&one.ev, &tv) == -1) 1254 exit(1); 1255 if (event_add(&two.ev, &tv) == -1) 1256 exit(1); 1257 1258 event_dispatch(); 1259 1260 event_del(&one.ev); 1261 event_del(&two.ev); 1262 1263 if (npriorities == 1) { 1264 if (one.count == 3 && two.count == 3) 1265 test_ok = 1; 1266 } else if (npriorities == 2) { 1267 /* Two is called once because event_loopexit is priority 1 */ 1268 if (one.count == 3 && two.count == 1) 1269 test_ok = 1; 1270 } else { 1271 if (one.count == 3 && two.count == 0) 1272 test_ok = 1; 1273 } 1274 1275 cleanup_test(); 1276 } 1277 1278 static void 1279 test_multiple_cb(int fd, short event, void *arg) 1280 { 1281 if (event & EV_READ) 1282 test_ok |= 1; 1283 else if (event & EV_WRITE) 1284 test_ok |= 2; 1285 } 1286 1287 static void 1288 test_multiple_events_for_same_fd(void) 1289 { 1290 struct event e1, e2; 1291 1292 setup_test("Multiple events for same fd: "); 1293 1294 event_set(&e1, pair[0], EV_READ, test_multiple_cb, NULL); 1295 event_add(&e1, NULL); 1296 event_set(&e2, pair[0], EV_WRITE, test_multiple_cb, NULL); 1297 event_add(&e2, NULL); 1298 event_loop(EVLOOP_ONCE); 1299 event_del(&e2); 1300 write(pair[1], TEST1, strlen(TEST1)+1); 1301 event_loop(EVLOOP_ONCE); 1302 event_del(&e1); 1303 1304 if (test_ok != 3) 1305 test_ok = 0; 1306 1307 cleanup_test(); 1308 } 1309 1310 int evtag_decode_int(uint32_t *pnumber, struct evbuffer *evbuf); 1311 int evtag_encode_tag(struct evbuffer *evbuf, uint32_t number); 1312 int evtag_decode_tag(uint32_t *pnumber, struct evbuffer *evbuf); 1313 1314 static void 1315 read_once_cb(int fd, short event, void *arg) 1316 { 1317 char buf[256]; 1318 int len; 1319 1320 len = read(fd, buf, sizeof(buf)); 1321 1322 if (called) { 1323 test_ok = 0; 1324 } else if (len) { 1325 /* Assumes global pair[0] can be used for writing */ 1326 write(pair[0], TEST1, strlen(TEST1)+1); 1327 test_ok = 1; 1328 } 1329 1330 called++; 1331 } 1332 1333 static void 1334 test_want_only_once(void) 1335 { 1336 struct event ev; 1337 struct timeval tv; 1338 1339 /* Very simple read test */ 1340 setup_test("Want read only once: "); 1341 1342 write(pair[0], TEST1, strlen(TEST1)+1); 1343 1344 /* Setup the loop termination */ 1345 evutil_timerclear(&tv); 1346 tv.tv_sec = 1; 1347 event_loopexit(&tv); 1348 1349 event_set(&ev, pair[1], EV_READ, read_once_cb, &ev); 1350 if (event_add(&ev, NULL) == -1) 1351 exit(1); 1352 event_dispatch(); 1353 1354 cleanup_test(); 1355 } 1356 1357 #define TEST_MAX_INT 6 1358 1359 static void 1360 evtag_int_test(void) 1361 { 1362 struct evbuffer *tmp = evbuffer_new(); 1363 uint32_t integers[TEST_MAX_INT] = { 1364 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000 1365 }; 1366 uint32_t integer; 1367 int i; 1368 1369 for (i = 0; i < TEST_MAX_INT; i++) { 1370 int oldlen, newlen; 1371 oldlen = EVBUFFER_LENGTH(tmp); 1372 encode_int(tmp, integers[i]); 1373 newlen = EVBUFFER_LENGTH(tmp); 1374 fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n", 1375 integers[i], newlen - oldlen); 1376 } 1377 1378 for (i = 0; i < TEST_MAX_INT; i++) { 1379 if (evtag_decode_int(&integer, tmp) == -1) { 1380 fprintf(stderr, "decode %d failed", i); 1381 exit(1); 1382 } 1383 if (integer != integers[i]) { 1384 fprintf(stderr, "got %x, wanted %x", 1385 integer, integers[i]); 1386 exit(1); 1387 } 1388 } 1389 1390 if (EVBUFFER_LENGTH(tmp) != 0) { 1391 fprintf(stderr, "trailing data"); 1392 exit(1); 1393 } 1394 evbuffer_free(tmp); 1395 1396 fprintf(stdout, "\t%s: OK\n", __func__); 1397 } 1398 1399 static void 1400 evtag_fuzz(void) 1401 { 1402 u_char buffer[4096]; 1403 struct evbuffer *tmp = evbuffer_new(); 1404 struct timeval tv; 1405 int i, j; 1406 1407 int not_failed = 0; 1408 for (j = 0; j < 100; j++) { 1409 for (i = 0; i < sizeof(buffer); i++) 1410 buffer[i] = rand(); 1411 evbuffer_drain(tmp, -1); 1412 evbuffer_add(tmp, buffer, sizeof(buffer)); 1413 1414 if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1) 1415 not_failed++; 1416 } 1417 1418 /* The majority of decodes should fail */ 1419 if (not_failed >= 10) { 1420 fprintf(stderr, "evtag_unmarshal should have failed"); 1421 exit(1); 1422 } 1423 1424 /* Now insert some corruption into the tag length field */ 1425 evbuffer_drain(tmp, -1); 1426 evutil_timerclear(&tv); 1427 tv.tv_sec = 1; 1428 evtag_marshal_timeval(tmp, 0, &tv); 1429 evbuffer_add(tmp, buffer, sizeof(buffer)); 1430 1431 EVBUFFER_DATA(tmp)[1] = 0xff; 1432 if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1) { 1433 fprintf(stderr, "evtag_unmarshal_timeval should have failed"); 1434 exit(1); 1435 } 1436 1437 evbuffer_free(tmp); 1438 1439 fprintf(stdout, "\t%s: OK\n", __func__); 1440 } 1441 1442 static void 1443 evtag_tag_encoding(void) 1444 { 1445 struct evbuffer *tmp = evbuffer_new(); 1446 uint32_t integers[TEST_MAX_INT] = { 1447 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000 1448 }; 1449 uint32_t integer; 1450 int i; 1451 1452 for (i = 0; i < TEST_MAX_INT; i++) { 1453 int oldlen, newlen; 1454 oldlen = EVBUFFER_LENGTH(tmp); 1455 evtag_encode_tag(tmp, integers[i]); 1456 newlen = EVBUFFER_LENGTH(tmp); 1457 fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n", 1458 integers[i], newlen - oldlen); 1459 } 1460 1461 for (i = 0; i < TEST_MAX_INT; i++) { 1462 if (evtag_decode_tag(&integer, tmp) == -1) { 1463 fprintf(stderr, "decode %d failed", i); 1464 exit(1); 1465 } 1466 if (integer != integers[i]) { 1467 fprintf(stderr, "got %x, wanted %x", 1468 integer, integers[i]); 1469 exit(1); 1470 } 1471 } 1472 1473 if (EVBUFFER_LENGTH(tmp) != 0) { 1474 fprintf(stderr, "trailing data"); 1475 exit(1); 1476 } 1477 evbuffer_free(tmp); 1478 1479 fprintf(stdout, "\t%s: OK\n", __func__); 1480 } 1481 1482 static void 1483 evtag_test(void) 1484 { 1485 fprintf(stdout, "Testing Tagging:\n"); 1486 1487 evtag_init(); 1488 evtag_int_test(); 1489 evtag_fuzz(); 1490 1491 evtag_tag_encoding(); 1492 1493 fprintf(stdout, "OK\n"); 1494 } 1495 1496 #ifndef WIN32 1497 static void 1498 rpc_test(void) 1499 { 1500 struct msg *msg, *msg2; 1501 struct kill *attack; 1502 struct run *run; 1503 struct evbuffer *tmp = evbuffer_new(); 1504 struct timeval tv_start, tv_end; 1505 uint32_t tag; 1506 int i; 1507 1508 fprintf(stdout, "Testing RPC: "); 1509 1510 msg = msg_new(); 1511 EVTAG_ASSIGN(msg, from_name, "niels"); 1512 EVTAG_ASSIGN(msg, to_name, "phoenix"); 1513 1514 if (EVTAG_GET(msg, attack, &attack) == -1) { 1515 fprintf(stderr, "Failed to set kill message.\n"); 1516 exit(1); 1517 } 1518 1519 EVTAG_ASSIGN(attack, weapon, "feather"); 1520 EVTAG_ASSIGN(attack, action, "tickle"); 1521 1522 evutil_gettimeofday(&tv_start, NULL); 1523 for (i = 0; i < 1000; ++i) { 1524 run = EVTAG_ADD(msg, run); 1525 if (run == NULL) { 1526 fprintf(stderr, "Failed to add run message.\n"); 1527 exit(1); 1528 } 1529 EVTAG_ASSIGN(run, how, "very fast but with some data in it"); 1530 EVTAG_ASSIGN(run, fixed_bytes, 1531 (unsigned char*)"012345678901234567890123"); 1532 } 1533 1534 if (msg_complete(msg) == -1) { 1535 fprintf(stderr, "Failed to make complete message.\n"); 1536 exit(1); 1537 } 1538 1539 evtag_marshal_msg(tmp, 0xdeaf, msg); 1540 1541 if (evtag_peek(tmp, &tag) == -1) { 1542 fprintf(stderr, "Failed to peak tag.\n"); 1543 exit (1); 1544 } 1545 1546 if (tag != 0xdeaf) { 1547 fprintf(stderr, "Got incorrect tag: %0x.\n", tag); 1548 exit (1); 1549 } 1550 1551 msg2 = msg_new(); 1552 if (evtag_unmarshal_msg(tmp, 0xdeaf, msg2) == -1) { 1553 fprintf(stderr, "Failed to unmarshal message.\n"); 1554 exit(1); 1555 } 1556 1557 evutil_gettimeofday(&tv_end, NULL); 1558 evutil_timersub(&tv_end, &tv_start, &tv_end); 1559 fprintf(stderr, "(%.1f us/add) ", 1560 (float)tv_end.tv_sec/(float)i * 1000000.0 + 1561 tv_end.tv_usec / (float)i); 1562 1563 if (!EVTAG_HAS(msg2, from_name) || 1564 !EVTAG_HAS(msg2, to_name) || 1565 !EVTAG_HAS(msg2, attack)) { 1566 fprintf(stderr, "Missing data structures.\n"); 1567 exit(1); 1568 } 1569 1570 if (EVTAG_LEN(msg2, run) != i) { 1571 fprintf(stderr, "Wrong number of run messages.\n"); 1572 exit(1); 1573 } 1574 1575 msg_free(msg); 1576 msg_free(msg2); 1577 1578 evbuffer_free(tmp); 1579 1580 fprintf(stdout, "OK\n"); 1581 } 1582 #endif 1583 1584 static void 1585 test_evutil_strtoll(void) 1586 { 1587 const char *s; 1588 char *endptr; 1589 setup_test("evutil_stroll: "); 1590 test_ok = 0; 1591 1592 if (evutil_strtoll("5000000000", NULL, 10) != ((ev_int64_t)5000000)*1000) 1593 goto err; 1594 if (evutil_strtoll("-5000000000", NULL, 10) != ((ev_int64_t)5000000)*-1000) 1595 goto err; 1596 s = " 99999stuff"; 1597 if (evutil_strtoll(s, &endptr, 10) != (ev_int64_t)99999) 1598 goto err; 1599 if (endptr != s+6) 1600 goto err; 1601 if (evutil_strtoll("foo", NULL, 10) != 0) 1602 goto err; 1603 1604 test_ok = 1; 1605 err: 1606 cleanup_test(); 1607 } 1608 1609 1610 int 1611 main (int argc, char **argv) 1612 { 1613 #ifdef WIN32 1614 WORD wVersionRequested; 1615 WSADATA wsaData; 1616 int err; 1617 1618 wVersionRequested = MAKEWORD( 2, 2 ); 1619 1620 err = WSAStartup( wVersionRequested, &wsaData ); 1621 #endif 1622 1623 #ifndef WIN32 1624 if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) 1625 return (1); 1626 #endif 1627 setvbuf(stdout, NULL, _IONBF, 0); 1628 1629 /* Initalize the event library */ 1630 global_base = event_init(); 1631 1632 test_registerfds(); 1633 1634 test_evutil_strtoll(); 1635 1636 /* use the global event base and need to be called first */ 1637 test_priorities(1); 1638 test_priorities(2); 1639 test_priorities(3); 1640 1641 test_evbuffer(); 1642 test_evbuffer_find(); 1643 1644 test_bufferevent(); 1645 test_bufferevent_watermarks(); 1646 1647 test_free_active_base(); 1648 1649 test_event_base_new(); 1650 1651 http_suite(); 1652 1653 #ifndef WIN32 1654 rpc_suite(); 1655 #endif 1656 1657 dns_suite(); 1658 1659 #ifndef WIN32 1660 test_fork(); 1661 #endif 1662 1663 test_simpleread(); 1664 1665 test_simplewrite(); 1666 1667 test_multiple(); 1668 1669 test_persistent(); 1670 1671 test_combined(); 1672 1673 test_simpletimeout(); 1674 #ifndef WIN32 1675 test_simplesignal(); 1676 test_multiplesignal(); 1677 test_immediatesignal(); 1678 #endif 1679 test_loopexit(); 1680 test_loopbreak(); 1681 1682 test_loopexit_multiple(); 1683 1684 test_multiple_events_for_same_fd(); 1685 1686 test_want_only_once(); 1687 1688 evtag_test(); 1689 1690 #ifndef WIN32 1691 rpc_test(); 1692 1693 test_signal_dealloc(); 1694 test_signal_pipeloss(); 1695 test_signal_switchbase(); 1696 test_signal_restore(); 1697 test_signal_assert(); 1698 test_signal_while_processing(); 1699 #endif 1700 1701 return (0); 1702 } 1703 1704