strongswan/src/libcharon/plugins/vici/suites/test_socket.c

134 lines
3.2 KiB
C

/*
* Copyright (C) 2014 Martin Willi
* Copyright (C) 2014 revosec AG
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include <test_suite.h>
#include "../vici_socket.h"
#include <unistd.h>
typedef struct {
vici_socket_t *s;
int disconnect;
int bytes;
u_int id;
} test_data_t;
static void echo_inbound(void *user, u_int id, chunk_t buf)
{
test_data_t *data = user;
ck_assert_int_eq(data->id, id);
/* count number of bytes, including the header */
data->bytes += buf.len + sizeof(uint32_t);
/* echo back data chunk */
data->s->send(data->s, id, chunk_clone(buf));
}
static void echo_connect(void *user, u_int id)
{
test_data_t *data = user;
data->id = id;
}
static void echo_disconnect(void *user, u_int id)
{
test_data_t *data = user;
ck_assert(id == data->id);
data->disconnect++;
}
static struct {
char *uri;
u_int chunksize;
} echo_tests[] = {
{ "tcp://127.0.0.1:6543", ~0 },
{ "tcp://127.0.0.1:6543", 1 },
{ "tcp://127.0.0.1:6543", 2 },
{ "tcp://127.0.0.1:6543", 3 },
{ "tcp://127.0.0.1:6543", 7 },
#ifndef WIN32
{ "unix:///tmp/strongswan-tests-vici-socket", ~0 },
{ "unix:///tmp/strongswan-tests-vici-socket", 1 },
{ "unix:///tmp/strongswan-tests-vici-socket", 2 },
{ "unix:///tmp/strongswan-tests-vici-socket", 3 },
{ "unix:///tmp/strongswan-tests-vici-socket", 7 },
#endif /* !WIN32 */
};
START_TEST(test_echo)
{
stream_t *c;
test_data_t data = {};
chunk_t x, m = chunk_from_chars(
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01, 0x01,
0x00,0x00,0x00,0x05, 0x11,0x12,0x13,0x14,0x15,
0x00,0x00,0x00,0x0A, 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x02A,
);
char buf[m.len];
uint32_t len;
lib->processor->set_threads(lib->processor, 4);
/* create socket, connect with stream */
data.s = vici_socket_create(echo_tests[_i].uri, echo_inbound, echo_connect,
echo_disconnect, &data);
ck_assert(data.s != NULL);
c = lib->streams->connect(lib->streams, echo_tests[_i].uri);
ck_assert(c != NULL);
/* write arbitrary chunks of messages blob depending on test */
x = m;
while (x.len)
{
len = min(x.len, echo_tests[_i].chunksize);
ck_assert(c->write_all(c, x.ptr, len));
x = chunk_skip(x, len);
}
/* verify echo */
ck_assert(c->read_all(c, buf, sizeof(buf)));
ck_assert(chunk_equals(m, chunk_from_thing(buf)));
/* wait for completion */
c->destroy(c);
while (data.disconnect != 1)
{
usleep(1000);
}
/* check that we got correct number of bytes/invocations */
ck_assert_int_eq(data.bytes, m.len);
data.s->destroy(data.s);
}
END_TEST
Suite *socket_suite_create()
{
Suite *s;
TCase *tc;
s = suite_create("vici socket");
tc = tcase_create("echo");
tcase_add_loop_test(tc, test_echo, 0, countof(echo_tests));
suite_add_tcase(s, tc);
return s;
}