Annotation of embedaddon/strongswan/src/libcharon/plugins/vici/suites/test_request.c, revision 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>