@@ -31,12 +31,27 @@ struct update_callback *expected_callbacks;
31
31
size_t callback_index ;
32
32
size_t callback_count ;
33
33
34
+ /*
35
+ * Expected error PDUs sent by the RTRlib in the tests.
36
+ *
37
+ * Other PDUs are not expected since the tests pass the test data
38
+ * directly to the receiver function circumventing the need of an
39
+ * initially sent SerialQuery or ResetQuery.
40
+ */
41
+ struct sent_pdu * expected_error_pdus ;
42
+ size_t expected_error_pdus_index ;
43
+ size_t expected_error_pdus_count ;
44
+
34
45
struct update_callback {
35
46
struct aspa_table * source ;
36
47
struct aspa_record record ;
37
48
enum aspa_operation_type type ;
38
49
};
39
50
51
+ struct sent_pdu {
52
+ uint16_t error_code ;
53
+ };
54
+
40
55
#define BYTES16 (X ) lrtr_convert_short(TO_HOST_HOST_BYTE_ORDER, X)
41
56
#define BYTES32 (X ) lrtr_convert_long(TO_HOST_HOST_BYTE_ORDER, X)
42
57
@@ -78,6 +93,16 @@ struct update_callback {
78
93
79
94
#define EXPECT_NO_UPDATE_CALLBACKS () \
80
95
expect_update_callbacks(NULL, 0)
96
+
97
+ #define ERROR_PDU (err_code ) ((struct sent_pdu) {.error_code = err_code})
98
+
99
+ #define EXPECT_ERROR_PDUS_SENT (...) \
100
+ struct sent_pdu _LINEVAR(_sent_pdus)[] = {__VA_ARGS__}; \
101
+ expect_sent_pdus(_LINEVAR(_sent_pdus), \
102
+ (size_t)(sizeof(_LINEVAR(_sent_pdus)) / sizeof(struct sent_pdu)))
103
+
104
+ #define EXPECT_NO_ERROR_PDUS_SENT () \
105
+ expect_sent_pdus(NULL, 0)
81
106
// clang-format on
82
107
83
108
#define ASPA_ANNOUNCE 1
@@ -88,6 +113,11 @@ static int custom_send(const struct tr_socket *socket __attribute__((unused)), c
88
113
{
89
114
const struct pdu_error * err = pdu ;
90
115
116
+ assert (expected_error_pdus != NULL );
117
+ assert (expected_error_pdus_index < expected_error_pdus_count );
118
+ uint16_t error_code = BYTES16 (err -> error_code );
119
+ assert (expected_error_pdus [expected_error_pdus_index ].error_code == error_code );
120
+
91
121
if (err -> type == 10 ) {
92
122
uint32_t * errlen = (uint32_t * )((char * )err -> rest + err -> len_enc_pdu );
93
123
@@ -198,6 +228,20 @@ static void expect_update_callbacks(struct update_callback callbacks[], size_t c
198
228
}
199
229
}
200
230
231
+ static void expect_sent_pdus (struct sent_pdu sent_pdus [], size_t count )
232
+ {
233
+ expected_error_pdus = sent_pdus ;
234
+ expected_error_pdus_index = 0 ;
235
+ expected_error_pdus_count = count ;
236
+ }
237
+
238
+ static void clear_expected_sent_pdus (void )
239
+ {
240
+ expected_error_pdus = NULL ;
241
+ expected_error_pdus_index = 0 ;
242
+ expected_error_pdus_count = 0 ;
243
+ }
244
+
201
245
static void aspa_update_callback (struct aspa_table * s , const struct aspa_record record ,
202
246
const struct rtr_socket * rtr_sockt __attribute__((unused )),
203
247
const enum aspa_operation_type operation_type )
@@ -316,6 +360,7 @@ static void test_no_aspa(struct rtr_socket *socket)
316
360
end_cache_response (RTR_PROTOCOL_VERSION_2 , 0 , 437 );
317
361
318
362
EXPECT_NO_UPDATE_CALLBACKS ();
363
+ EXPECT_NO_ERROR_PDUS_SENT ();
319
364
320
365
assert (rtr_sync (socket ) == RTR_SUCCESS );
321
366
assert (callback_index == callback_count );
@@ -336,6 +381,7 @@ static void test_regular_announcement(struct rtr_socket *socket)
336
381
EXPECT_UPDATE_CALLBACKS (
337
382
ADDED (RECORD (1100 , ASNS (1101 , 1102 , 1103 , 1104 ))),
338
383
);
384
+ EXPECT_NO_ERROR_PDUS_SENT ();
339
385
340
386
assert (rtr_sync (socket ) == RTR_SUCCESS );
341
387
assert (callback_index == callback_count );
@@ -359,6 +405,7 @@ static void test_withdraw(struct rtr_socket *socket)
359
405
EXPECT_UPDATE_CALLBACKS (
360
406
REMOVED (RECORD (1100 , ASNS (1101 , 1102 , 1103 , 1104 ))),
361
407
);
408
+ EXPECT_NO_ERROR_PDUS_SENT ();
362
409
363
410
assert (rtr_sync (socket ) == RTR_SUCCESS );
364
411
assert (callback_index == callback_count );
@@ -380,6 +427,7 @@ static void test_regular_announcements(struct rtr_socket *socket)
380
427
ADDED (RECORD (1100 , ASNS (1101 , 1102 , 1103 , 1104 ))),
381
428
ADDED (RECORD (4400 , ASNS (4401 ))),
382
429
);
430
+ EXPECT_NO_ERROR_PDUS_SENT ();
383
431
384
432
assert (rtr_sync (socket ) == RTR_SUCCESS );
385
433
assert (callback_index == callback_count );
@@ -405,6 +453,7 @@ static void test_announce_existing(struct rtr_socket *socket)
405
453
406
454
// No updates expected, fails at first PDU
407
455
EXPECT_NO_UPDATE_CALLBACKS ();
456
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (DUPLICATE_ANNOUNCEMENT ));
408
457
409
458
assert (rtr_sync (socket ) == RTR_ERROR );
410
459
assert (callback_index == callback_count );
@@ -427,6 +476,7 @@ static void test_announce_twice(struct rtr_socket *socket)
427
476
428
477
// No updates expected, fails at first PDU
429
478
EXPECT_NO_UPDATE_CALLBACKS ();
479
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (DUPLICATE_ANNOUNCEMENT ));
430
480
431
481
assert (rtr_sync (socket ) == RTR_ERROR );
432
482
assert (callback_index == callback_count );
@@ -449,6 +499,7 @@ static void test_withdraw_nonexisting(struct rtr_socket *socket)
449
499
450
500
// No updates expected, fails at first PDU
451
501
EXPECT_NO_UPDATE_CALLBACKS ();
502
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (WITHDRAWAL_OF_UNKNOWN_RECORD ));
452
503
453
504
assert (rtr_sync (socket ) == RTR_ERROR );
454
505
assert (callback_index == callback_count );
@@ -478,6 +529,8 @@ static void test_announce_withdraw(struct rtr_socket *socket)
478
529
#else
479
530
EXPECT_NO_UPDATE_CALLBACKS ();
480
531
#endif
532
+ EXPECT_NO_ERROR_PDUS_SENT ();
533
+
481
534
482
535
assert (rtr_sync (socket ) == RTR_SUCCESS );
483
536
assert (callback_index == callback_count );
@@ -516,6 +569,7 @@ static void test_withdraw_announce(struct rtr_socket *socket)
516
569
ADDED (RECORD (1100 , ASNS (2201 , 2202 , 2203 , 2204 ))),
517
570
);
518
571
#endif
572
+ EXPECT_NO_ERROR_PDUS_SENT ();
519
573
520
574
assert (rtr_sync (socket ) == RTR_SUCCESS );
521
575
assert (callback_index == callback_count );
@@ -540,6 +594,7 @@ static void test_regular(struct rtr_socket *socket)
540
594
ADDED (RECORD (1101 , ASNS (1100 , 1102 , 1103 , 1104 ))),
541
595
ADDED (RECORD (2200 , ASNS (2201 , 2202 , 2203 , 2204 ))),
542
596
);
597
+ EXPECT_NO_ERROR_PDUS_SENT ();
543
598
544
599
assert (rtr_sync (socket ) == RTR_SUCCESS );
545
600
assert (callback_index == callback_count );
@@ -557,6 +612,7 @@ static void test_regular(struct rtr_socket *socket)
557
612
EXPECT_UPDATE_CALLBACKS (
558
613
ADDED (RECORD (3300 , ASNS (3301 , 3302 , 3303 , 3304 ))),
559
614
);
615
+ EXPECT_NO_ERROR_PDUS_SENT ();
560
616
561
617
assert (rtr_sync (socket ) == RTR_SUCCESS );
562
618
assert (callback_index == callback_count );
@@ -579,6 +635,7 @@ static void test_regular(struct rtr_socket *socket)
579
635
ADDED (RECORD (1100 , ASNS (1201 , 1202 , 1203 , 1204 ))),
580
636
REMOVED (RECORD (2200 , ASNS (2201 , 2202 , 2203 , 2204 ))),
581
637
);
638
+ EXPECT_NO_ERROR_PDUS_SENT ();
582
639
583
640
assert (rtr_sync (socket ) == RTR_SUCCESS );
584
641
assert (callback_index == callback_count );
@@ -605,6 +662,7 @@ static void test_regular(struct rtr_socket *socket)
605
662
printf ("Ignoring No-Ops!\n" );
606
663
EXPECT_NO_UPDATE_CALLBACKS ();
607
664
#endif
665
+ EXPECT_NO_ERROR_PDUS_SENT ();
608
666
609
667
assert (rtr_sync (socket ) == RTR_SUCCESS );
610
668
assert (callback_index == callback_count );
@@ -644,6 +702,7 @@ static void test_regular_swap(struct rtr_socket *socket)
644
702
ADDED_TO (dst_table , RECORD (1100 , ASNS (1101 , 1102 , 1103 , 1104 ))),
645
703
ADDED_TO (dst_table , RECORD (4400 , ASNS (4401 )))
646
704
);
705
+ EXPECT_NO_ERROR_PDUS_SENT ();
647
706
648
707
assert (rtr_sync (socket ) == RTR_SUCCESS );
649
708
assert (callback_index == callback_count );
@@ -672,6 +731,7 @@ static void test_regular_swap(struct rtr_socket *socket)
672
731
ADDED_TO (dst_table , RECORD (1101 , ASNS (1100 , 1102 , 1103 , 1104 ))),
673
732
ADDED_TO (dst_table , RECORD (3300 , ASNS (3301 , 3302 , 3303 , 3304 ))),
674
733
);
734
+ EXPECT_NO_ERROR_PDUS_SENT ();
675
735
676
736
assert (aspa_table_src_replace (dst_table , src_table , socket , true, true) == ASPA_SUCCESS );
677
737
assert (callback_index == callback_count );
@@ -697,6 +757,7 @@ static void test_withdraw_twice(struct rtr_socket *socket)
697
757
ADDED (RECORD (1901 , ASNS (1900 , 1902 , 1903 , 1904 ))),
698
758
ADDED (RECORD (2200 , ASNS (2201 , 2202 , 2203 , 2204 ))),
699
759
);
760
+ EXPECT_NO_ERROR_PDUS_SENT ();
700
761
701
762
assert (rtr_sync (socket ) == RTR_SUCCESS );
702
763
assert (callback_index == callback_count );
@@ -714,6 +775,7 @@ static void test_withdraw_twice(struct rtr_socket *socket)
714
775
EXPECT_UPDATE_CALLBACKS (
715
776
ADDED (RECORD (3300 , ASNS (3301 , 3302 , 3303 , 3304 ))),
716
777
);
778
+ EXPECT_NO_ERROR_PDUS_SENT ();
717
779
718
780
assert (rtr_sync (socket ) == RTR_SUCCESS );
719
781
assert (callback_index == callback_count );
@@ -730,9 +792,10 @@ static void test_withdraw_twice(struct rtr_socket *socket)
730
792
APPEND_ASPA (RTR_PROTOCOL_VERSION_2 , ASPA_WITHDRAW , 2200 , ASNS ());
731
793
APPEND_ASPA (RTR_PROTOCOL_VERSION_2 , ASPA_WITHDRAW , 1900 , ASNS ());
732
794
APPEND_ASPA (RTR_PROTOCOL_VERSION_2 , ASPA_ANNOUNCE , 1900 , ASNS (1201 , 1202 , 1203 , 1204 ));
733
- APPEND_ASPA (RTR_PROTOCOL_VERSION_2 , ASPA_ANNOUNCE , 0 , ASNS ());
734
795
end_cache_response (RTR_PROTOCOL_VERSION_2 , 0 , 444 );
735
796
797
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (WITHDRAWAL_OF_UNKNOWN_RECORD ));
798
+
736
799
// Callback behavior deviates for different update mechanisms
737
800
// Swap-In: No callback because update computation fails
738
801
// In-Place: Callbacks until failed operation, then callbacks from undo
@@ -761,6 +824,7 @@ static void test_announce_withdraw_announce_twice(struct rtr_socket *socket)
761
824
EXPECT_UPDATE_CALLBACKS (
762
825
ADDED (RECORD (1400 , ASNS (1401 , 1402 , 1403 , 1404 ))),
763
826
);
827
+ EXPECT_NO_ERROR_PDUS_SENT ();
764
828
765
829
assert (rtr_sync (socket ) == RTR_SUCCESS );
766
830
@@ -774,6 +838,8 @@ static void test_announce_withdraw_announce_twice(struct rtr_socket *socket)
774
838
APPEND_ASPA (RTR_PROTOCOL_VERSION_2 , ASPA_ANNOUNCE , 1400 , ASNS (1201 , 1202 , 1203 ));
775
839
end_cache_response (RTR_PROTOCOL_VERSION_2 , 0 , 444 );
776
840
841
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (DUPLICATE_ANNOUNCEMENT ));
842
+
777
843
// Callback behavior deviates for different update mechanisms
778
844
// Swap-In: No callback because update computation fails
779
845
// In-Place: Callbacks until failed operation, then callbacks from undo
@@ -802,6 +868,7 @@ static void test_multiple_syncs(struct rtr_socket *socket)
802
868
ADDED (RECORD (1 , ASNS (2 , 3 , 4 , 5 ))),
803
869
ADDED (RECORD (2 , ASNS (3 , 4 , 5 , 6 ))),
804
870
);
871
+ EXPECT_NO_ERROR_PDUS_SENT ();
805
872
806
873
assert (rtr_sync (socket ) == RTR_SUCCESS );
807
874
assert (callback_index == callback_count );
@@ -839,6 +906,7 @@ static void test_multiple_syncs(struct rtr_socket *socket)
839
906
ADDED (RECORD (c_an , ASNS (c_an + 1 , c_an + 2 , c_an + 3 , c_an + 4 ))),
840
907
ADDED (RECORD (c_an + 1 , ASNS (c_an + 2 , c_an + 3 , c_an + 4 , c_an + 5 ))),
841
908
);
909
+ EXPECT_NO_ERROR_PDUS_SENT ();
842
910
assert (rtr_sync (socket ) == RTR_SUCCESS );
843
911
assert (callback_index == callback_count );
844
912
@@ -904,6 +972,7 @@ static void test_many_pdus(struct rtr_socket *socket)
904
972
}
905
973
906
974
expect_update_callbacks (callbacks , N );
975
+ EXPECT_NO_ERROR_PDUS_SENT ();
907
976
908
977
// sync
909
978
assert (rtr_sync (socket ) == RTR_SUCCESS );
@@ -931,6 +1000,7 @@ static void test_corrupt_pdu_length_field(struct rtr_socket *socket)
931
1000
932
1001
// No updates expected, fails at first PDU
933
1002
EXPECT_NO_UPDATE_CALLBACKS ();
1003
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (CORRUPT_DATA ));
934
1004
assert (rtr_sync (socket ) == RTR_ERROR );
935
1005
assert (callback_index == callback_count );
936
1006
@@ -955,6 +1025,8 @@ static void test_corrupt_pdu_provider_autonomous_system_number_list_in_announcem
955
1025
956
1026
// No updates expected, fails at first PDU
957
1027
EXPECT_NO_UPDATE_CALLBACKS ();
1028
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (INCORRECT_ASPA_PROVIDER_LIST ));
1029
+
958
1030
assert (rtr_sync (socket ) == RTR_ERROR );
959
1031
assert (callback_index == callback_count );
960
1032
@@ -978,6 +1050,9 @@ static void test_corrupt_pdu_provider_autonomous_system_number_list_in_withdraw(
978
1050
APPEND_ASPA (RTR_PROTOCOL_VERSION_2 , ASPA_WITHDRAW , 1100 , ASNS (42 ));
979
1051
end_cache_response (RTR_PROTOCOL_VERSION_2 , 0 , 444 );
980
1052
1053
+ EXPECT_NO_UPDATE_CALLBACKS ();
1054
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (CORRUPT_DATA ));
1055
+
981
1056
assert (rtr_sync (socket ) == RTR_ERROR );
982
1057
assert (callback_index == callback_count );
983
1058
@@ -1006,6 +1081,9 @@ static void test_error_pdu_to_be_truncated(struct rtr_socket *socket)
1006
1081
APPEND_ASPA (RTR_PROTOCOL_VERSION_2 , ASPA_ANNOUNCE , 1100 , asns );
1007
1082
end_cache_response (RTR_PROTOCOL_VERSION_2 , 0 , 444 );
1008
1083
1084
+ EXPECT_NO_UPDATE_CALLBACKS ();
1085
+ EXPECT_ERROR_PDUS_SENT (ERROR_PDU (DUPLICATE_ANNOUNCEMENT ));
1086
+
1009
1087
assert (rtr_sync (socket ) == RTR_ERROR );
1010
1088
assert (callback_index == callback_count );
1011
1089
@@ -1051,6 +1129,7 @@ static void cleanup(struct rtr_socket **socket)
1051
1129
}
1052
1130
1053
1131
clear_expected_callbacks ();
1132
+ clear_expected_sent_pdus ();
1054
1133
}
1055
1134
1056
1135
static struct rtr_socket * create_socket (bool is_resetting )
0 commit comments