1
/* vim:ts=8:sts=8:sw=4:noai:noexpandtab
3
* unit tests for receive window.
5
* Copyright (c) 2009-2010 Miru Limited.
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30
# define PGM_CHECK_NOFORK 1
37
#define pgm_histogram_add mock_pgm_histogram_add
38
#define pgm_time_now mock_pgm_time_now
39
#define pgm_rs_create mock_pgm_rs_create
40
#define pgm_rs_destroy mock_pgm_rs_destroy
41
#define pgm_rs_decode_parity_appended mock_pgm_rs_decode_parity_appended
42
#define pgm_histogram_init mock_pgm_histogram_init
47
#ifdef PGM_DISABLE_ASSERT
48
# error "PGM_DISABLE_ASSERT set"
51
static pgm_time_t mock_pgm_time_now = 0x1;
54
/* mock functions for external references */
58
const bool can_fragment,
59
const sa_family_t pgmcc_family /* 0 = disable */
72
/** reed-solomon module */
90
mock_pgm_rs_decode_parity_appended (
93
const uint8_t* offsets,
101
mock_pgm_histogram_init (
102
pgm_histogram_t* histogram
108
mock_pgm_histogram_add (
109
pgm_histogram_t* histogram,
116
/* generate valid skb, data pointer pointing to PGM payload
119
struct pgm_sk_buff_t*
120
generate_valid_skb (void)
122
const pgm_tsi_t tsi = { { 200, 202, 203, 204, 205, 206 }, 2000 };
123
const guint16 tsdu_length = 1000;
124
const guint16 header_length = sizeof(struct pgm_header) + sizeof(struct pgm_data);
125
struct pgm_sk_buff_t* skb = pgm_alloc_skb (1500);
126
memcpy (&skb->tsi, &tsi, sizeof(tsi));
127
/* fake but valid socket and timestamp */
128
skb->sock = (pgm_sock_t*)0x1;
129
skb->tstamp = pgm_time_now;
131
pgm_skb_reserve (skb, header_length);
132
memset (skb->head, 0, header_length);
133
skb->pgm_header = (struct pgm_header*)skb->head;
134
skb->pgm_data = (struct pgm_data*)(skb->pgm_header + 1);
135
skb->pgm_header->pgm_type = PGM_ODATA;
136
skb->pgm_header->pgm_tsdu_length = g_htons (tsdu_length);
138
pgm_skb_put (skb, tsdu_length);
145
* const pgm_tsi_t* tsi,
146
* const uint16_t tpdu_size,
147
* const unsigned sqns,
148
* const unsigned secs,
149
* const ssize_t max_rte,
150
* const uint32_t ack_c_p
154
/* vanilla sequence count window */
155
START_TEST (test_create_pass_001)
157
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
158
const uint32_t ack_c_p = 500;
159
fail_if (NULL == pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p), "create failed");
163
/* vanilla time based window */
164
START_TEST (test_create_pass_002)
166
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
167
const uint32_t ack_c_p = 500;
168
fail_if (NULL == pgm_rxw_create (&tsi, 1500, 0, 60, 800000, ack_c_p), "create failed");
173
START_TEST (test_create_pass_003)
175
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
176
const uint32_t ack_c_p = 500;
177
fail_if (NULL == pgm_rxw_create (&tsi, 9000, 0, 60, 800000, ack_c_p), "create failed");
182
START_TEST (test_create_pass_004)
184
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
185
const uint32_t ack_c_p = 500;
186
fail_if (NULL == pgm_rxw_create (&tsi, UINT16_MAX, 0, 60, 800000, ack_c_p), "create failed");
190
/* invalid tsi pointer */
191
START_TEST (test_create_fail_001)
193
const uint32_t ack_c_p = 500;
194
pgm_rxw_t* window = pgm_rxw_create (NULL, 1500, 100, 0, 0, ack_c_p);
199
/* invalid tpdu size */
200
START_TEST (test_create_fail_002)
202
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
203
const uint32_t ack_c_p = 500;
204
fail_if (NULL == pgm_rxw_create (&tsi, 0, 100, 0, 0, ack_c_p), "create failed");
208
START_TEST (test_create_fail_003)
210
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
211
const uint32_t ack_c_p = 500;
212
pgm_rxw_t* window = pgm_rxw_create (&tsi, 0, 0, 60, 800000, ack_c_p);
217
/* no specified sequence count or time value */
218
START_TEST (test_create_fail_004)
220
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
221
const uint32_t ack_c_p = 500;
222
pgm_rxw_t* window = pgm_rxw_create (&tsi, 0, 0, 0, 800000, ack_c_p);
227
/* no specified rate */
228
START_TEST (test_create_fail_005)
230
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
231
const uint32_t ack_c_p = 500;
232
pgm_rxw_t* window = pgm_rxw_create (&tsi, 0, 0, 60, 0, ack_c_p);
238
START_TEST (test_create_fail_006)
240
pgm_rxw_t* window = pgm_rxw_create (NULL, 0, 0, 0, 0, 0);
248
* pgm_rxw_t* const window
252
START_TEST (test_destroy_pass_001)
254
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
255
const uint32_t ack_c_p = 500;
256
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
257
fail_if (NULL == window, "create failed");
258
pgm_rxw_destroy (window);
262
START_TEST (test_destroy_fail_001)
264
pgm_rxw_destroy (NULL);
272
* pgm_rxw_t* const window,
273
* struct pgm_sk_buff_t* const skb,
274
* const pgm_time_t now,
275
* const pgm_time_t nak_rb_expiry
277
* failures raise assert errors and stop process execution.
280
START_TEST (test_add_pass_001)
282
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
283
const uint32_t ack_c_p = 500;
284
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
285
fail_if (NULL == window, "create failed");
286
struct pgm_sk_buff_t* skb = generate_valid_skb ();
287
fail_if (NULL == skb, "generate_valid_skb failed");
288
skb->pgm_data->data_sqn = g_htonl (0);
289
const pgm_time_t now = 1;
290
const pgm_time_t nak_rb_expiry = 2;
291
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
292
pgm_rxw_destroy (window);
296
/* missing + inserted */
297
START_TEST (test_add_pass_002)
299
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
300
const uint32_t ack_c_p = 500;
301
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
302
fail_if (NULL == window, "create failed");
304
struct pgm_sk_buff_t* skb = generate_valid_skb ();
305
fail_if (NULL == skb, "generate_valid_skb failed");
306
skb->pgm_data->data_sqn = g_htonl (0);
307
const pgm_time_t now = 1;
308
const pgm_time_t nak_rb_expiry = 2;
309
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
311
skb = generate_valid_skb ();
312
fail_if (NULL == skb, "generate_valid_skb failed");
313
skb->pgm_data->data_sqn = g_htonl (2);
314
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not missing");
315
/* #3 to fill in gap */
316
skb = generate_valid_skb ();
317
fail_if (NULL == skb, "generate_valid_skb failed");
318
skb->pgm_data->data_sqn = g_htonl (1);
319
fail_unless (PGM_RXW_INSERTED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not inserted");
320
pgm_rxw_destroy (window);
324
/* duplicate + append */
325
START_TEST (test_add_pass_003)
327
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
328
const uint32_t ack_c_p = 500;
329
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
330
fail_if (NULL == window, "create failed");
332
struct pgm_sk_buff_t* skb = generate_valid_skb ();
333
fail_if (NULL == skb, "generate_valid_skb failed");
334
skb->pgm_data->data_sqn = g_htonl (0);
335
const pgm_time_t now = 1;
336
const pgm_time_t nak_rb_expiry = 2;
337
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
338
/* #2 repeat sequence */
339
skb = generate_valid_skb ();
340
fail_if (NULL == skb, "generate_valid_skb failed");
341
skb->pgm_data->data_sqn = g_htonl (0);
342
fail_unless (PGM_RXW_DUPLICATE == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not duplicate");
344
skb = generate_valid_skb ();
345
fail_if (NULL == skb, "generate_valid_skb failed");
346
skb->pgm_data->data_sqn = g_htonl (1);
347
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
348
pgm_rxw_destroy (window);
352
/* malformed: tpdu too long */
353
START_TEST (test_add_pass_004)
355
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
356
const uint32_t ack_c_p = 500;
357
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
358
fail_if (NULL == window, "create failed");
359
struct pgm_sk_buff_t* skb = generate_valid_skb ();
360
fail_if (NULL == skb, "generate_valid_skb failed");
361
skb->pgm_header->pgm_tsdu_length = g_htons (65535);
362
skb->pgm_data->data_sqn = g_htonl (0);
363
const pgm_time_t now = 1;
364
const pgm_time_t nak_rb_expiry = 2;
365
fail_unless (PGM_RXW_MALFORMED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not malformed");
369
/* bounds + append */
370
START_TEST (test_add_pass_005)
372
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
373
const uint32_t ack_c_p = 500;
374
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
375
fail_if (NULL == window, "create failed");
377
struct pgm_sk_buff_t* skb = generate_valid_skb ();
378
fail_if (NULL == skb, "generate_valid_skb failed");
379
skb->pgm_data->data_sqn = g_htonl (0);
380
skb->pgm_data->data_trail = g_htonl (-10);
381
const pgm_time_t now = 1;
382
const pgm_time_t nak_rb_expiry = 2;
383
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
384
/* #2 jump backwards */
385
skb = generate_valid_skb ();
386
fail_if (NULL == skb, "generate_valid_skb failed");
387
skb->pgm_data->data_sqn = g_htonl (-1);
388
skb->pgm_data->data_trail = g_htonl (-10);
389
fail_unless (PGM_RXW_BOUNDS == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not bounds");
391
skb = generate_valid_skb ();
392
fail_if (NULL == skb, "generate_valid_skb failed");
393
skb->pgm_data->data_sqn = g_htonl (1);
394
skb->pgm_data->data_trail = g_htonl (-10);
395
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
396
/* #4 jump forward */
397
skb = generate_valid_skb ();
398
fail_if (NULL == skb, "generate_valid_skb failed");
399
skb->pgm_data->data_sqn = g_htonl (100 + (UINT32_MAX / 2));
400
skb->pgm_data->data_trail = g_htonl (UINT32_MAX / 2);
401
fail_unless (PGM_RXW_BOUNDS == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not bounds");
403
skb = generate_valid_skb ();
404
fail_if (NULL == skb, "generate_valid_skb failed");
405
skb->pgm_data->data_sqn = g_htonl (2);
406
skb->pgm_data->data_trail = g_htonl (-10);
407
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
408
pgm_rxw_destroy (window);
413
START_TEST (test_add_fail_001)
415
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
416
const uint32_t ack_c_p = 500;
417
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
418
fail_if (NULL == window, "create failed");
419
const pgm_time_t now = 1;
420
const pgm_time_t nak_rb_expiry = 2;
421
int retval = pgm_rxw_add (window, NULL, now, nak_rb_expiry);
427
START_TEST (test_add_fail_002)
429
struct pgm_sk_buff_t* skb = generate_valid_skb ();
430
fail_if (NULL == skb, "generate_valid_skb failed");
431
skb->pgm_data->data_sqn = g_htonl (0);
432
const pgm_time_t now = 1;
433
const pgm_time_t nak_rb_expiry = 2;
434
int retval = pgm_rxw_add (NULL, skb, now, nak_rb_expiry);
439
/* null skb content */
440
START_TEST (test_add_fail_003)
442
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
443
const uint32_t ack_c_p = 500;
444
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
445
fail_if (NULL == window, "create failed");
447
memset (buffer, 0, sizeof(buffer));
448
const pgm_time_t now = 1;
449
const pgm_time_t nak_rb_expiry = 2;
450
int retval = pgm_rxw_add (window, (struct pgm_sk_buff_t*)buffer, now, nak_rb_expiry);
455
/* 0 nak_rb_expiry */
456
START_TEST (test_add_fail_004)
458
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
459
const uint32_t ack_c_p = 500;
460
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
461
fail_if (NULL == window, "create failed");
462
struct pgm_sk_buff_t* skb = generate_valid_skb ();
463
fail_if (NULL == skb, "generate_valid_skb failed");
464
skb->pgm_data->data_sqn = g_htonl (0);
465
const pgm_time_t now = 1;
466
int retval = pgm_rxw_add (window, skb, now, 0);
472
* struct pgm_sk_buff_t*
474
* pgm_rxw_t* const window,
475
* const uint32_t sequence
479
START_TEST (test_peek_pass_001)
481
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
482
const uint32_t ack_c_p = 500;
483
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
484
fail_if (NULL == window, "create failed");
485
fail_unless (NULL == pgm_rxw_peek (window, 0), "peek failed");
486
struct pgm_sk_buff_t* skb = generate_valid_skb ();
487
fail_if (NULL == skb, "generate_valid_skb failed");
488
skb->pgm_data->data_sqn = g_htonl (0);
489
const pgm_time_t now = 1;
490
const pgm_time_t nak_rb_expiry = 2;
491
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
492
fail_unless (skb == pgm_rxw_peek (window, 0), "peek failed");
493
fail_unless (NULL == pgm_rxw_peek (window, 1), "peek failed");
494
fail_unless (NULL == pgm_rxw_peek (window, -1), "peek failed");
495
pgm_rxw_destroy (window);
500
START_TEST (test_peek_fail_001)
502
struct pgm_sk_buff_t* skb = pgm_rxw_peek (NULL, 0);
507
/** inline function tests **/
508
/* pgm_rxw_max_length ()
510
START_TEST (test_max_length_pass_001)
512
const guint window_length = 100;
513
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
514
const uint32_t ack_c_p = 500;
515
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, window_length, 0, 0, ack_c_p);
516
fail_if (NULL == window, "create failed");
517
fail_unless (window_length == pgm_rxw_max_length (window), "max_length failed");
518
pgm_rxw_destroy (window);
522
START_TEST (test_max_length_fail_001)
524
const unsigned len = pgm_rxw_max_length (NULL);
531
START_TEST (test_length_pass_001)
533
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
534
const uint32_t ack_c_p = 500;
535
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
536
fail_if (NULL == window, "create failed");
537
fail_unless (0 == pgm_rxw_length (window), "length failed");
538
struct pgm_sk_buff_t* skb = generate_valid_skb ();
539
fail_if (NULL == skb, "generate_valid_skb failed");
540
skb->pgm_data->data_sqn = g_htonl (0);
541
const pgm_time_t now = 1;
542
const pgm_time_t nak_rb_expiry = 2;
543
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
544
fail_unless (1 == pgm_rxw_length (window), "length failed");
546
skb = generate_valid_skb ();
547
fail_if (NULL == skb, "generate_valid_skb failed");
548
skb->pgm_data->data_sqn = g_htonl (1);
549
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
550
fail_unless (2 == pgm_rxw_length (window), "length failed");
551
pgm_rxw_destroy (window);
555
START_TEST (test_length_fail_001)
557
const uint32_t answer = pgm_rxw_length (NULL);
564
START_TEST (test_size_pass_001)
566
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
567
const uint32_t ack_c_p = 500;
568
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
569
fail_if (NULL == window, "create failed");
570
fail_unless (0 == pgm_rxw_size (window), "size failed");
571
struct pgm_sk_buff_t* skb = generate_valid_skb ();
572
fail_if (NULL == skb, "generate_valid_skb failed");
573
skb->pgm_data->data_sqn = g_htonl (0);
574
const pgm_time_t now = 1;
575
const pgm_time_t nak_rb_expiry = 2;
576
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
577
fail_unless (1000 == pgm_rxw_size (window), "size failed");
579
skb = generate_valid_skb ();
580
fail_if (NULL == skb, "generate_valid_skb failed");
581
skb->pgm_data->data_sqn = g_htonl (1);
582
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
583
fail_unless (2000 == pgm_rxw_size (window), "size failed");
584
pgm_rxw_destroy (window);
588
START_TEST (test_size_fail_001)
590
const size_t answer = pgm_rxw_size (NULL);
597
START_TEST (test_is_empty_pass_001)
599
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
600
const uint32_t ack_c_p = 500;
601
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
602
fail_if (NULL == window, "create failed");
603
fail_unless (pgm_rxw_is_empty (window), "is_empty failed");
604
struct pgm_sk_buff_t* skb = generate_valid_skb ();
605
fail_if (NULL == skb, "generate_valid_skb failed");
606
skb->pgm_data->data_sqn = g_htonl (0);
607
const pgm_time_t now = 1;
608
const pgm_time_t nak_rb_expiry = 2;
609
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
610
fail_if (pgm_rxw_is_empty (window), "is_empty failed");
611
pgm_rxw_destroy (window);
615
START_TEST (test_is_empty_fail_001)
617
const bool answer = pgm_rxw_is_empty (NULL);
624
START_TEST (test_is_full_pass_001)
626
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
627
const uint32_t ack_c_p = 500;
628
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 1, 0, 0, ack_c_p);
629
fail_if (NULL == window, "create failed");
630
fail_if (pgm_rxw_is_full (window), "is_full failed");
631
struct pgm_sk_buff_t* skb = generate_valid_skb ();
632
fail_if (NULL == skb, "generate_valid_skb failed");
633
skb->pgm_data->data_sqn = g_htonl (0);
634
const pgm_time_t now = 1;
635
const pgm_time_t nak_rb_expiry = 2;
636
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
637
fail_unless (pgm_rxw_is_full (window), "is_full failed");
638
pgm_rxw_destroy (window);
642
START_TEST (test_is_full_fail_001)
644
const bool answer = pgm_rxw_is_full (NULL);
651
START_TEST (test_lead_pass_001)
653
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
654
const uint32_t ack_c_p = 500;
655
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
656
fail_if (NULL == window, "create failed");
657
guint32 lead = pgm_rxw_lead (window);
658
struct pgm_sk_buff_t* skb = generate_valid_skb ();
659
fail_if (NULL == skb, "generate_valid_skb failed");
660
skb->pgm_data->data_sqn = g_htonl (0);
661
const pgm_time_t now = 1;
662
const pgm_time_t nak_rb_expiry = 2;
663
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
664
fail_unless (lead + 1 == pgm_rxw_lead (window), "lead failed");
665
pgm_rxw_destroy (window);
669
START_TEST (test_lead_fail_001)
671
const uint32_t answer = pgm_rxw_lead (NULL);
678
START_TEST (test_next_lead_pass_001)
680
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
681
const uint32_t ack_c_p = 500;
682
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
683
fail_if (NULL == window, "create failed");
684
guint32 next_lead = pgm_rxw_next_lead (window);
685
struct pgm_sk_buff_t* skb = generate_valid_skb ();
686
fail_if (NULL == skb, "generate_valid_skb failed");
687
skb->pgm_data->data_sqn = g_htonl (0);
688
const pgm_time_t now = 1;
689
const pgm_time_t nak_rb_expiry = 2;
690
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
691
fail_unless (next_lead == pgm_rxw_lead (window), "lead failed");
692
pgm_rxw_destroy (window);
696
START_TEST (test_next_lead_fail_001)
698
const uint32_t answer = pgm_rxw_next_lead (NULL);
706
* pgm_rxw_t* const window,
707
* struct pgm_msgv_t** pmsg,
708
* const unsigned msg_len
712
START_TEST (test_readv_pass_001)
714
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
715
const uint32_t ack_c_p = 500;
716
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
717
fail_if (NULL == window, "create failed");
718
struct pgm_msgv_t msgv[2], *pmsg;
721
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
722
/* #2 single TPDU-APDU */
723
struct pgm_sk_buff_t* skb = generate_valid_skb ();
724
fail_if (NULL == skb, "generate_valid_skb failed");
725
skb->pgm_data->data_sqn = g_htonl (0);
726
const pgm_time_t now = 1;
727
const pgm_time_t nak_rb_expiry = 2;
728
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
730
fail_unless (1000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
732
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
734
skb = generate_valid_skb ();
735
fail_if (NULL == skb, "generate_valid_skb failed");
736
skb->pgm_data->data_sqn = g_htonl (1);
737
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
738
skb = generate_valid_skb ();
739
fail_if (NULL == skb, "generate_valid_skb failed");
740
skb->pgm_data->data_sqn = g_htonl (2);
741
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
743
fail_unless (2000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
744
/* #5,6 skip and repair APDU */
746
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
747
skb = generate_valid_skb ();
748
fail_if (NULL == skb, "generate_valid_skb failed");
749
skb->pgm_data->data_sqn = g_htonl (4);
750
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not missing");
752
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
753
skb = generate_valid_skb ();
754
fail_if (NULL == skb, "generate_valid_skb failed");
755
skb->pgm_data->data_sqn = g_htonl (3);
756
fail_unless (PGM_RXW_INSERTED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not inserted");
758
fail_unless (2000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
760
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
761
pgm_rxw_destroy (window);
766
START_TEST (test_readv_pass_002)
768
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
769
const uint32_t ack_c_p = 500;
770
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
771
fail_if (NULL == window, "create failed");
772
struct pgm_msgv_t msgv[2], *pmsg;
773
struct pgm_sk_buff_t* skb = generate_valid_skb ();
774
fail_if (NULL == skb, "generate_valid_skb failed");
775
skb->pgm_header->pgm_tsdu_length = g_htons (0);
776
skb->tail = (guint8*)skb->tail - skb->len;
778
skb->pgm_data->data_sqn = g_htonl (0);
779
const pgm_time_t now = 1;
780
const pgm_time_t nak_rb_expiry = 2;
781
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
783
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
785
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
786
pgm_rxw_destroy (window);
791
START_TEST (test_readv_pass_003)
793
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
794
const uint32_t ack_c_p = 500;
795
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
796
fail_if (NULL == window, "create failed");
797
struct pgm_msgv_t msgv[1], *pmsg;
798
struct pgm_sk_buff_t* skb;
799
for (unsigned i = 0; i < 100; i++)
801
skb = generate_valid_skb ();
802
fail_if (NULL == skb, "generate_valid_skb failed");
803
skb->pgm_header->pgm_tsdu_length = g_htons (0);
804
skb->tail = (guint8*)skb->tail - skb->len;
806
skb->pgm_data->data_sqn = g_htonl (i);
807
const pgm_time_t now = 1;
808
const pgm_time_t nak_rb_expiry = 2;
809
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
810
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
812
fail_unless (pgm_rxw_is_full (window), "is_full failed");
813
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
814
for (unsigned i = 0; i < 100; i++)
817
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
818
fail_unless ((1 + i) == _pgm_rxw_commit_length (window), "commit_length failed");
820
fail_unless (pgm_rxw_length (window) == _pgm_rxw_commit_length (window), "commit_length failed");
822
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
823
pgm_rxw_destroy (window);
827
/* full + 1 window */
828
START_TEST (test_readv_pass_004)
830
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
831
const uint32_t ack_c_p = 500;
832
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
833
fail_if (NULL == window, "create failed");
834
struct pgm_msgv_t msgv[1], *pmsg;
835
struct pgm_sk_buff_t* skb;
836
for (unsigned i = 0; i < 101; i++)
838
skb = generate_valid_skb ();
839
fail_if (NULL == skb, "generate_valid_skb failed");
840
skb->pgm_header->pgm_tsdu_length = g_htons (0);
841
skb->tail = (guint8*)skb->tail - skb->len;
843
skb->pgm_data->data_sqn = g_htonl (i);
844
const pgm_time_t now = 1;
845
const pgm_time_t nak_rb_expiry = 2;
846
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
847
fail_unless (MIN(100, 1 + i) == pgm_rxw_length (window), "length failed");
849
fail_unless (pgm_rxw_is_full (window), "is_full failed");
850
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
851
for (unsigned i = 0; i < 100; i++)
854
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
855
fail_unless ((1 + i) == _pgm_rxw_commit_length (window), "commit_length failed");
857
fail_unless (pgm_rxw_length (window) == _pgm_rxw_commit_length (window), "commit_length failed");
859
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
860
pgm_rxw_destroy (window);
864
/* full - 2 lost last in window */
865
START_TEST (test_readv_pass_005)
867
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
868
const uint32_t ack_c_p = 500;
869
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
870
fail_if (NULL == window, "create failed");
871
struct pgm_msgv_t msgv[1], *pmsg;
872
struct pgm_sk_buff_t* skb;
873
for (unsigned i = 0; i < 98; i++)
875
skb = generate_valid_skb ();
876
fail_if (NULL == skb, "generate_valid_skb failed");
877
skb->pgm_header->pgm_tsdu_length = g_htons (0);
878
skb->tail = (guint8*)skb->tail - skb->len;
880
skb->pgm_data->data_sqn = g_htonl (i);
881
const pgm_time_t now = 1;
882
const pgm_time_t nak_rb_expiry = 2;
883
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
884
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
886
fail_if (pgm_rxw_is_full (window), "is_full failed");
887
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
890
skb = generate_valid_skb ();
891
fail_if (NULL == skb, "generate_valid_skb failed");
892
skb->pgm_header->pgm_tsdu_length = g_htons (0);
893
skb->tail = (guint8*)skb->tail - skb->len;
895
skb->pgm_data->data_sqn = g_htonl (i);
896
const pgm_time_t now = 1;
897
const pgm_time_t nak_rb_expiry = 2;
898
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not missing");
899
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
901
fail_unless (pgm_rxw_is_full (window), "is_full failed");
902
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
903
for (unsigned i = 0; i < 98; i++)
906
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
907
fail_unless ((1 + i) == _pgm_rxw_commit_length (window), "commit_length failed");
909
fail_unless (pgm_rxw_length (window) == (2 + _pgm_rxw_commit_length (window)), "commit_length failed");
910
/* read end-of-window */
913
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
915
pgm_rxw_destroy (window);
919
/* add full window, readv 1 skb, add 1 more */
920
START_TEST (test_readv_pass_006)
922
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
923
const uint32_t ack_c_p = 500;
924
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
925
fail_if (NULL == window, "create failed");
926
struct pgm_msgv_t msgv[1], *pmsg;
927
struct pgm_sk_buff_t* skb;
928
for (unsigned i = 0; i < 100; i++)
930
skb = generate_valid_skb ();
931
fail_if (NULL == skb, "generate_valid_skb failed");
932
skb->pgm_header->pgm_tsdu_length = g_htons (0);
933
skb->tail = (guint8*)skb->tail - skb->len;
935
skb->pgm_data->data_sqn = g_htonl (i);
936
const pgm_time_t now = 1;
937
const pgm_time_t nak_rb_expiry = 2;
938
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
939
fail_unless (MIN(100, 1 + i) == pgm_rxw_length (window), "length failed");
941
fail_unless (pgm_rxw_is_full (window), "is_full failed");
942
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
946
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
947
fail_unless (1 == _pgm_rxw_commit_length (window), "commit_length failed");
949
/* add one more new skb */
952
skb = generate_valid_skb ();
953
fail_if (NULL == skb, "generate_valid_skb failed");
954
skb->pgm_header->pgm_tsdu_length = g_htons (0);
955
skb->tail = (guint8*)skb->tail - skb->len;
957
skb->pgm_data->data_sqn = g_htonl (i);
958
const pgm_time_t now = 1;
959
const pgm_time_t nak_rb_expiry = 2;
960
fail_unless (PGM_RXW_BOUNDS == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not bounds");
961
fail_unless (MIN(100, 1 + i) == pgm_rxw_length (window), "length failed");
963
/* read off 99 more skbs */
964
for (unsigned i = 0; i < 99; i++)
967
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
968
fail_unless ((2 + i) == _pgm_rxw_commit_length (window), "commit_length failed");
970
/* read end-of-window */
973
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
975
pgm_rxw_destroy (window);
980
START_TEST (test_readv_fail_001)
982
struct pgm_msgv_t msgv[1], *pmsg = msgv;
983
gssize len = pgm_rxw_readv (NULL, &pmsg, G_N_ELEMENTS(msgv));
989
START_TEST (test_readv_fail_002)
991
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
992
const uint32_t ack_c_p = 500;
993
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
994
fail_if (NULL == window, "create failed");
995
struct pgm_sk_buff_t* skb = generate_valid_skb ();
996
fail_if (NULL == skb, "generate_valid_skb failed");
997
skb->pgm_data->data_sqn = g_htonl (0);
998
const pgm_time_t now = 1;
999
const pgm_time_t nak_rb_expiry = 2;
1000
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1001
struct pgm_msgv_t msgv[1], *pmsg = msgv;
1002
gssize len = pgm_rxw_readv (window, NULL, G_N_ELEMENTS(msgv));
1008
START_TEST (test_readv_fail_003)
1010
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1011
const uint32_t ack_c_p = 500;
1012
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1013
fail_if (NULL == window, "create failed");
1014
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1015
fail_if (NULL == skb, "generate_valid_skb failed");
1016
skb->pgm_data->data_sqn = g_htonl (0);
1017
const pgm_time_t now = 1;
1018
const pgm_time_t nak_rb_expiry = 2;
1019
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1020
struct pgm_msgv_t msgv[1], *pmsg = msgv;
1021
gssize len = pgm_rxw_readv (window, &pmsg, 0);
1029
* pgm_rxw_remove_commit (
1030
* pgm_rxw_t* const window
1034
/* full - 2 lost last in window */
1035
START_TEST (test_remove_commit_pass_001)
1037
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1038
const uint32_t ack_c_p = 500;
1039
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1040
fail_if (NULL == window, "create failed");
1041
struct pgm_msgv_t msgv[1], *pmsg;
1042
struct pgm_sk_buff_t* skb;
1043
for (unsigned i = 0; i < 98; i++)
1045
skb = generate_valid_skb ();
1046
fail_if (NULL == skb, "generate_valid_skb failed");
1047
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1048
skb->tail = (guint8*)skb->tail - skb->len;
1050
skb->pgm_data->data_sqn = g_htonl (i);
1051
const pgm_time_t now = 1;
1052
const pgm_time_t nak_rb_expiry = 2;
1053
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1054
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
1056
fail_if (pgm_rxw_is_full (window), "is_full failed");
1057
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
1058
/* #98 is missing */
1061
skb = generate_valid_skb ();
1062
fail_if (NULL == skb, "generate_valid_skb failed");
1063
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1064
skb->tail = (guint8*)skb->tail - skb->len;
1066
skb->pgm_data->data_sqn = g_htonl (i);
1067
const pgm_time_t now = 1;
1068
const pgm_time_t nak_rb_expiry = 2;
1069
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1070
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
1072
fail_unless (pgm_rxw_is_full (window), "is_full failed");
1073
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty");
1074
/* now mark #98 lost */
1075
pgm_rxw_lost (window, 98);
1076
for (unsigned i = 0; i < 98; i++)
1079
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1080
fail_unless ((1 + i) == _pgm_rxw_commit_length (window), "commit_length failed");
1082
fail_unless (100 == pgm_rxw_length (window), "length failed");
1083
fail_unless ( 98 == _pgm_rxw_commit_length (window), "commit_length failed");
1084
/* read end-of-window */
1087
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1089
fail_unless (100 == pgm_rxw_length (window), "length failed");
1090
fail_unless ( 98 == _pgm_rxw_commit_length (window), "commit_length failed");
1091
pgm_rxw_remove_commit (window);
1092
/* read lost skb #98 */
1095
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1097
pgm_rxw_remove_commit (window);
1098
/* read valid skb #99 */
1101
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1103
/* read end-of-window */
1106
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1108
pgm_rxw_destroy (window);
1112
START_TEST (test_remove_commit_fail_001)
1114
pgm_rxw_remove_commit (NULL);
1121
* pgm_rxw_remove_trail (
1122
* pgm_rxw_t* const window
1126
START_TEST (test_remove_trail_pass_001)
1128
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1129
const uint32_t ack_c_p = 500;
1130
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1131
fail_if (NULL == window, "create failed");
1132
struct pgm_msgv_t msgv[2], *pmsg;
1133
fail_unless (0 == pgm_rxw_remove_trail (window), "remove_trail failed");
1134
/* #1,2 two APDUs */
1135
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1136
fail_if (NULL == skb, "generate_valid_skb failed");
1137
skb->pgm_data->data_sqn = g_htonl (1);
1138
const pgm_time_t now = 1;
1139
const pgm_time_t nak_rb_expiry = 2;
1140
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1141
skb = generate_valid_skb ();
1142
fail_if (NULL == skb, "generate_valid_skb failed");
1143
skb->pgm_data->data_sqn = g_htonl (2);
1144
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1145
fail_unless (1 == pgm_rxw_remove_trail (window), "remove_trail failed");
1146
fail_unless (1 == pgm_rxw_length (window), "length failed");
1147
fail_unless (1000 == pgm_rxw_size (window), "size failed");
1149
fail_unless (1000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1150
fail_unless (0 == pgm_rxw_remove_trail (window), "remove_trail failed");
1151
pgm_rxw_destroy (window);
1155
START_TEST (test_remove_trail_fail_001)
1157
guint count = pgm_rxw_remove_trail (NULL);
1165
* pgm_rxw_t* const window,
1166
* const uint32_t txw_trail,
1167
* const uint32_t txw_lead,
1168
* const pgm_time_t now,
1169
* const pgm_time_t nak_rb_expiry
1173
START_TEST (test_update_pass_001)
1175
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1176
const uint32_t ack_c_p = 500;
1177
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1178
fail_if (NULL == window, "create failed");
1179
const pgm_time_t now = 1;
1180
const pgm_time_t nak_rb_expiry = 2;
1181
fail_unless (0 == pgm_rxw_update (window, 100, 99, now, nak_rb_expiry), "update failed");
1183
fail_unless (0 == pgm_rxw_update (window, 100, 99, now, nak_rb_expiry), "update failed");
1185
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1186
fail_if (NULL == skb, "generate_valid_skb failed");
1187
skb->pgm_data->data_sqn = g_htonl (100);
1188
fail_unless (PGM_RXW_BOUNDS == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not bounds");
1190
skb->pgm_data->data_sqn = g_htonl (101);
1191
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1192
struct pgm_msgv_t msgv[1], *pmsg = msgv;
1193
fail_unless (1000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1195
fail_unless (1 == pgm_rxw_update (window, 102, 99, now, nak_rb_expiry), "update failed");
1196
skb = generate_valid_skb ();
1197
fail_if (NULL == skb, "generate_valid_skb failed");
1198
skb->pgm_data->data_sqn = g_htonl (102);
1199
fail_unless (PGM_RXW_INSERTED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not inserted");
1200
pgm_rxw_destroy (window);
1204
START_TEST (test_update_fail_001)
1206
guint count = pgm_rxw_update (NULL, 0, 0, 0, 0);
1214
* pgm_rxw_t* const window,
1215
* const uint32_t sequence,
1216
* const pgm_time_t now,
1217
* const pgm_time_t nak_rdata_expiry,
1218
* const pgm_time_t nak_rb_expiry
1222
START_TEST (test_confirm_pass_001)
1224
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1225
const uint32_t ack_c_p = 500;
1226
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1227
fail_if (NULL == window, "create failed");
1228
const pgm_time_t now = 1;
1229
const pgm_time_t nak_rdata_expiry = 2;
1230
const pgm_time_t nak_rb_expiry = 2;
1231
fail_unless (PGM_RXW_BOUNDS == pgm_rxw_confirm (window, 0, now, nak_rdata_expiry, nak_rb_expiry), "confirm not bounds");
1233
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1234
fail_if (NULL == skb, "generate_valid_skb failed");
1235
skb->pgm_data->data_sqn = g_htonl (100);
1236
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1237
fail_unless (1 == pgm_rxw_length (window), "length failed");
1238
fail_unless (PGM_RXW_BOUNDS == pgm_rxw_confirm (window, 99, now, nak_rdata_expiry, nak_rb_expiry), "confirm not bounds");
1239
fail_unless (PGM_RXW_DUPLICATE == pgm_rxw_confirm (window, 100, now, nak_rdata_expiry, nak_rb_expiry), "confirm not duplicate");
1240
fail_unless (PGM_RXW_APPENDED == pgm_rxw_confirm (window, 101, now, nak_rdata_expiry, nak_rb_expiry), "confirm not appended");
1241
fail_unless (2 == pgm_rxw_length (window), "length failed");
1242
fail_unless (PGM_RXW_UPDATED == pgm_rxw_confirm (window, 101, now, nak_rdata_expiry, nak_rb_expiry), "confirm not updated");
1244
skb = generate_valid_skb ();
1245
fail_if (NULL == skb, "generate_valid_skb failed");
1246
skb->pgm_data->data_sqn = g_htonl (101);
1247
fail_unless (PGM_RXW_INSERTED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not inserted");
1248
struct pgm_msgv_t msgv[2], *pmsg = msgv;
1249
fail_unless (2000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1250
pgm_rxw_destroy (window);
1254
/* constrained confirm */
1255
START_TEST (test_confirm_pass_002)
1257
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1258
const uint32_t ack_c_p = 500;
1259
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1260
fail_if (NULL == window, "create failed");
1261
struct pgm_msgv_t msgv[1], *pmsg;
1262
struct pgm_sk_buff_t* skb;
1263
for (unsigned i = 0; i < 100; i++)
1265
skb = generate_valid_skb ();
1266
fail_if (NULL == skb, "generate_valid_skb failed");
1267
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1268
skb->tail = (guint8*)skb->tail - skb->len;
1270
skb->pgm_data->data_sqn = g_htonl (i);
1271
const pgm_time_t now = 1;
1272
const pgm_time_t nak_rb_expiry = 2;
1273
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1274
fail_unless (MIN(100, 1 + i) == pgm_rxw_length (window), "length failed");
1276
fail_unless (pgm_rxw_is_full (window), "is_full failed");
1277
fail_unless (_pgm_rxw_commit_is_empty (window), "is_empty failed");
1281
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1282
fail_unless (1 == _pgm_rxw_commit_length (window), "commit_length failed");
1284
/* confirm next sequence */
1285
const pgm_time_t now = 1;
1286
const pgm_time_t nak_rdata_expiry = 2;
1287
const pgm_time_t nak_rb_expiry = 2;
1288
fail_unless (PGM_RXW_BOUNDS == pgm_rxw_confirm (window, 100, now, nak_rdata_expiry, nak_rb_expiry), "confirm not bounds");
1289
/* read off 99 more skbs */
1290
for (unsigned i = 0; i < 99; i++)
1293
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1294
fail_unless ((2 + i) == _pgm_rxw_commit_length (window), "commit_length failed");
1296
/* read end-of-window */
1299
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1301
pgm_rxw_destroy (window);
1305
START_TEST (test_confirm_fail_001)
1307
int retval = pgm_rxw_confirm (NULL, 0, 0, 0, 0);
1315
* pgm_rxw_t* const window,
1316
* const uint32_t sequence
1320
START_TEST (test_lost_pass_001)
1322
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1323
const uint32_t ack_c_p = 500;
1324
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1325
fail_if (NULL == window, "create failed");
1326
const pgm_time_t now = 1;
1327
const pgm_time_t nak_rdata_expiry = 2;
1328
const pgm_time_t nak_rb_expiry = 2;
1330
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1331
fail_if (NULL == skb, "generate_valid_skb failed");
1332
skb->pgm_data->data_sqn = g_htonl (100);
1333
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1334
fail_unless (1 == pgm_rxw_length (window), "length failed");
1335
fail_unless (1000 == pgm_rxw_size (window), "size failed");
1336
fail_unless (PGM_RXW_APPENDED == pgm_rxw_confirm (window, 101, now, nak_rdata_expiry, nak_rb_expiry), "confirm not appended");
1337
fail_unless (2 == pgm_rxw_length (window), "length failed");
1338
fail_unless (1000 == pgm_rxw_size (window), "size failed");
1339
pgm_rxw_lost (window, 101);
1340
fail_unless (2 == pgm_rxw_length (window), "length failed");
1341
fail_unless (1000 == pgm_rxw_size (window), "size failed");
1343
skb = generate_valid_skb ();
1344
fail_if (NULL == skb, "generate_valid_skb failed");
1345
skb->pgm_data->data_sqn = g_htonl (101);
1346
fail_unless (PGM_RXW_INSERTED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not inserted");
1347
fail_unless (2 == pgm_rxw_length (window), "length failed");
1348
fail_unless (2000 == pgm_rxw_size (window), "size failed");
1349
pgm_rxw_destroy (window);
1353
START_TEST (test_lost_fail_001)
1355
pgm_rxw_lost (NULL, 0);
1363
* pgm_rxw_t* const window,
1364
* struct pgm_sk_buff_t* skb,
1369
START_TEST (test_state_pass_001)
1371
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1372
const uint32_t ack_c_p = 500;
1373
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1374
fail_if (NULL == window, "create failed");
1375
const pgm_time_t now = 1;
1376
const pgm_time_t nak_rdata_expiry = 2;
1377
const pgm_time_t nak_rb_expiry = 2;
1378
fail_unless (0 == pgm_rxw_update (window, 100, 99, now, nak_rb_expiry), "update failed");
1379
fail_unless (PGM_RXW_APPENDED == pgm_rxw_confirm (window, 101, now, nak_rdata_expiry, nak_rb_expiry), "confirm not appended");
1380
struct pgm_sk_buff_t* skb = pgm_rxw_peek (window, 101);
1381
pgm_rxw_state (window, skb, PGM_PKT_STATE_WAIT_NCF);
1382
pgm_rxw_state (window, skb, PGM_PKT_STATE_WAIT_DATA);
1383
pgm_rxw_destroy (window);
1387
START_TEST (test_state_fail_001)
1389
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1390
fail_if (NULL == skb, "generate_valid_skb failed");
1391
skb->pgm_data->data_sqn = g_htonl (0);
1392
pgm_rxw_state (NULL, skb, PGM_PKT_STATE_BACK_OFF);
1397
START_TEST (test_state_fail_002)
1399
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1400
const uint32_t ack_c_p = 500;
1401
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1402
fail_if (NULL == window, "create failed");
1403
pgm_rxw_state (window, NULL, PGM_PKT_STATE_BACK_OFF);
1408
START_TEST (test_state_fail_003)
1410
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1411
const uint32_t ack_c_p = 500;
1412
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1413
fail_if (NULL == window, "create failed");
1414
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1415
fail_if (NULL == skb, "generate_valid_skb failed");
1416
skb->pgm_data->data_sqn = g_htonl (0);
1417
pgm_rxw_state (window, skb, -1);
1422
/* pgm_peer_has_pending
1425
START_TEST (test_has_pending_pass_001)
1427
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1428
const uint32_t ack_c_p = 500;
1429
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1430
fail_if (NULL == window, "create failed");
1432
fail_unless (0 == window->has_event, "unexpected event");
1433
struct pgm_sk_buff_t* skb = generate_valid_skb ();
1434
fail_if (NULL == skb, "generate_valid_skb failed");
1435
skb->pgm_data->data_sqn = g_htonl (0);
1436
const pgm_time_t now = 1;
1437
const pgm_time_t nak_rdata_expiry = 2;
1438
const pgm_time_t nak_rb_expiry = 2;
1439
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not appended");
1441
fail_unless (1 == window->has_event, "no event");
1442
window->has_event = 0;
1444
skb = generate_valid_skb ();
1445
fail_if (NULL == skb, "generate_valid_skb failed");
1446
skb->pgm_data->data_sqn = g_htonl (2);
1447
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not missing");
1448
fail_unless (0 == window->has_event, "unexpected event");
1450
pgm_rxw_lost (window, 1);
1451
fail_unless (1 == window->has_event, "no event");
1452
window->has_event = 0;
1454
skb = generate_valid_skb ();
1455
fail_if (NULL == skb, "generate_valid_skb failed");
1456
skb->pgm_data->data_sqn = g_htonl (1);
1457
fail_unless (PGM_RXW_INSERTED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add not inserted");
1458
fail_unless (1 == window->has_event, "no event");
1459
window->has_event = 0;
1461
fail_unless (PGM_RXW_APPENDED == pgm_rxw_confirm (window, 3, now, nak_rdata_expiry, nak_rb_expiry), "confirm not appended");
1462
fail_unless (0 == window->has_event, "unexpected event");
1464
struct pgm_msgv_t msgv[2], *pmsg = msgv;
1465
fail_unless (2000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1466
fail_unless (0 == window->has_event, "unexpected event");
1469
fail_unless (1000 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1470
fail_unless (0 == window->has_event, "unexpected event");
1471
pgm_rxw_destroy (window);
1477
make_basic_test_suite (void)
1481
s = suite_create ("basic receive window API");
1483
TCase* tc_create = tcase_create ("create");
1484
suite_add_tcase (s, tc_create);
1485
tcase_add_test (tc_create, test_create_pass_001);
1486
tcase_add_test (tc_create, test_create_pass_002);
1487
tcase_add_test (tc_create, test_create_pass_003);
1488
tcase_add_test (tc_create, test_create_pass_004);
1489
#ifndef PGM_CHECK_NOFORK
1490
tcase_add_test_raise_signal (tc_create, test_create_fail_001, SIGABRT);
1491
tcase_add_test_raise_signal (tc_create, test_create_fail_002, SIGABRT);
1492
tcase_add_test_raise_signal (tc_create, test_create_fail_003, SIGABRT);
1493
tcase_add_test_raise_signal (tc_create, test_create_fail_004, SIGABRT);
1496
TCase* tc_destroy = tcase_create ("destroy");
1497
suite_add_tcase (s, tc_destroy);
1498
tcase_add_test (tc_destroy, test_destroy_pass_001);
1499
#ifndef PGM_CHECK_NOFORK
1500
tcase_add_test_raise_signal (tc_destroy, test_destroy_fail_001, SIGABRT);
1503
TCase* tc_add = tcase_create ("add");
1504
suite_add_tcase (s, tc_add);
1505
tcase_add_test (tc_add, test_add_pass_001);
1506
tcase_add_test (tc_add, test_add_pass_002);
1507
tcase_add_test (tc_add, test_add_pass_003);
1508
tcase_add_test (tc_add, test_add_pass_004);
1509
tcase_add_test (tc_add, test_add_pass_005);
1510
#ifndef PGM_CHECK_NOFORK
1511
tcase_add_test_raise_signal (tc_add, test_add_fail_001, SIGABRT);
1512
tcase_add_test_raise_signal (tc_add, test_add_fail_002, SIGABRT);
1513
tcase_add_test_raise_signal (tc_add, test_add_fail_003, SIGABRT);
1516
TCase* tc_peek = tcase_create ("peek");
1517
suite_add_tcase (s, tc_peek);
1518
tcase_add_test (tc_peek, test_peek_pass_001);
1519
#ifndef PGM_CHECK_NOFORK
1520
tcase_add_test_raise_signal (tc_peek, test_peek_fail_001, SIGABRT);
1523
TCase* tc_max_length = tcase_create ("max-length");
1524
suite_add_tcase (s, tc_max_length);
1525
tcase_add_test (tc_max_length, test_max_length_pass_001);
1526
#ifndef PGM_CHECK_NOFORK
1527
tcase_add_test_raise_signal (tc_max_length, test_max_length_fail_001, SIGABRT);
1530
TCase* tc_length = tcase_create ("length");
1531
suite_add_tcase (s, tc_length);
1532
tcase_add_test (tc_length, test_length_pass_001);
1533
#ifndef PGM_CHECK_NOFORK
1534
tcase_add_test_raise_signal (tc_length, test_length_fail_001, SIGABRT);
1537
TCase* tc_size = tcase_create ("size");
1538
suite_add_tcase (s, tc_size);
1539
tcase_add_test (tc_size, test_size_pass_001);
1540
#ifndef PGM_CHECK_NOFORK
1541
tcase_add_test_raise_signal (tc_size, test_size_fail_001, SIGABRT);
1544
TCase* tc_is_empty = tcase_create ("is-empty");
1545
suite_add_tcase (s, tc_is_empty);
1546
tcase_add_test (tc_is_empty, test_is_empty_pass_001);
1547
#ifndef PGM_CHECK_NOFORK
1548
tcase_add_test_raise_signal (tc_is_empty, test_is_empty_fail_001, SIGABRT);
1551
TCase* tc_is_full = tcase_create ("is-full");
1552
suite_add_tcase (s, tc_is_full);
1553
tcase_add_test (tc_is_full, test_is_full_pass_001);
1554
#ifndef PGM_CHECK_NOFORK
1555
tcase_add_test_raise_signal (tc_is_full, test_is_full_fail_001, SIGABRT);
1558
TCase* tc_lead = tcase_create ("lead");
1559
suite_add_tcase (s, tc_lead);
1560
tcase_add_test (tc_lead, test_lead_pass_001);
1561
#ifndef PGM_CHECK_NOFORK
1562
tcase_add_test_raise_signal (tc_lead, test_lead_fail_001, SIGABRT);
1565
TCase* tc_next_lead = tcase_create ("next-lead");
1566
suite_add_tcase (s, tc_next_lead);
1567
tcase_add_test (tc_next_lead, test_next_lead_pass_001);
1568
#ifndef PGM_CHECK_NOFORK
1569
tcase_add_test_raise_signal (tc_next_lead, test_next_lead_fail_001, SIGABRT);
1572
TCase* tc_readv = tcase_create ("readv");
1573
suite_add_tcase (s, tc_readv);
1574
tcase_add_test (tc_readv, test_readv_pass_001);
1575
tcase_add_test (tc_readv, test_readv_pass_002);
1576
tcase_add_test (tc_readv, test_readv_pass_003);
1577
tcase_add_test (tc_readv, test_readv_pass_004);
1578
tcase_add_test (tc_readv, test_readv_pass_005);
1579
tcase_add_test (tc_readv, test_readv_pass_006);
1580
#ifndef PGM_CHECK_NOFORK
1581
tcase_add_test_raise_signal (tc_readv, test_readv_fail_001, SIGABRT);
1582
tcase_add_test_raise_signal (tc_readv, test_readv_fail_002, SIGABRT);
1583
tcase_add_test_raise_signal (tc_readv, test_readv_fail_003, SIGABRT);
1586
TCase* tc_remove_commit = tcase_create ("remove-commit");
1587
suite_add_tcase (s, tc_remove_commit);
1588
tcase_add_test (tc_remove_commit, test_remove_commit_pass_001);
1589
#ifndef PGM_CHECK_NOFORK
1590
tcase_add_test_raise_signal (tc_remove_commit, test_remove_commit_fail_001, SIGABRT);
1593
TCase* tc_remove_trail = tcase_create ("remove-trail");
1594
TCase* tc_update = tcase_create ("update");
1595
suite_add_tcase (s, tc_update);
1596
tcase_add_test (tc_update, test_update_pass_001);
1597
#ifndef PGM_CHECK_NOFORK
1598
tcase_add_test_raise_signal (tc_update, test_update_fail_001, SIGABRT);
1601
TCase* tc_confirm = tcase_create ("confirm");
1602
suite_add_tcase (s, tc_confirm);
1603
tcase_add_test (tc_confirm, test_confirm_pass_001);
1604
tcase_add_test (tc_confirm, test_confirm_pass_002);
1605
#ifndef PGM_CHECK_NOFORK
1606
tcase_add_test_raise_signal (tc_confirm, test_confirm_fail_001, SIGABRT);
1609
TCase* tc_lost = tcase_create ("lost");
1610
suite_add_tcase (s, tc_lost);
1611
tcase_add_test (tc_lost, test_lost_pass_001);
1612
#ifndef PGM_CHECK_NOFORK
1613
tcase_add_test_raise_signal (tc_lost, test_lost_fail_001, SIGABRT);
1616
TCase* tc_state = tcase_create ("state");
1617
suite_add_tcase (s, tc_state);
1618
tcase_add_test (tc_state, test_state_pass_001);
1619
#ifndef PGM_CHECK_NOFORK
1620
tcase_add_test_raise_signal (tc_state, test_state_fail_001, SIGABRT);
1626
/* read through lost packet */
1627
START_TEST (test_readv_pass_007)
1629
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1630
const uint32_t ack_c_p = 500;
1631
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1632
fail_if (NULL == window, "create failed");
1633
struct pgm_msgv_t msgv[1], *pmsg;
1634
struct pgm_sk_buff_t* skb;
1638
skb = generate_valid_skb ();
1639
fail_if (NULL == skb, "generate_valid_skb failed");
1640
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1641
skb->tail = (guint8*)skb->tail - skb->len;
1643
skb->pgm_data->data_sqn = g_htonl (i);
1644
const pgm_time_t now = 1;
1645
const pgm_time_t nak_rb_expiry = 2;
1646
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1647
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
1652
skb = generate_valid_skb ();
1653
fail_if (NULL == skb, "generate_valid_skb failed");
1654
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1655
skb->tail = (guint8*)skb->tail - skb->len;
1657
skb->pgm_data->data_sqn = g_htonl (i);
1658
const pgm_time_t now = 1;
1659
const pgm_time_t nak_rb_expiry = 2;
1660
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1661
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
1665
pgm_rxw_lost (window, 1);
1667
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
1671
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1676
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1678
pgm_rxw_remove_commit (window);
1679
/* read lost skb #1 */
1682
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1684
pgm_rxw_remove_commit (window);
1688
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1693
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1695
pgm_rxw_destroy (window);
1699
/* read through loss extended window */
1700
START_TEST (test_readv_pass_008)
1702
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1703
const uint32_t ack_c_p = 500;
1704
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1705
fail_if (NULL == window, "create failed");
1706
struct pgm_msgv_t msgv[1], *pmsg;
1707
struct pgm_sk_buff_t* skb;
1711
skb = generate_valid_skb ();
1712
fail_if (NULL == skb, "generate_valid_skb failed");
1713
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1714
skb->tail = (guint8*)skb->tail - skb->len;
1716
skb->pgm_data->data_sqn = g_htonl (i);
1717
const pgm_time_t now = 1;
1718
const pgm_time_t nak_rb_expiry = 2;
1719
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1720
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
1722
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
1726
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1728
pgm_rxw_remove_commit (window);
1732
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1737
skb = generate_valid_skb ();
1738
fail_if (NULL == skb, "generate_valid_skb failed");
1739
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1740
skb->tail = (guint8*)skb->tail - skb->len;
1742
skb->pgm_data->data_sqn = g_htonl (i);
1743
const pgm_time_t now = 1;
1744
const pgm_time_t nak_rb_expiry = 2;
1745
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1749
for (unsigned i = 1; i < 100; i++)
1750
pgm_rxw_lost (window, i);
1758
bytes_read = pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv));
1759
pgm_rxw_remove_commit (window);
1762
} while (-1 == bytes_read);
1763
fail_unless (100 == i, "readv failed");
1768
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1770
pgm_rxw_destroy (window);
1774
/* read through long data-loss */
1775
START_TEST (test_readv_pass_009)
1777
pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, 1000 };
1778
const uint32_t ack_c_p = 500;
1779
pgm_rxw_t* window = pgm_rxw_create (&tsi, 1500, 100, 0, 0, ack_c_p);
1780
fail_if (NULL == window, "create failed");
1781
struct pgm_msgv_t msgv[1], *pmsg;
1782
struct pgm_sk_buff_t* skb;
1786
skb = generate_valid_skb ();
1787
fail_if (NULL == skb, "generate_valid_skb failed");
1788
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1789
skb->tail = (guint8*)skb->tail - skb->len;
1791
skb->pgm_data->data_sqn = g_htonl (i);
1792
const pgm_time_t now = 1;
1793
const pgm_time_t nak_rb_expiry = 2;
1794
fail_unless (PGM_RXW_APPENDED == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1795
fail_unless ((1 + i) == pgm_rxw_length (window), "length failed");
1797
fail_unless (_pgm_rxw_commit_is_empty (window), "commit_is_empty failed");
1801
fail_unless (0 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1803
pgm_rxw_remove_commit (window);
1807
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1812
skb = generate_valid_skb ();
1813
fail_if (NULL == skb, "generate_valid_skb failed");
1814
skb->pgm_header->pgm_tsdu_length = g_htons (0);
1815
skb->tail = (guint8*)skb->tail - skb->len;
1817
skb->pgm_data->data_sqn = g_htonl (i);
1818
const pgm_time_t now = 1;
1819
const pgm_time_t nak_rb_expiry = 2;
1820
fail_unless (PGM_RXW_MISSING == pgm_rxw_add (window, skb, now, nak_rb_expiry), "add failed");
1824
for (unsigned i = 1901; i < 2000; i++)
1825
pgm_rxw_lost (window, i);
1833
bytes_read = pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv));
1834
pgm_rxw_remove_commit (window);
1837
} while (-1 == bytes_read);
1838
fail_unless (100 == i, "readv failed");
1843
fail_unless (-1 == pgm_rxw_readv (window, &pmsg, G_N_ELEMENTS(msgv)), "readv failed");
1845
pgm_rxw_destroy (window);
1849
/* a.k.a. unreliable delivery
1854
make_best_effort_test_suite (void)
1858
s = suite_create ("Best effort delivery");
1860
TCase* tc_readv = tcase_create ("readv");
1861
suite_add_tcase (s, tc_readv);
1862
tcase_add_test (tc_readv, test_readv_pass_007);
1863
tcase_add_test (tc_readv, test_readv_pass_008);
1864
tcase_add_test (tc_readv, test_readv_pass_009);
1871
make_master_suite (void)
1873
Suite* s = suite_create ("Master");
1880
SRunner* sr = srunner_create (make_master_suite ());
1881
srunner_add_suite (sr, make_basic_test_suite ());
1882
srunner_add_suite (sr, make_best_effort_test_suite ());
1883
srunner_run_all (sr, CK_ENV);
1884
int number_failed = srunner_ntests_failed (sr);
1886
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;