5
#include <gibber/gibber-r-multicast-sender.h>
7
#define SENDER "testsender"
9
#define REPAIR_PACKET ((guint32)15)
11
#define EXTRA_SEEN ((guint32)11)
12
#define NR_PACKETS ((guint32)40)
14
guint32 serial_offset;
19
guint32 expected_packet;
24
GibberRMulticastPacket *
25
generate_packet(guint32 serial) {
26
GibberRMulticastPacket *p;
27
guint8 part = 0, total = 1;
31
{ { "receiver1", 500 }, { "receiver2", 600 }, { NULL, 0 } };
33
p = gibber_r_multicast_packet_new(PACKET_TYPE_DATA, SENDER, serial, 1500);
35
part = serial % 3 - 1;
39
gibber_r_multicast_packet_set_part(p, part, total);
41
for (i = 0 ; receivers[i].id != NULL; i++) {
42
gibber_r_multicast_packet_add_receiver(p,
43
receivers[i].id, receivers[i].expected_packet, NULL);
46
payload = g_strdup_printf("%010d\n", serial);
47
gibber_r_multicast_packet_add_payload(p, (guint8 *)payload, strlen(payload));
53
data_received_cb(GibberRMulticastSender *sender, guint8 *data,
54
gsize size, gpointer user_data) {
58
str = g_strndup((const gchar *)data, size);
60
lines = g_strsplit(str, "\n", 0);
61
for (i = 0 ; lines[i] != NULL && *lines[i] != '\0'; i++) {
62
int v = atoi(lines[i]);
64
g_assert(v == expected);
67
/* serial % 3 is send out in a single packet the other two together.
68
* So expected can't be % 3 == 2 here */
69
g_assert(expected % 3 != 2);
71
if (expected == serial_offset + NR_PACKETS
72
|| expected == serial_offset + NR_PACKETS + EXTRA_SEEN) {
73
g_main_loop_quit((GMainLoop *)user_data);
82
repair_request_cb(GibberRMulticastSender *sender, guint id, gpointer data) {
83
GibberRMulticastPacket *p;
85
g_assert(gibber_r_multicast_packet_diff(serial_offset, id) >= 0
86
|| gibber_r_multicast_packet_diff(id,
87
serial_offset + NR_PACKETS + EXTRA_SEEN) < 0);
89
p = generate_packet(id);
90
gibber_r_multicast_sender_push(sender, p);
95
repair_message_cb(GibberRMulticastSender *sender,
96
GibberRMulticastPacket *packet,
98
g_assert(packet->packet_id == REPAIR_PACKET + serial_offset);
100
g_main_loop_quit((GMainLoop *)user_data);
104
add_packet(gpointer data) {
105
static guint32 i = 0;
106
GibberRMulticastSender *sender = GIBBER_R_MULTICAST_SENDER(data);
107
GibberRMulticastPacket *p;
109
if (i == NR_PACKETS) {
115
p = generate_packet(i + serial_offset);
116
gibber_r_multicast_sender_push(sender, p);
125
timeout_cb(gpointer data) {
126
printf("Test timeout\n");
127
g_assert_not_reached();
134
do_test(gboolean test_seen) {
136
GibberRMulticastSender *s;
138
fprintf(stderr, "Starting test with offset %x %d\n",
139
serial_offset, test_seen);
141
s = gibber_r_multicast_sender_new(SENDER);
142
g_signal_connect(s, "data-received", G_CALLBACK(data_received_cb), loop);
143
g_signal_connect(s, "repair-request", G_CALLBACK(repair_request_cb), loop);
146
gibber_r_multicast_sender_seen(s, serial_offset);
148
gibber_r_multicast_sender_repair_request(s, serial_offset);
151
g_timeout_add(100, add_packet, s);
152
timeout = g_timeout_add(20000, timeout_cb, loop);
154
g_main_loop_run(loop);
156
/* tell the sender we've seen some extra pakcets */
157
gibber_r_multicast_sender_seen(s, serial_offset + NR_PACKETS + EXTRA_SEEN);
158
g_main_loop_run(loop);
160
/* Ask for a repair */
161
g_signal_connect(s, "repair-message", G_CALLBACK(repair_message_cb), loop);
163
gibber_r_multicast_sender_repair_request(s, serial_offset + REPAIR_PACKET);
165
g_main_loop_run(loop);
167
g_source_remove(timeout);
173
main(int argc, char **argv) {
175
loop = g_main_loop_new(NULL, FALSE);
177
serial_offset = ((guint32)(~0 - NR_PACKETS/2));
178
expected = serial_offset;
181
serial_offset = 0xff;
182
expected = serial_offset;
185
serial_offset = 0xff;
186
expected = serial_offset;