Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_watcher.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2013 Martin Willi
3: * Copyright (C) 2013 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 <library.h>
19:
20: #include <unistd.h>
21: #include <errno.h>
22:
23: static char testbuf[1] = "";
24:
25: static bool readcb(void *data, int fd, watcher_event_t event)
26: {
27: ck_assert_int_eq(*(int*)data, fd);
28: ck_assert_int_eq(event, WATCHER_READ);
29:
30: if (recv(fd, testbuf, 1, MSG_DONTWAIT) != 1)
31: {
32: ck_assert(errno == EAGAIN || errno == EWOULDBLOCK);
33: }
34: return TRUE;
35: }
36:
37: START_TEST(test_read)
38: {
39: int fd[2];
40: char c;
41:
42: lib->processor->set_threads(lib->processor, 8);
43:
44: ck_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fd) != -1);
45:
46: lib->watcher->add(lib->watcher, fd[0], WATCHER_READ, readcb, &fd[0]);
47:
48: for (c = 'a'; c <= 'z'; c++)
49: {
50: ck_assert_int_eq(send(fd[1], &c, 1, 0), 1);
51: while (testbuf[0] != c)
52: {
53: sched_yield();
54: }
55: }
56:
57: lib->watcher->remove(lib->watcher, fd[0]);
58: close(fd[0]);
59: close(fd[1]);
60:
61: lib->processor->cancel(lib->processor);
62: }
63: END_TEST
64:
65: static bool writecb(void *data, int fd, watcher_event_t event)
66: {
67: ck_assert_int_eq(event, WATCHER_WRITE);
68: if (send(fd, data, 1, MSG_DONTWAIT) != 1)
69: {
70: ck_assert(errno == EAGAIN || errno == EWOULDBLOCK);
71: }
72: return TRUE;
73: }
74:
75: START_TEST(test_write)
76: {
77: int fd[2];
78: char in = 'x', out;
79:
80: lib->processor->set_threads(lib->processor, 8);
81:
82: ck_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fd) != -1);
83:
84: lib->watcher->add(lib->watcher, fd[1], WATCHER_WRITE, writecb, &in);
85:
86: ck_assert_int_eq(recv(fd[0], &out, 1, 0), 1);
87: ck_assert_int_eq(out, in);
88:
89: lib->watcher->remove(lib->watcher, fd[1]);
90: close(fd[1]);
91: close(fd[0]);
92:
93: lib->processor->cancel(lib->processor);
94: }
95: END_TEST
96:
97: static bool multiread(void *data, int fd, watcher_event_t event)
98: {
99: ck_assert_int_eq(event, WATCHER_READ);
100: if (recv(fd, data, 1, MSG_DONTWAIT) != 1)
101: {
102: ck_assert(errno == EAGAIN || errno == EWOULDBLOCK);
103: }
104: return TRUE;
105: }
106:
107: START_TEST(test_multiread)
108: {
109: int fd[10][2], i;
110: char in, out[countof(fd)];
111:
112: lib->processor->set_threads(lib->processor, 8);
113:
114: for (i = 0; i < countof(fd); i++)
115: {
116: ck_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fd[i]) != -1);
117: lib->watcher->add(lib->watcher, fd[i][0],
118: WATCHER_READ, multiread, &out[i]);
119: }
120:
121: for (i = 0; i < countof(fd); i++)
122: {
123: for (in = 'a'; in <= 'z'; in++)
124: {
125: ck_assert_int_eq(send(fd[i][1], &in, 1, 0), 1);
126: while (out[i] != in)
127: {
128: sched_yield();
129: }
130: }
131: }
132:
133: for (i = 0; i < countof(fd); i++)
134: {
135: lib->watcher->remove(lib->watcher, fd[i][0]);
136: close(fd[i][1]);
137: close(fd[i][0]);
138: }
139:
140: lib->processor->cancel(lib->processor);
141: }
142: END_TEST
143:
144: static bool multiwrite(void *data, int fd, watcher_event_t event)
145: {
146: ck_assert_int_eq(event, WATCHER_WRITE);
147: if (send(fd, data, 1, MSG_DONTWAIT) != 1)
148: {
149: ck_assert(errno == EAGAIN || errno == EWOULDBLOCK);
150: }
151: return TRUE;
152: }
153:
154: START_TEST(test_multiwrite)
155: {
156: int fd[10][2], i, j;
157: u_char out, in[countof(fd)];
158:
159: lib->processor->set_threads(lib->processor, 8);
160:
161: for (i = 0; i < countof(fd); i++)
162: {
163: ck_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fd[i]) != -1);
164: in[i] = i;
165: lib->watcher->add(lib->watcher, fd[i][1],
166: WATCHER_WRITE, multiwrite, &in[i]);
167: }
168:
169: for (j = 0; j < 10; j++)
170: {
171: for (i = 0; i < countof(fd); i++)
172: {
173: ck_assert_int_eq(recv(fd[i][0], &out, 1, 0), 1);
174: ck_assert_int_eq(out, i);
175: }
176: }
177:
178: for (i = 0; i < countof(fd); i++)
179: {
180: lib->watcher->remove(lib->watcher, fd[i][1]);
181: close(fd[i][1]);
182: close(fd[i][0]);
183: }
184:
185: lib->processor->cancel(lib->processor);
186: }
187: END_TEST
188:
189: Suite *watcher_suite_create()
190: {
191: Suite *s;
192: TCase *tc;
193:
194: s = suite_create("watcher");
195:
196: tc = tcase_create("read");
197: tcase_add_test(tc, test_read);
198: suite_add_tcase(s, tc);
199:
200: tc = tcase_create("write");
201: tcase_add_test(tc, test_write);
202: suite_add_tcase(s, tc);
203:
204: tc = tcase_create("multiread");
205: tcase_add_test(tc, test_multiread);
206: suite_add_tcase(s, tc);
207:
208: tc = tcase_create("multiwrite");
209: tcase_add_test(tc, test_multiwrite);
210: suite_add_tcase(s, tc);
211:
212: return s;
213: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>