Annotation of embedaddon/strongswan/src/libcharon/plugins/vici/suites/test_request.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2014 Martin Willi
                      3:  * Copyright (C) 2014 revosec AG
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include <test_suite.h>
                     17: 
                     18: #include "../vici_dispatcher.h"
                     19: #include "../libvici.h"
                     20: 
                     21: #include <unistd.h>
                     22: 
                     23: #ifdef WIN32
                     24: # define URI "tcp://127.0.0.1:6543"
                     25: #else /* !WIN32 */
                     26: # define URI "unix:///tmp/strongswan-vici-request-test"
                     27: #endif /* !WIN32 */
                     28: 
                     29: static void encode_section(vici_req_t *req)
                     30: {
                     31:        vici_begin_section(req, "section1");
                     32:        vici_add_key_valuef(req, "key1", "value%u", 1);
                     33:        vici_add_key_value(req, "key2", "value2", strlen("value2"));
                     34:        vici_end_section(req);
                     35: }
                     36: 
                     37: static void decode_section(vici_res_t *res)
                     38: {
                     39:        char *str;
                     40:        int len;
                     41: 
                     42:        ck_assert(vici_parse(res) == VICI_PARSE_BEGIN_SECTION);
                     43:        ck_assert_str_eq(vici_parse_name(res), "section1");
                     44:        ck_assert(vici_parse(res) == VICI_PARSE_KEY_VALUE);
                     45:        ck_assert_str_eq(vici_parse_name(res), "key1");
                     46:        ck_assert_str_eq(vici_parse_value_str(res), "value1");
                     47:        ck_assert(vici_parse(res) == VICI_PARSE_KEY_VALUE);
                     48:        ck_assert_str_eq(vici_parse_name(res), "key2");
                     49:        str = vici_parse_value(res, &len);
                     50:        ck_assert(chunk_equals(chunk_from_str("value2"), chunk_create(str, len)));
                     51:        ck_assert(vici_parse(res) == VICI_PARSE_END_SECTION);
                     52:        ck_assert(vici_parse(res) == VICI_PARSE_END);
                     53: }
                     54: 
                     55: static void encode_list(vici_req_t *req)
                     56: {
                     57:        vici_begin_list(req, "list1");
                     58:        vici_add_list_item(req, "item1", strlen("item1"));
                     59:        vici_add_list_itemf(req, "item%u", 2);
                     60:        vici_end_list(req);
                     61: }
                     62: 
                     63: static void decode_list(vici_res_t *res)
                     64: {
                     65:        char *str;
                     66:        int len;
                     67: 
                     68:        ck_assert(vici_parse(res) == VICI_PARSE_BEGIN_LIST);
                     69:        ck_assert_str_eq(vici_parse_name(res), "list1");
                     70:        ck_assert(vici_parse(res) == VICI_PARSE_LIST_ITEM);
                     71:        ck_assert_str_eq(vici_parse_value_str(res), "item1");
                     72:        ck_assert(vici_parse(res) == VICI_PARSE_LIST_ITEM);
                     73:        str = vici_parse_value(res, &len);
                     74:        ck_assert(chunk_equals(chunk_from_str("item2"), chunk_create(str, len)));
                     75:        ck_assert(vici_parse(res) == VICI_PARSE_END_LIST);
                     76:        ck_assert(vici_parse(res) == VICI_PARSE_END);
                     77: }
                     78: 
                     79: static struct {
                     80:        void (*encode)(vici_req_t* req);
                     81:        void (*decode)(vici_res_t* res);
                     82: } echo_tests[] = {
                     83:        { encode_section, decode_section },
                     84:        { encode_list, decode_list },
                     85: };
                     86: 
                     87: static vici_message_t* echo_cb(void *user, char *name,
                     88:                                                           u_int id, vici_message_t *request)
                     89: {
                     90:        ck_assert_str_eq(name, "echo");
                     91:        ck_assert_int_eq((uintptr_t)user, 1);
                     92: 
                     93:        return vici_message_create_from_enumerator(request->create_enumerator(request));
                     94: }
                     95: 
                     96: START_TEST(test_echo)
                     97: {
                     98:        vici_dispatcher_t *dispatcher;
                     99:        vici_conn_t *conn;
                    100:        vici_req_t *req;
                    101:        vici_res_t *res;
                    102: 
                    103:        lib->processor->set_threads(lib->processor, 8);
                    104: 
                    105:        dispatcher = vici_dispatcher_create(URI);
                    106:        ck_assert(dispatcher);
                    107: 
                    108:        dispatcher->manage_command(dispatcher, "echo", echo_cb, (void*)(uintptr_t)1);
                    109: 
                    110:        vici_init();
                    111:        conn = vici_connect(URI);
                    112:        ck_assert(conn);
                    113: 
                    114:        req = vici_begin("echo");
                    115:        echo_tests[_i].encode(req);
                    116:        res = vici_submit(req, conn);
                    117:        ck_assert(res);
                    118:        echo_tests[_i].decode(res);
                    119:        vici_free_res(res);
                    120: 
                    121:        vici_disconnect(conn);
                    122: 
                    123:        dispatcher->manage_command(dispatcher, "echo", NULL, NULL);
                    124: 
                    125:        lib->processor->cancel(lib->processor);
                    126:        dispatcher->destroy(dispatcher);
                    127: 
                    128:        vici_deinit();
                    129: }
                    130: END_TEST
                    131: 
                    132: START_TEST(test_missing)
                    133: {
                    134:        vici_dispatcher_t *dispatcher;
                    135:        vici_conn_t *conn;
                    136:        vici_req_t *req;
                    137:        vici_res_t *res;
                    138: 
                    139:        lib->processor->set_threads(lib->processor, 8);
                    140: 
                    141:        dispatcher = vici_dispatcher_create(URI);
                    142:        ck_assert(dispatcher);
                    143: 
                    144:        vici_init();
                    145:        conn = vici_connect(URI);
                    146:        ck_assert(conn);
                    147: 
                    148:        req = vici_begin("nonexistent");
                    149:        encode_section(req);
                    150:        res = vici_submit(req, conn);
                    151:        ck_assert(res == NULL);
                    152: 
                    153:        vici_disconnect(conn);
                    154: 
                    155:        dispatcher->manage_command(dispatcher, "echo", NULL, NULL);
                    156: 
                    157:        lib->processor->cancel(lib->processor);
                    158:        dispatcher->destroy(dispatcher);
                    159: 
                    160:        vici_deinit();
                    161: }
                    162: END_TEST
                    163: 
                    164: static void event_cb(void *user, char *name, vici_res_t *ev)
                    165: {
                    166:        int *events = (int*)user;
                    167: 
                    168:        (*events)++;
                    169: }
                    170: 
                    171: START_TEST(test_stress)
                    172: {
                    173:        vici_dispatcher_t *dispatcher;
                    174:        vici_conn_t *conn;
                    175:        vici_req_t *req;
                    176:        vici_res_t *res;
                    177:        int i, total = 50, events = 0;
                    178: 
                    179:        lib->processor->set_threads(lib->processor, 8);
                    180: 
                    181:        dispatcher = vici_dispatcher_create(URI);
                    182:        ck_assert(dispatcher);
                    183: 
                    184:        dispatcher->manage_command(dispatcher, "echo", echo_cb, (void*)(uintptr_t)1);
                    185:        dispatcher->manage_event(dispatcher, "dummy", TRUE);
                    186: 
                    187:        vici_init();
                    188:        conn = vici_connect(URI);
                    189:        ck_assert(conn);
                    190: 
                    191:        for (i = 0; i < total; i++)
                    192:        {
                    193:                /* do some event management in between */
                    194:                ck_assert(vici_register(conn, "dummy", event_cb, &events) == 0);
                    195:                dispatcher->raise_event(dispatcher, "dummy", 0,
                    196:                        vici_message_create_from_args(
                    197:                                 VICI_KEY_VALUE, "key1", chunk_from_str("value1"),
                    198:                                VICI_END));
                    199: 
                    200:                req = vici_begin("echo");
                    201:                encode_section(req);
                    202:                res = vici_submit(req, conn);
                    203:                ck_assert(res);
                    204:                decode_section(res);
                    205:                vici_free_res(res);
                    206: 
                    207:                ck_assert(vici_register(conn, "dummy", NULL, NULL) == 0);
                    208:        }
                    209: 
                    210:        while (events < total)
                    211:        {
                    212:                usleep(1000);
                    213:        }
                    214: 
                    215:        vici_disconnect(conn);
                    216: 
                    217:        dispatcher->manage_command(dispatcher, "echo", NULL, NULL);
                    218:        dispatcher->manage_event(dispatcher, "dummy", FALSE);
                    219: 
                    220:        lib->processor->cancel(lib->processor);
                    221:        dispatcher->destroy(dispatcher);
                    222: 
                    223:        vici_deinit();
                    224: }
                    225: END_TEST
                    226: 
                    227: Suite *request_suite_create()
                    228: {
                    229:        Suite *s;
                    230:        TCase *tc;
                    231: 
                    232:        s = suite_create("vici request");
                    233: 
                    234:        tc = tcase_create("echo");
                    235:        tcase_add_loop_test(tc, test_echo, 0, countof(echo_tests));
                    236:        suite_add_tcase(s, tc);
                    237: 
                    238:        tc = tcase_create("missing");
                    239:        tcase_add_test(tc, test_missing);
                    240:        suite_add_tcase(s, tc);
                    241: 
                    242:        tc = tcase_create("stress");
                    243:        tcase_add_test(tc, test_stress);
                    244:        suite_add_tcase(s, tc);
                    245: 
                    246:        return s;
                    247: }

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