@@ -1095,6 +1095,107 @@ fn main() -> i32 {
10951095 check bool " Should generate user handler functions" true
10961096 (contains_substr c_code " handle_network" && contains_substr c_code " handle_security" )
10971097
1098+ (* * ── Unit tests for generate_ringbuf_handlers_from_registry (lines 2812-2826) ── *)
1099+
1100+ (* * Helper: build a minimal ir_ring_buffer_registry for unit testing *)
1101+ let make_registry ?(event_handler_registrations = [] ) rb_decls =
1102+ {
1103+ Ir. ring_buffer_declarations = rb_decls;
1104+ Ir. event_handler_registrations = event_handler_registrations;
1105+ Ir. usage_summary = {
1106+ Ir. used_in_ebpf = [] ;
1107+ Ir. used_in_userspace = [] ;
1108+ Ir. needs_event_processing = [] ;
1109+ };
1110+ }
1111+
1112+ let make_rb_decl name value_type =
1113+ {
1114+ Ir. rb_name = name;
1115+ Ir. rb_value_type = value_type;
1116+ Ir. rb_size = 4096 ;
1117+ Ir. rb_is_global = true ;
1118+ Ir. rb_declaration_pos = { Ast. line = 1 ; column = 1 ; filename = " test.ks" };
1119+ }
1120+
1121+ (* * Test: empty registry produces empty output regardless of dispatch_used *)
1122+ let test_handlers_empty_registry () =
1123+ let registry = make_registry [] in
1124+ let out_true = Userspace_codegen. generate_ringbuf_handlers_from_registry
1125+ registry ~dispatch_used: true in
1126+ let out_false = Userspace_codegen. generate_ringbuf_handlers_from_registry
1127+ registry ~dispatch_used: false in
1128+ check string " empty registry + dispatch_used:true → empty" " " out_true;
1129+ check string " empty registry + dispatch_used:false → empty" " " out_false
1130+
1131+ (* * Test: None branch – no event_handler_registrations entry → fallback to {rb_name}_callback *)
1132+ let test_handlers_none_branch_fallback () =
1133+ (* No registration entry for "events" → handler name must fall back to "events_callback" *)
1134+ let decl = make_rb_decl " events" Ir. IRU32 in
1135+ let registry = make_registry [decl] in (* event_handler_registrations = [] *)
1136+ let out = Userspace_codegen. generate_ringbuf_handlers_from_registry
1137+ registry ~dispatch_used: true in
1138+ check bool " None branch: _callback fallback in event handler wrapper"
1139+ true (contains_substr out " events_callback" );
1140+ check bool " None branch: event handler wrapper function generated"
1141+ true (contains_substr out " events_event_handler" );
1142+ check bool " None branch: wrapper calls fallback handler"
1143+ true (contains_substr out " return events_callback(event)" )
1144+
1145+ (* * Test: Some branch – registered handler name is used instead of fallback *)
1146+ let test_handlers_some_branch_registered_name () =
1147+ let decl = make_rb_decl " events" (Ir. IRStruct (" Event" , [(" id" , Ir. IRU32 )])) in
1148+ let registry = make_registry ~event_handler_registrations: [(" events" , " handle_event" )] [decl] in
1149+ let out = Userspace_codegen. generate_ringbuf_handlers_from_registry
1150+ registry ~dispatch_used: true in
1151+ check bool " Some branch: registered handler name used in wrapper"
1152+ true (contains_substr out " handle_event" );
1153+ check bool " Some branch: wrapper calls registered handler"
1154+ true (contains_substr out " return handle_event(event)" );
1155+ check bool " Some branch: fallback name NOT used"
1156+ false (contains_substr out " events_callback" )
1157+
1158+ (* * Test: dispatch_used:false → no event handler wrappers emitted *)
1159+ let test_handlers_dispatch_false_no_wrappers () =
1160+ let decl = make_rb_decl " events" Ir. IRU32 in
1161+ let registry = make_registry ~event_handler_registrations: [(" events" , " handle_event" )] [decl] in
1162+ let out = Userspace_codegen. generate_ringbuf_handlers_from_registry
1163+ registry ~dispatch_used: false in
1164+ check bool " dispatch_used:false → no event_handler wrapper"
1165+ false (contains_substr out " events_event_handler" );
1166+ check bool " dispatch_used:false → no combined_rb declaration"
1167+ false (contains_substr out " combined_rb" )
1168+
1169+ (* * Test: dispatch_used:true → combined_rb declaration emitted *)
1170+ let test_handlers_dispatch_true_combined_rb () =
1171+ let decl = make_rb_decl " events" Ir. IRU32 in
1172+ let registry = make_registry ~event_handler_registrations: [(" events" , " handle_event" )] [decl] in
1173+ let out = Userspace_codegen. generate_ringbuf_handlers_from_registry
1174+ registry ~dispatch_used: true in
1175+ check bool " dispatch_used:true → combined_rb NULL declaration emitted"
1176+ true (contains_substr out " combined_rb = NULL" )
1177+
1178+ (* * Test: multiple ring buffers – every buffer gets its own event handler wrapper *)
1179+ let test_handlers_multiple_ringbufs () =
1180+ let decl1 = make_rb_decl " net_events" (Ir. IRStruct (" NetEvent" , [(" src_ip" , Ir. IRU32 )])) in
1181+ let decl2 = make_rb_decl " sec_events" (Ir. IRStruct (" SecEvent" , [(" severity" , Ir. IRU32 )])) in
1182+ let registry = make_registry
1183+ ~event_handler_registrations: [
1184+ (" net_events" , " handle_net" );
1185+ (" sec_events" , " handle_sec" );
1186+ ]
1187+ [decl1; decl2] in
1188+ let out = Userspace_codegen. generate_ringbuf_handlers_from_registry
1189+ registry ~dispatch_used: true in
1190+ check bool " multiple: net_events_event_handler generated"
1191+ true (contains_substr out " net_events_event_handler" );
1192+ check bool " multiple: sec_events_event_handler generated"
1193+ true (contains_substr out " sec_events_event_handler" );
1194+ check bool " multiple: handle_net referenced"
1195+ true (contains_substr out " handle_net" );
1196+ check bool " multiple: handle_sec referenced"
1197+ true (contains_substr out " handle_sec" )
1198+
10981199(* * Run all tests *)
10991200let () =
11001201 run " Ring Buffer Tests" [
@@ -1151,4 +1252,12 @@ let () =
11511252 test_case " complex operations" `Quick test_ringbuf_complex_operations;
11521253 test_case " on_event and dispatch integration" `Quick test_on_event_dispatch_integration;
11531254 ];
1255+ " handler registry unit tests" , [
1256+ test_case " empty registry" `Quick test_handlers_empty_registry;
1257+ test_case " None branch fallback to _callback" `Quick test_handlers_none_branch_fallback;
1258+ test_case " Some branch registered handler name" `Quick test_handlers_some_branch_registered_name;
1259+ test_case " dispatch_used false suppresses wrappers" `Quick test_handlers_dispatch_false_no_wrappers;
1260+ test_case " dispatch_used true emits combined_rb" `Quick test_handlers_dispatch_true_combined_rb;
1261+ test_case " multiple ring buffers each get wrapper" `Quick test_handlers_multiple_ringbufs;
1262+ ];
11541263 ]
0 commit comments