File: 0000-0012.c

package info (click to toggle)
librecast 0.11.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,760 kB
  • sloc: ansic: 31,144; asm: 28,570; sh: 3,164; makefile: 713; python: 70
file content (70 lines) | stat: -rw-r--r-- 1,680 bytes parent folder | download | duplicates (2)
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;
}