Annotation of embedaddon/libevent/test/regress.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 2003, 2004 Niels Provos <provos@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_readln(void)
                   1024: {
                   1025:        struct evbuffer *evb = evbuffer_new();
                   1026:        struct evbuffer *evb_tmp = evbuffer_new();
                   1027:        const char *s;
                   1028:        char *cp = NULL;
                   1029:        size_t sz;
                   1030: 
                   1031: #define tt_line_eq(content)                                            \
                   1032:        if (!cp || sz != strlen(content) || strcmp(cp, content)) {      \
                   1033:                fprintf(stdout, "FAILED\n");                            \
                   1034:                exit(1);                                                \
                   1035:        }
                   1036: #define tt_assert(expression)                                          \
                   1037:        if (!(expression)) {                                            \
                   1038:                fprintf(stdout, "FAILED\n");                            \
                   1039:                exit(1);                                                \
                   1040:        }                                                               \
                   1041: 
                   1042:        /* Test EOL_ANY. */
                   1043:        fprintf(stdout, "Testing evbuffer_readln EOL_ANY: ");
                   1044: 
                   1045:        s = "complex silly newline\r\n\n\r\n\n\rmore\0\n";
                   1046:        evbuffer_add(evb, s, strlen(s)+2);
                   1047:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
                   1048:        tt_line_eq("complex silly newline");
                   1049:        free(cp);
                   1050:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
                   1051:        if (!cp || sz != 5 || memcmp(cp, "more\0\0", 6)) {
                   1052:                fprintf(stdout, "FAILED\n");
                   1053:                exit(1);
                   1054:        }
                   1055:        if (evb->totallen == 0) {
                   1056:                fprintf(stdout, "FAILED\n");
                   1057:                exit(1);
                   1058:        }
                   1059:        s = "\nno newline";
                   1060:        evbuffer_add(evb, s, strlen(s));
                   1061:        free(cp);
                   1062:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
                   1063:        tt_line_eq("");
                   1064:        free(cp);
                   1065:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_ANY);
                   1066:         tt_assert(!cp);
                   1067:        evbuffer_drain(evb, EVBUFFER_LENGTH(evb));
                   1068:         tt_assert(EVBUFFER_LENGTH(evb) == 0);
                   1069: 
                   1070:        fprintf(stdout, "OK\n");
                   1071: 
                   1072:        /* Test EOL_CRLF */
                   1073:        fprintf(stdout, "Testing evbuffer_readln EOL_CRLF: ");
                   1074: 
                   1075:        s = "Line with\rin the middle\nLine with good crlf\r\n\nfinal\n";
                   1076:        evbuffer_add(evb, s, strlen(s));
                   1077:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
                   1078:        tt_line_eq("Line with\rin the middle");
                   1079:        free(cp);
                   1080: 
                   1081:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
                   1082:        tt_line_eq("Line with good crlf");
                   1083:        free(cp);
                   1084: 
                   1085:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
                   1086:        tt_line_eq("");
                   1087:        free(cp);
                   1088: 
                   1089:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
                   1090:        tt_line_eq("final");
                   1091:        s = "x";
                   1092:        evbuffer_add(evb, s, 1);
                   1093:        free(cp);
                   1094:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF);
                   1095:         tt_assert(!cp);
                   1096: 
                   1097:        fprintf(stdout, "OK\n");
                   1098: 
                   1099:        /* Test CRLF_STRICT */
                   1100:        fprintf(stdout, "Testing evbuffer_readln CRLF_STRICT: ");
                   1101: 
                   1102:        s = " and a bad crlf\nand a good one\r\n\r\nMore\r";
                   1103:        evbuffer_add(evb, s, strlen(s));
                   1104:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1105:        tt_line_eq("x and a bad crlf\nand a good one");
                   1106:        free(cp);
                   1107: 
                   1108:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1109:        tt_line_eq("");
                   1110:        free(cp);
                   1111: 
                   1112:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1113:         tt_assert(!cp);
                   1114:        evbuffer_add(evb, "\n", 1);
                   1115: 
                   1116:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1117:        tt_line_eq("More");
                   1118:        free(cp);
                   1119:        tt_assert(EVBUFFER_LENGTH(evb) == 0);
                   1120: 
                   1121:        s = "An internal CR\r is not an eol\r\nNor is a lack of one";
                   1122:        evbuffer_add(evb, s, strlen(s));
                   1123:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1124:        tt_line_eq("An internal CR\r is not an eol");
                   1125:        free(cp);
                   1126: 
                   1127:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1128:        tt_assert(!cp);
                   1129: 
                   1130:        evbuffer_add(evb, "\r\n", 2);
                   1131:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1132:        tt_line_eq("Nor is a lack of one");
                   1133:        free(cp);
                   1134:        tt_assert(EVBUFFER_LENGTH(evb) == 0);
                   1135: 
                   1136:        fprintf(stdout, "OK\n");
                   1137: 
                   1138:        /* Test LF */
                   1139:        fprintf(stdout, "Testing evbuffer_readln LF: ");
                   1140: 
                   1141:        s = "An\rand a nl\n\nText";
                   1142:        evbuffer_add(evb, s, strlen(s));
                   1143: 
                   1144:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
                   1145:        tt_line_eq("An\rand a nl");
                   1146:        free(cp);
                   1147: 
                   1148:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
                   1149:        tt_line_eq("");
                   1150:        free(cp);
                   1151: 
                   1152:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
                   1153:        tt_assert(!cp);
                   1154:        free(cp);
                   1155:        evbuffer_add(evb, "\n", 1);
                   1156:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
                   1157:        tt_line_eq("Text");
                   1158:        free(cp);
                   1159: 
                   1160:        fprintf(stdout, "OK\n");
                   1161: 
                   1162:        /* Test CRLF_STRICT - across boundaries */
                   1163:        fprintf(stdout,
                   1164:            "Testing evbuffer_readln CRLF_STRICT across boundaries: ");
                   1165: 
                   1166:        s = " and a bad crlf\nand a good one\r";
                   1167:        evbuffer_add(evb_tmp, s, strlen(s));
                   1168:        evbuffer_add_buffer(evb, evb_tmp);
                   1169:        s = "\n\r";
                   1170:        evbuffer_add(evb_tmp, s, strlen(s));
                   1171:        evbuffer_add_buffer(evb, evb_tmp);
                   1172:        s = "\nMore\r";
                   1173:        evbuffer_add(evb_tmp, s, strlen(s));
                   1174:        evbuffer_add_buffer(evb, evb_tmp);
                   1175: 
                   1176:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1177:        tt_line_eq(" and a bad crlf\nand a good one");
                   1178:        free(cp);
                   1179: 
                   1180:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1181:        tt_line_eq("");
                   1182:        free(cp);
                   1183: 
                   1184:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1185:        tt_assert(!cp);
                   1186:        free(cp);
                   1187:        evbuffer_add(evb, "\n", 1);
                   1188:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_CRLF_STRICT);
                   1189:        tt_line_eq("More");
                   1190:        free(cp); cp = NULL;
                   1191:        if (EVBUFFER_LENGTH(evb) != 0) {
                   1192:                fprintf(stdout, "FAILED\n");
                   1193:                exit(1);
                   1194:        }
                   1195: 
                   1196:        fprintf(stdout, "OK\n");
                   1197: 
                   1198:        /* Test memory problem */
                   1199:        fprintf(stdout, "Testing evbuffer_readln memory problem: ");
                   1200: 
                   1201:        s = "one line\ntwo line\nblue line";
                   1202:        evbuffer_add(evb_tmp, s, strlen(s));
                   1203:        evbuffer_add_buffer(evb, evb_tmp);
                   1204: 
                   1205:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
                   1206:        tt_line_eq("one line");
                   1207:        free(cp); cp = NULL;
                   1208: 
                   1209:        cp = evbuffer_readln(evb, &sz, EVBUFFER_EOL_LF);
                   1210:        tt_line_eq("two line");
                   1211:        free(cp); cp = NULL;
                   1212: 
                   1213:        fprintf(stdout, "OK\n");
                   1214: 
                   1215:        test_ok = 1;
                   1216:        evbuffer_free(evb);
                   1217:        evbuffer_free(evb_tmp);
                   1218:        if (cp) free(cp);
                   1219: }
                   1220: 
                   1221: static void
                   1222: test_evbuffer_find(void)
                   1223: {
                   1224:        u_char* p;
                   1225:        const char* test1 = "1234567890\r\n";
                   1226:        const char* test2 = "1234567890\r";
                   1227: #define EVBUFFER_INITIAL_LENGTH 256
                   1228:        char test3[EVBUFFER_INITIAL_LENGTH];
                   1229:        unsigned int i;
                   1230:        struct evbuffer * buf = evbuffer_new();
                   1231: 
                   1232:        /* make sure evbuffer_find doesn't match past the end of the buffer */
                   1233:        fprintf(stdout, "Testing evbuffer_find 1: ");
                   1234:        evbuffer_add(buf, (u_char*)test1, strlen(test1));
                   1235:        evbuffer_drain(buf, strlen(test1));       
                   1236:        evbuffer_add(buf, (u_char*)test2, strlen(test2));
                   1237:        p = evbuffer_find(buf, (u_char*)"\r\n", 2);
                   1238:        if (p == NULL) {
                   1239:                fprintf(stdout, "OK\n");
                   1240:        } else {
                   1241:                fprintf(stdout, "FAILED\n");
                   1242:                exit(1);
                   1243:        }
                   1244: 
                   1245:        /*
                   1246:         * drain the buffer and do another find; in r309 this would
                   1247:         * read past the allocated buffer causing a valgrind error.
                   1248:         */
                   1249:        fprintf(stdout, "Testing evbuffer_find 2: ");
                   1250:        evbuffer_drain(buf, strlen(test2));
                   1251:        for (i = 0; i < EVBUFFER_INITIAL_LENGTH; ++i)
                   1252:                test3[i] = 'a';
                   1253:        test3[EVBUFFER_INITIAL_LENGTH - 1] = 'x';
                   1254:        evbuffer_add(buf, (u_char *)test3, EVBUFFER_INITIAL_LENGTH);
                   1255:        p = evbuffer_find(buf, (u_char *)"xy", 2);
                   1256:        if (p == NULL) {
                   1257:                printf("OK\n");
                   1258:        } else {
                   1259:                fprintf(stdout, "FAILED\n");
                   1260:                exit(1);
                   1261:        }
                   1262: 
                   1263:        /* simple test for match at end of allocated buffer */
                   1264:        fprintf(stdout, "Testing evbuffer_find 3: ");
                   1265:        p = evbuffer_find(buf, (u_char *)"ax", 2);
                   1266:        if (p != NULL && strncmp((char*)p, "ax", 2) == 0) {
                   1267:                printf("OK\n");
                   1268:        } else {
                   1269:                fprintf(stdout, "FAILED\n");
                   1270:                exit(1);
                   1271:        }
                   1272: 
                   1273:        evbuffer_free(buf);
                   1274: }
                   1275: 
                   1276: /*
                   1277:  * simple bufferevent test
                   1278:  */
                   1279: 
                   1280: static void
                   1281: readcb(struct bufferevent *bev, void *arg)
                   1282: {
                   1283:        if (EVBUFFER_LENGTH(bev->input) == 8333) {
                   1284:                bufferevent_disable(bev, EV_READ);
                   1285:                test_ok++;
                   1286:        }
                   1287: }
                   1288: 
                   1289: static void
                   1290: writecb(struct bufferevent *bev, void *arg)
                   1291: {
                   1292:        if (EVBUFFER_LENGTH(bev->output) == 0)
                   1293:                test_ok++;
                   1294: }
                   1295: 
                   1296: static void
                   1297: errorcb(struct bufferevent *bev, short what, void *arg)
                   1298: {
                   1299:        test_ok = -2;
                   1300: }
                   1301: 
                   1302: static void
                   1303: test_bufferevent(void)
                   1304: {
                   1305:        struct bufferevent *bev1, *bev2;
                   1306:        char buffer[8333];
                   1307:        int i;
                   1308: 
                   1309:        setup_test("Bufferevent: ");
                   1310: 
                   1311:        bev1 = bufferevent_new(pair[0], readcb, writecb, errorcb, NULL);
                   1312:        bev2 = bufferevent_new(pair[1], readcb, writecb, errorcb, NULL);
                   1313: 
                   1314:        bufferevent_disable(bev1, EV_READ);
                   1315:        bufferevent_enable(bev2, EV_READ);
                   1316: 
                   1317:        for (i = 0; i < sizeof(buffer); i++)
                   1318:                buffer[i] = i;
                   1319: 
                   1320:        bufferevent_write(bev1, buffer, sizeof(buffer));
                   1321: 
                   1322:        event_dispatch();
                   1323: 
                   1324:        bufferevent_free(bev1);
                   1325:        bufferevent_free(bev2);
                   1326: 
                   1327:        if (test_ok != 2)
                   1328:                test_ok = 0;
                   1329: 
                   1330:        cleanup_test();
                   1331: }
                   1332: 
                   1333: /*
                   1334:  * test watermarks and bufferevent
                   1335:  */
                   1336: 
                   1337: static void
                   1338: wm_readcb(struct bufferevent *bev, void *arg)
                   1339: {
                   1340:        int len = EVBUFFER_LENGTH(bev->input);
                   1341:        static int nread;
                   1342: 
                   1343:        assert(len >= 10 && len <= 20);
                   1344: 
                   1345:        evbuffer_drain(bev->input, len);
                   1346: 
                   1347:        nread += len;
                   1348:        if (nread == 65000) {
                   1349:                bufferevent_disable(bev, EV_READ);
                   1350:                test_ok++;
                   1351:        }
                   1352: }
                   1353: 
                   1354: static void
                   1355: wm_writecb(struct bufferevent *bev, void *arg)
                   1356: {
                   1357:        if (EVBUFFER_LENGTH(bev->output) == 0)
                   1358:                test_ok++;
                   1359: }
                   1360: 
                   1361: static void
                   1362: wm_errorcb(struct bufferevent *bev, short what, void *arg)
                   1363: {
                   1364:        test_ok = -2;
                   1365: }
                   1366: 
                   1367: static void
                   1368: test_bufferevent_watermarks(void)
                   1369: {
                   1370:        struct bufferevent *bev1, *bev2;
                   1371:        char buffer[65000];
                   1372:        int i;
                   1373: 
                   1374:        setup_test("Bufferevent Watermarks: ");
                   1375: 
                   1376:        bev1 = bufferevent_new(pair[0], NULL, wm_writecb, wm_errorcb, NULL);
                   1377:        bev2 = bufferevent_new(pair[1], wm_readcb, NULL, wm_errorcb, NULL);
                   1378: 
                   1379:        bufferevent_disable(bev1, EV_READ);
                   1380:        bufferevent_enable(bev2, EV_READ);
                   1381: 
                   1382:        for (i = 0; i < sizeof(buffer); i++)
                   1383:                buffer[i] = i;
                   1384: 
                   1385:        bufferevent_write(bev1, buffer, sizeof(buffer));
                   1386: 
                   1387:        /* limit the reading on the receiving bufferevent */
                   1388:        bufferevent_setwatermark(bev2, EV_READ, 10, 20);
                   1389: 
                   1390:        event_dispatch();
                   1391: 
                   1392:        bufferevent_free(bev1);
                   1393:        bufferevent_free(bev2);
                   1394: 
                   1395:        if (test_ok != 2)
                   1396:                test_ok = 0;
                   1397: 
                   1398:        cleanup_test();
                   1399: }
                   1400: 
                   1401: struct test_pri_event {
                   1402:        struct event ev;
                   1403:        int count;
                   1404: };
                   1405: 
                   1406: static void
                   1407: test_priorities_cb(int fd, short what, void *arg)
                   1408: {
                   1409:        struct test_pri_event *pri = arg;
                   1410:        struct timeval tv;
                   1411: 
                   1412:        if (pri->count == 3) {
                   1413:                event_loopexit(NULL);
                   1414:                return;
                   1415:        }
                   1416: 
                   1417:        pri->count++;
                   1418: 
                   1419:        evutil_timerclear(&tv);
                   1420:        event_add(&pri->ev, &tv);
                   1421: }
                   1422: 
                   1423: static void
                   1424: test_priorities(int npriorities)
                   1425: {
                   1426:        char buf[32];
                   1427:        struct test_pri_event one, two;
                   1428:        struct timeval tv;
                   1429: 
                   1430:        evutil_snprintf(buf, sizeof(buf), "Testing Priorities %d: ", npriorities);
                   1431:        setup_test(buf);
                   1432: 
                   1433:        event_base_priority_init(global_base, npriorities);
                   1434: 
                   1435:        memset(&one, 0, sizeof(one));
                   1436:        memset(&two, 0, sizeof(two));
                   1437: 
                   1438:        timeout_set(&one.ev, test_priorities_cb, &one);
                   1439:        if (event_priority_set(&one.ev, 0) == -1) {
                   1440:                fprintf(stderr, "%s: failed to set priority", __func__);
                   1441:                exit(1);
                   1442:        }
                   1443: 
                   1444:        timeout_set(&two.ev, test_priorities_cb, &two);
                   1445:        if (event_priority_set(&two.ev, npriorities - 1) == -1) {
                   1446:                fprintf(stderr, "%s: failed to set priority", __func__);
                   1447:                exit(1);
                   1448:        }
                   1449: 
                   1450:        evutil_timerclear(&tv);
                   1451: 
                   1452:        if (event_add(&one.ev, &tv) == -1)
                   1453:                exit(1);
                   1454:        if (event_add(&two.ev, &tv) == -1)
                   1455:                exit(1);
                   1456: 
                   1457:        event_dispatch();
                   1458: 
                   1459:        event_del(&one.ev);
                   1460:        event_del(&two.ev);
                   1461: 
                   1462:        if (npriorities == 1) {
                   1463:                if (one.count == 3 && two.count == 3)
                   1464:                        test_ok = 1;
                   1465:        } else if (npriorities == 2) {
                   1466:                /* Two is called once because event_loopexit is priority 1 */
                   1467:                if (one.count == 3 && two.count == 1)
                   1468:                        test_ok = 1;
                   1469:        } else {
                   1470:                if (one.count == 3 && two.count == 0)
                   1471:                        test_ok = 1;
                   1472:        }
                   1473: 
                   1474:        cleanup_test();
                   1475: }
                   1476: 
                   1477: static void
                   1478: test_multiple_cb(int fd, short event, void *arg)
                   1479: {
                   1480:        if (event & EV_READ)
                   1481:                test_ok |= 1;
                   1482:        else if (event & EV_WRITE)
                   1483:                test_ok |= 2;
                   1484: }
                   1485: 
                   1486: static void
                   1487: test_multiple_events_for_same_fd(void)
                   1488: {
                   1489:    struct event e1, e2;
                   1490: 
                   1491:    setup_test("Multiple events for same fd: ");
                   1492: 
                   1493:    event_set(&e1, pair[0], EV_READ, test_multiple_cb, NULL);
                   1494:    event_add(&e1, NULL);
                   1495:    event_set(&e2, pair[0], EV_WRITE, test_multiple_cb, NULL);
                   1496:    event_add(&e2, NULL);
                   1497:    event_loop(EVLOOP_ONCE);
                   1498:    event_del(&e2);
                   1499:    write(pair[1], TEST1, strlen(TEST1)+1);
                   1500:    event_loop(EVLOOP_ONCE);
                   1501:    event_del(&e1);
                   1502:    
                   1503:    if (test_ok != 3)
                   1504:           test_ok = 0;
                   1505: 
                   1506:    cleanup_test();
                   1507: }
                   1508: 
                   1509: int evtag_decode_int(uint32_t *pnumber, struct evbuffer *evbuf);
                   1510: int evtag_encode_tag(struct evbuffer *evbuf, uint32_t number);
                   1511: int evtag_decode_tag(uint32_t *pnumber, struct evbuffer *evbuf);
                   1512: 
                   1513: static void
                   1514: read_once_cb(int fd, short event, void *arg)
                   1515: {
                   1516:        char buf[256];
                   1517:        int len;
                   1518: 
                   1519:        len = read(fd, buf, sizeof(buf));
                   1520: 
                   1521:        if (called) {
                   1522:                test_ok = 0;
                   1523:        } else if (len) {
                   1524:                /* Assumes global pair[0] can be used for writing */
                   1525:                write(pair[0], TEST1, strlen(TEST1)+1);
                   1526:                test_ok = 1;
                   1527:        }
                   1528: 
                   1529:        called++;
                   1530: }
                   1531: 
                   1532: static void
                   1533: test_want_only_once(void)
                   1534: {
                   1535:        struct event ev;
                   1536:        struct timeval tv;
                   1537: 
                   1538:        /* Very simple read test */
                   1539:        setup_test("Want read only once: ");
                   1540:        
                   1541:        write(pair[0], TEST1, strlen(TEST1)+1);
                   1542: 
                   1543:        /* Setup the loop termination */
                   1544:        evutil_timerclear(&tv);
                   1545:        tv.tv_sec = 1;
                   1546:        event_loopexit(&tv);
                   1547:        
                   1548:        event_set(&ev, pair[1], EV_READ, read_once_cb, &ev);
                   1549:        if (event_add(&ev, NULL) == -1)
                   1550:                exit(1);
                   1551:        event_dispatch();
                   1552: 
                   1553:        cleanup_test();
                   1554: }
                   1555: 
                   1556: #define TEST_MAX_INT   6
                   1557: 
                   1558: static void
                   1559: evtag_int_test(void)
                   1560: {
                   1561:        struct evbuffer *tmp = evbuffer_new();
                   1562:        uint32_t integers[TEST_MAX_INT] = {
                   1563:                0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000
                   1564:        };
                   1565:        uint32_t integer;
                   1566:        int i;
                   1567: 
                   1568:        for (i = 0; i < TEST_MAX_INT; i++) {
                   1569:                int oldlen, newlen;
                   1570:                oldlen = EVBUFFER_LENGTH(tmp);
                   1571:                encode_int(tmp, integers[i]);
                   1572:                newlen = EVBUFFER_LENGTH(tmp);
                   1573:                fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n",
                   1574:                    integers[i], newlen - oldlen);
                   1575:        }
                   1576: 
                   1577:        for (i = 0; i < TEST_MAX_INT; i++) {
                   1578:                if (evtag_decode_int(&integer, tmp) == -1) {
                   1579:                        fprintf(stderr, "decode %d failed", i);
                   1580:                        exit(1);
                   1581:                }
                   1582:                if (integer != integers[i]) {
                   1583:                        fprintf(stderr, "got %x, wanted %x",
                   1584:                            integer, integers[i]);
                   1585:                        exit(1);
                   1586:                }
                   1587:        }
                   1588: 
                   1589:        if (EVBUFFER_LENGTH(tmp) != 0) {
                   1590:                fprintf(stderr, "trailing data");
                   1591:                exit(1);
                   1592:        }
                   1593:        evbuffer_free(tmp);
                   1594: 
                   1595:        fprintf(stdout, "\t%s: OK\n", __func__);
                   1596: }
                   1597: 
                   1598: static void
                   1599: evtag_fuzz(void)
                   1600: {
                   1601:        u_char buffer[4096];
                   1602:        struct evbuffer *tmp = evbuffer_new();
                   1603:        struct timeval tv;
                   1604:        int i, j;
                   1605: 
                   1606:        int not_failed = 0;
                   1607:        for (j = 0; j < 100; j++) {
                   1608:                for (i = 0; i < sizeof(buffer); i++)
                   1609:                        buffer[i] = rand();
                   1610:                evbuffer_drain(tmp, -1);
                   1611:                evbuffer_add(tmp, buffer, sizeof(buffer));
                   1612: 
                   1613:                if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1)
                   1614:                        not_failed++;
                   1615:        }
                   1616: 
                   1617:        /* The majority of decodes should fail */
                   1618:        if (not_failed >= 10) {
                   1619:                fprintf(stderr, "evtag_unmarshal should have failed");
                   1620:                exit(1);
                   1621:        }
                   1622: 
                   1623:        /* Now insert some corruption into the tag length field */
                   1624:        evbuffer_drain(tmp, -1);
                   1625:        evutil_timerclear(&tv);
                   1626:        tv.tv_sec = 1;
                   1627:        evtag_marshal_timeval(tmp, 0, &tv);
                   1628:        evbuffer_add(tmp, buffer, sizeof(buffer));
                   1629: 
                   1630:        EVBUFFER_DATA(tmp)[1] = 0xff;
                   1631:        if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1) {
                   1632:                fprintf(stderr, "evtag_unmarshal_timeval should have failed");
                   1633:                exit(1);
                   1634:        }
                   1635: 
                   1636:        evbuffer_free(tmp);
                   1637: 
                   1638:        fprintf(stdout, "\t%s: OK\n", __func__);
                   1639: }
                   1640: 
                   1641: static void
                   1642: evtag_tag_encoding(void)
                   1643: {
                   1644:        struct evbuffer *tmp = evbuffer_new();
                   1645:        uint32_t integers[TEST_MAX_INT] = {
                   1646:                0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000
                   1647:        };
                   1648:        uint32_t integer;
                   1649:        int i;
                   1650: 
                   1651:        for (i = 0; i < TEST_MAX_INT; i++) {
                   1652:                int oldlen, newlen;
                   1653:                oldlen = EVBUFFER_LENGTH(tmp);
                   1654:                evtag_encode_tag(tmp, integers[i]);
                   1655:                newlen = EVBUFFER_LENGTH(tmp);
                   1656:                fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n",
                   1657:                    integers[i], newlen - oldlen);
                   1658:        }
                   1659: 
                   1660:        for (i = 0; i < TEST_MAX_INT; i++) {
                   1661:                if (evtag_decode_tag(&integer, tmp) == -1) {
                   1662:                        fprintf(stderr, "decode %d failed", i);
                   1663:                        exit(1);
                   1664:                }
                   1665:                if (integer != integers[i]) {
                   1666:                        fprintf(stderr, "got %x, wanted %x",
                   1667:                            integer, integers[i]);
                   1668:                        exit(1);
                   1669:                }
                   1670:        }
                   1671: 
                   1672:        if (EVBUFFER_LENGTH(tmp) != 0) {
                   1673:                fprintf(stderr, "trailing data");
                   1674:                exit(1);
                   1675:        }
                   1676:        evbuffer_free(tmp);
                   1677: 
                   1678:        fprintf(stdout, "\t%s: OK\n", __func__);
                   1679: }
                   1680: 
                   1681: static void
                   1682: evtag_test(void)
                   1683: {
                   1684:        fprintf(stdout, "Testing Tagging:\n");
                   1685: 
                   1686:        evtag_init();
                   1687:        evtag_int_test();
                   1688:        evtag_fuzz();
                   1689: 
                   1690:        evtag_tag_encoding();
                   1691: 
                   1692:        fprintf(stdout, "OK\n");
                   1693: }
                   1694: 
                   1695: #ifndef WIN32
                   1696: static void
                   1697: rpc_test(void)
                   1698: {
                   1699:        struct msg *msg, *msg2;
                   1700:        struct kill *attack;
                   1701:        struct run *run;
                   1702:        struct evbuffer *tmp = evbuffer_new();
                   1703:        struct timeval tv_start, tv_end;
                   1704:        uint32_t tag;
                   1705:        int i;
                   1706: 
                   1707:        fprintf(stdout, "Testing RPC: ");
                   1708: 
                   1709:        msg = msg_new();
                   1710:        EVTAG_ASSIGN(msg, from_name, "niels");
                   1711:        EVTAG_ASSIGN(msg, to_name, "phoenix");
                   1712: 
                   1713:        if (EVTAG_GET(msg, attack, &attack) == -1) {
                   1714:                fprintf(stderr, "Failed to set kill message.\n");
                   1715:                exit(1);
                   1716:        }
                   1717: 
                   1718:        EVTAG_ASSIGN(attack, weapon, "feather");
                   1719:        EVTAG_ASSIGN(attack, action, "tickle");
                   1720: 
                   1721:        evutil_gettimeofday(&tv_start, NULL);
                   1722:        for (i = 0; i < 1000; ++i) {
                   1723:                run = EVTAG_ADD(msg, run);
                   1724:                if (run == NULL) {
                   1725:                        fprintf(stderr, "Failed to add run message.\n");
                   1726:                        exit(1);
                   1727:                }
                   1728:                EVTAG_ASSIGN(run, how, "very fast but with some data in it");
                   1729:                EVTAG_ASSIGN(run, fixed_bytes,
                   1730:                    (unsigned char*)"012345678901234567890123");
                   1731:        }
                   1732: 
                   1733:        if (msg_complete(msg) == -1) {
                   1734:                fprintf(stderr, "Failed to make complete message.\n");
                   1735:                exit(1);
                   1736:        }
                   1737: 
                   1738:        evtag_marshal_msg(tmp, 0xdeaf, msg);
                   1739: 
                   1740:        if (evtag_peek(tmp, &tag) == -1) {
                   1741:                fprintf(stderr, "Failed to peak tag.\n");
                   1742:                exit (1);
                   1743:        }
                   1744: 
                   1745:        if (tag != 0xdeaf) {
                   1746:                fprintf(stderr, "Got incorrect tag: %0x.\n", tag);
                   1747:                exit (1);
                   1748:        }
                   1749: 
                   1750:        msg2 = msg_new();
                   1751:        if (evtag_unmarshal_msg(tmp, 0xdeaf, msg2) == -1) {
                   1752:                fprintf(stderr, "Failed to unmarshal message.\n");
                   1753:                exit(1);
                   1754:        }
                   1755: 
                   1756:        evutil_gettimeofday(&tv_end, NULL);
                   1757:        evutil_timersub(&tv_end, &tv_start, &tv_end);
                   1758:        fprintf(stderr, "(%.1f us/add) ",
                   1759:            (float)tv_end.tv_sec/(float)i * 1000000.0 +
                   1760:            tv_end.tv_usec / (float)i);
                   1761: 
                   1762:        if (!EVTAG_HAS(msg2, from_name) ||
                   1763:            !EVTAG_HAS(msg2, to_name) ||
                   1764:            !EVTAG_HAS(msg2, attack)) {
                   1765:                fprintf(stderr, "Missing data structures.\n");
                   1766:                exit(1);
                   1767:        }
                   1768: 
                   1769:        if (EVTAG_LEN(msg2, run) != i) {
                   1770:                fprintf(stderr, "Wrong number of run messages.\n");
                   1771:                exit(1);
                   1772:        }
                   1773: 
                   1774:        msg_free(msg);
                   1775:        msg_free(msg2);
                   1776: 
                   1777:        evbuffer_free(tmp);
                   1778: 
                   1779:        fprintf(stdout, "OK\n");
                   1780: }
                   1781: #endif
                   1782: 
                   1783: static void
                   1784: test_evutil_strtoll(void)
                   1785: {
                   1786:         const char *s;
                   1787:         char *endptr;
                   1788:         setup_test("evutil_stroll: ");
                   1789:         test_ok = 0;
                   1790: 
                   1791:         if (evutil_strtoll("5000000000", NULL, 10) != ((ev_int64_t)5000000)*1000)
                   1792:                 goto err;
                   1793:         if (evutil_strtoll("-5000000000", NULL, 10) != ((ev_int64_t)5000000)*-1000)
                   1794:                 goto err;
                   1795:         s = " 99999stuff";
                   1796:         if (evutil_strtoll(s, &endptr, 10) != (ev_int64_t)99999)
                   1797:                 goto err;
                   1798:         if (endptr != s+6)
                   1799:                 goto err;
                   1800:         if (evutil_strtoll("foo", NULL, 10) != 0)
                   1801:                 goto err;
                   1802: 
                   1803:         test_ok = 1;
                   1804:  err:
                   1805:         cleanup_test();
                   1806: }
                   1807: 
                   1808: 
                   1809: int
                   1810: main (int argc, char **argv)
                   1811: {
                   1812: #ifdef WIN32
                   1813:        WORD wVersionRequested;
                   1814:        WSADATA wsaData;
                   1815:        int     err;
                   1816: 
                   1817:        wVersionRequested = MAKEWORD( 2, 2 );
                   1818: 
                   1819:        err = WSAStartup( wVersionRequested, &wsaData );
                   1820: #endif
                   1821: 
                   1822: #ifndef WIN32
                   1823:        if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
                   1824:                return (1);
                   1825: #endif
                   1826:        setvbuf(stdout, NULL, _IONBF, 0);
                   1827: 
                   1828:        /* Initalize the event library */
                   1829:        global_base = event_init();
                   1830: 
                   1831:        test_registerfds();
                   1832: 
                   1833:         test_evutil_strtoll();
                   1834: 
                   1835:        /* use the global event base and need to be called first */
                   1836:        test_priorities(1);
                   1837:        test_priorities(2);
                   1838:        test_priorities(3);
                   1839: 
                   1840:        test_evbuffer();
                   1841:        test_evbuffer_find();
                   1842:        test_evbuffer_readln();
                   1843:        
                   1844:        test_bufferevent();
                   1845:        test_bufferevent_watermarks();
                   1846: 
                   1847:        test_free_active_base();
                   1848: 
                   1849:        test_event_base_new();
                   1850: 
                   1851:        http_suite();
                   1852: 
                   1853: #ifndef WIN32
                   1854:        rpc_suite();
                   1855: #endif
                   1856: 
                   1857:        dns_suite();
                   1858:        
                   1859: #ifndef WIN32
                   1860:        test_fork();
                   1861: #endif
                   1862: 
                   1863:        test_simpleread();
                   1864: 
                   1865:        test_simplewrite();
                   1866: 
                   1867:        test_multiple();
                   1868: 
                   1869:        test_persistent();
                   1870: 
                   1871:        test_combined();
                   1872: 
                   1873:        test_simpletimeout();
                   1874: #ifndef WIN32
                   1875:        test_simplesignal();
                   1876:        test_multiplesignal();
                   1877:        test_immediatesignal();
                   1878: #endif
                   1879:        test_loopexit();
                   1880:        test_loopbreak();
                   1881: 
                   1882:        test_loopexit_multiple();
                   1883:        
                   1884:        test_multiple_events_for_same_fd();
                   1885: 
                   1886:        test_want_only_once();
                   1887: 
                   1888:        evtag_test();
                   1889: 
                   1890: #ifndef WIN32
                   1891:        rpc_test();
                   1892: 
                   1893:        test_signal_dealloc();
                   1894:        test_signal_pipeloss();
                   1895:        test_signal_switchbase();
                   1896:        test_signal_restore();
                   1897:        test_signal_assert();
                   1898:        test_signal_while_processing();
                   1899: #endif
                   1900:        
                   1901:        return (0);
                   1902: }
                   1903: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>