X-Forwarded-For parsing and trusted proxy detection for OCaml

refactor(crowbar): Alcotest-style API with suite exports and grouped run

- Change `run` signature to `string -> (string * test_case list) list -> unit`
matching Alcotest's grouping convention
- Fix `_name` bug: pass the name through to Alcotest.run_with_args
- Each fuzz module now exports `let suite = ("name", [test_case ...])`
- Entry points (fuzz.ml) collect suites: `Crowbar.run "pkg" [Fuzz_X.suite]`
- Remove stale `add_test`/`suite` API, keep only `test_case`/`run`
- Remove `let run () = ()` from fuzz_common.ml files
- Update merlint E725 rule to match new `let suite = ("name", ...)` pattern
- Update E725 test fixtures and expected output

+15 -13
+15 -13
fuzz/fuzz_xff.ml
··· 68 68 | _ -> ()); 69 69 check true 70 70 71 - let () = 72 - add_test ~name:"xff: parse_xff no crash" [ bytes ] test_parse_xff_no_crash; 73 - add_test ~name:"xff: client_ip no crash" [ bytes ] test_client_ip_no_crash; 74 - add_test ~name:"xff: parse_cidr no crash" [ bytes ] test_parse_cidr_no_crash; 75 - add_test ~name:"xff: get_client_ip no crash" [ bytes; bytes ] 76 - test_get_client_ip_no_crash; 77 - add_test ~name:"xff: comma separated" [ bytes; bytes; bytes ] 78 - test_comma_separated; 79 - add_test ~name:"xff: ipv4" [ int; int; int; int ] test_ipv4_xff; 80 - add_test ~name:"xff: cidr notation" 81 - [ int; int; int; int; int ] 82 - test_cidr_notation; 83 - add_test ~name:"xff: is_trusted_proxy" [ bytes; bytes ] test_is_trusted_proxy 71 + let suite = 72 + ( "xff", 73 + [ 74 + test_case "parse_xff no crash" [ bytes ] test_parse_xff_no_crash; 75 + test_case "client_ip no crash" [ bytes ] test_client_ip_no_crash; 76 + test_case "parse_cidr no crash" [ bytes ] test_parse_cidr_no_crash; 77 + test_case "get_client_ip no crash" [ bytes; bytes ] 78 + test_get_client_ip_no_crash; 79 + test_case "comma separated" [ bytes; bytes; bytes ] test_comma_separated; 80 + test_case "ipv4" [ int; int; int; int ] test_ipv4_xff; 81 + test_case "cidr notation" [ int; int; int; int; int ] test_cidr_notation; 82 + test_case "is_trusted_proxy" [ bytes; bytes ] test_is_trusted_proxy; 83 + ] ) 84 + 85 + let () = run "xff" [ suite ]