1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#include "testnet.h"
#include <librecast/net.h>
#include <librecast_pvt.h>
#include <semaphore.h>
#include <time.h>
#include <unistd.h>
#define WAITS 1
static sem_t timeout;
void msg_received(lc_message_t *msg)
{
(void)msg;
test_log("message received\n");
sem_post(&timeout);
}
int main(void)
{
lc_ctx_t *lctx;
lc_socket_t *sock;
lc_channel_t *chan;
lc_message_t msg;
ssize_t byt;
struct timespec ts;
int op = LC_OP_PING;
int opt = 1;
test_name("multicast ping (loopback)");
test_require_net(TEST_NET_BASIC);
lctx = lc_ctx_new();
test_assert(lctx != NULL, "lctx != NULL");
sock = lc_socket_new(lctx);
test_assert(sock != NULL, "sock != NULL");
chan = lc_channel_new(lctx, "example.com");
test_assert(chan != NULL, "chan != NULL");
test_assert(!lc_socket_setopt(sock, IPV6_MULTICAST_LOOP, &opt, sizeof(opt)),
"set IPV6_MULTICAST_LOOP");
test_assert(!lc_channel_bind(sock, chan), "lc_channel_bind()");
test_assert(!lc_channel_join(chan), "lc_channel_join()");
test_assert(!lc_socket_listen(sock, &msg_received, NULL), "lc_socket_listen()");
/* send packet and receive on loopback */
lc_msg_init(&msg);
lc_msg_set(&msg, LC_ATTR_OPCODE, &op);
byt = lc_msg_send(chan, &msg);
test_assert((size_t)byt == msg.len + sizeof(lc_message_head_t), "%zi bytes sent", byt);
if (byt == -1) {
perror("lc_msg_send");
}
sem_init(&timeout, 0, 0);
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += WAITS;
test_assert(!sem_timedwait(&timeout, &ts), "timeout");
sem_destroy(&timeout);
test_assert(!lc_socket_listen_cancel(sock), "lc_socket_listen_cancel()");
lc_channel_free(chan);
lc_socket_close(sock);
lc_ctx_free(lctx);
return test_status;
}
|