Annotation of embedaddon/strongswan/src/libcharon/plugins/vici/suites/test_event.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-event-test"
27: #endif /* !WIN32 */
28:
29: static void event_cb(void *user, char *name, vici_res_t *ev)
30: {
31: int *count = (int*)user;
32:
33: ck_assert_str_eq(name, "test");
34: ck_assert(vici_parse(ev) == VICI_PARSE_KEY_VALUE);
35: ck_assert_str_eq(vici_parse_name(ev), "key1");
36: ck_assert_str_eq(vici_parse_value_str(ev), "value1");
37: ck_assert(vici_parse(ev) == VICI_PARSE_END);
38:
39: (*count)++;
40: }
41:
42: START_TEST(test_event)
43: {
44: vici_dispatcher_t *dispatcher;
45: vici_conn_t *conn;
46: int count = 0;
47:
48: lib->processor->set_threads(lib->processor, 8);
49:
50: dispatcher = vici_dispatcher_create(URI);
51: ck_assert(dispatcher);
52:
53: dispatcher->manage_event(dispatcher, "test", TRUE);
54:
55: vici_init();
56: conn = vici_connect(URI);
57: ck_assert(conn);
58:
59: ck_assert(vici_register(conn, "test", event_cb, &count) == 0);
60: ck_assert(vici_register(conn, "nonexistent", event_cb, &count) != 0);
61:
62: dispatcher->raise_event(dispatcher, "test", 0, vici_message_create_from_args(
63: VICI_KEY_VALUE, "key1", chunk_from_str("value1"),
64: VICI_END));
65:
66: while (count == 0)
67: {
68: usleep(1000);
69: }
70:
71: vici_disconnect(conn);
72:
73: dispatcher->manage_event(dispatcher, "test", FALSE);
74:
75: lib->processor->cancel(lib->processor);
76: dispatcher->destroy(dispatcher);
77:
78: vici_deinit();
79: }
80: END_TEST
81:
82: #define EVENT_COUNT 500
83:
84: CALLBACK(raise_cb, vici_message_t*,
85: vici_dispatcher_t *dispatcher, char *name, u_int id, vici_message_t *req)
86: {
87: u_int i;
88:
89: for (i = 0; i < EVENT_COUNT; i++)
90: {
91: dispatcher->raise_event(dispatcher, "event", id,
92: vici_message_create_from_args(
93: VICI_KEY_VALUE, "counter", chunk_from_thing(i),
94: VICI_END));
95: }
96: return vici_message_create_from_args(VICI_END);
97: }
98:
99: CALLBACK(raise_event_cb, void,
100: int *count, char *name, vici_res_t *ev)
101: {
102: u_int *value, len;
103:
104: ck_assert_str_eq(name, "event");
105: ck_assert(vici_parse(ev) == VICI_PARSE_KEY_VALUE);
106: ck_assert_str_eq(vici_parse_name(ev), "counter");
107: value = vici_parse_value(ev, &len);
108: ck_assert_int_eq(len, sizeof(*value));
109: ck_assert(vici_parse(ev) == VICI_PARSE_END);
110:
111: ck_assert_int_eq(*count, *value);
112: (*count)++;
113: }
114:
115: START_TEST(test_raise_events)
116: {
117: vici_dispatcher_t *dispatcher;
118: vici_res_t *res;
119: vici_conn_t *conn;
120: int count = 0;
121:
122: lib->processor->set_threads(lib->processor, 8);
123:
124: dispatcher = vici_dispatcher_create(URI);
125: ck_assert(dispatcher);
126:
127: dispatcher->manage_event(dispatcher, "event", TRUE);
128: dispatcher->manage_command(dispatcher, "raise", raise_cb, dispatcher);
129:
130: vici_init();
131: conn = vici_connect(URI);
132: ck_assert(conn);
133:
134: ck_assert(vici_register(conn, "event", raise_event_cb, &count) == 0);
135:
136: res = vici_submit(vici_begin("raise"), conn);
137:
138: ck_assert_int_eq(count, EVENT_COUNT);
139: ck_assert(res);
140: vici_free_res(res);
141:
142: vici_disconnect(conn);
143:
144: dispatcher->manage_event(dispatcher, "event", FALSE);
145: dispatcher->manage_command(dispatcher, "raise", NULL, NULL);
146:
147: lib->processor->cancel(lib->processor);
148: dispatcher->destroy(dispatcher);
149:
150: vici_deinit();
151: }
152: END_TEST
153:
154: START_TEST(test_stress)
155: {
156: vici_dispatcher_t *dispatcher;
157: vici_conn_t *conn;
158: int count = 0, i, total = 50;
159:
160: lib->processor->set_threads(lib->processor, 8);
161:
162: dispatcher = vici_dispatcher_create(URI);
163: ck_assert(dispatcher);
164:
165: dispatcher->manage_event(dispatcher, "test", TRUE);
166: dispatcher->manage_event(dispatcher, "dummy", TRUE);
167:
168: vici_init();
169: conn = vici_connect(URI);
170: ck_assert(conn);
171:
172: vici_register(conn, "test", event_cb, &count);
173:
174: for (i = 0; i < total; i++)
175: {
176: /* do some event re/deregistration in between */
177: ck_assert(vici_register(conn, "dummy", event_cb, NULL) == 0);
178:
179: dispatcher->raise_event(dispatcher, "test", 0,
180: vici_message_create_from_args(
181: VICI_KEY_VALUE, "key1", chunk_from_str("value1"),
182: VICI_END));
183:
184: ck_assert(vici_register(conn, "dummy", NULL, NULL) == 0);
185: }
186:
187: while (count < total)
188: {
189: usleep(1000);
190: }
191:
192: vici_disconnect(conn);
193:
194: dispatcher->manage_event(dispatcher, "test", FALSE);
195: dispatcher->manage_event(dispatcher, "dummy", FALSE);
196:
197: lib->processor->cancel(lib->processor);
198: dispatcher->destroy(dispatcher);
199:
200: vici_deinit();
201: }
202: END_TEST
203:
204: Suite *event_suite_create()
205: {
206: Suite *s;
207: TCase *tc;
208:
209: s = suite_create("vici events");
210:
211: tc = tcase_create("single");
212: tcase_add_test(tc, test_event);
213: suite_add_tcase(s, tc);
214:
215: tc = tcase_create("raise events");
216: tcase_add_test(tc, test_raise_events);
217: suite_add_tcase(s, tc);
218:
219: tc = tcase_create("stress");
220: tcase_add_test(tc, test_stress);
221: suite_add_tcase(s, tc);
222:
223: return s;
224: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>