A batteries included HTTP/1.1 client in OCaml
at main 194 lines 7.1 kB view raw
1(*--------------------------------------------------------------------------- 2 Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved. 3 SPDX-License-Identifier: ISC 4 ---------------------------------------------------------------------------*) 5 6(** Tests for Http_version module *) 7 8module Http_version = Requests.Http_version 9 10(** {1 to_string Tests} *) 11 12let test_to_string_http10 () = 13 let s = Http_version.to_string Http_version.Http_1_0 in 14 Alcotest.(check string) "HTTP/1.0" "HTTP/1.0" s 15 16let test_to_string_http11 () = 17 let s = Http_version.to_string Http_version.Http_1_1 in 18 Alcotest.(check string) "HTTP/1.1" "HTTP/1.1" s 19 20let test_to_string_http_2 () = 21 let s = Http_version.to_string Http_version.Http_2 in 22 Alcotest.(check string) "HTTP/2" "HTTP/2" s 23 24(** {1 equal Tests} *) 25 26let test_equal_same () = 27 Alcotest.(check bool) 28 "equal same" true 29 (Http_version.equal Http_version.Http_1_1 Http_version.Http_1_1) 30 31let test_equal_different () = 32 Alcotest.(check bool) 33 "equal different" false 34 (Http_version.equal Http_version.Http_1_1 Http_version.Http_2) 35 36let test_equal_http_versions () = 37 Alcotest.(check bool) 38 "1.0 != 1.1" false 39 (Http_version.equal Http_version.Http_1_0 Http_version.Http_1_1) 40 41(** {1 compare Tests} *) 42 43let test_compare_order () = 44 Alcotest.(check bool) 45 "1.0 < 1.1" true 46 (Http_version.compare Http_version.Http_1_0 Http_version.Http_1_1 < 0); 47 Alcotest.(check bool) 48 "1.1 < 2" true 49 (Http_version.compare Http_version.Http_1_1 Http_version.Http_2 < 0); 50 Alcotest.(check bool) 51 "2 > 1.0" true 52 (Http_version.compare Http_version.Http_2 Http_version.Http_1_0 > 0) 53 54(** {1 supports_multiplexing Tests} *) 55 56let test_multiplexing_http2 () = 57 Alcotest.(check bool) 58 "HTTP/2 supports multiplexing" true 59 (Http_version.supports_multiplexing Http_version.Http_2) 60 61let test_multiplexing_http11 () = 62 Alcotest.(check bool) 63 "HTTP/1.1 no multiplexing" false 64 (Http_version.supports_multiplexing Http_version.Http_1_1) 65 66let test_multiplexing_http10 () = 67 Alcotest.(check bool) 68 "HTTP/1.0 no multiplexing" false 69 (Http_version.supports_multiplexing Http_version.Http_1_0) 70 71(** {1 supports_header_compression Tests} *) 72 73let test_header_compression_http2 () = 74 Alcotest.(check bool) 75 "HTTP/2 supports header compression" true 76 (Http_version.supports_header_compression Http_version.Http_2) 77 78let test_header_compression_http11 () = 79 Alcotest.(check bool) 80 "HTTP/1.1 no header compression" false 81 (Http_version.supports_header_compression Http_version.Http_1_1) 82 83let test_header_compression_http10 () = 84 Alcotest.(check bool) 85 "HTTP/1.0 no header compression" false 86 (Http_version.supports_header_compression Http_version.Http_1_0) 87 88(** {1 supports_server_push Tests} *) 89 90let test_server_push_http2 () = 91 Alcotest.(check bool) 92 "HTTP/2 supports server push" true 93 (Http_version.supports_server_push Http_version.Http_2) 94 95let test_server_push_http11 () = 96 Alcotest.(check bool) 97 "HTTP/1.1 no server push" false 98 (Http_version.supports_server_push Http_version.Http_1_1) 99 100(** {1 ALPN Tests} *) 101 102let test_alpn_of_version_h2 () = 103 let alpn = Http_version.alpn_of_version Http_version.Http_2 in 104 Alcotest.(check (option string)) "HTTP/2 ALPN" (Some "h2") alpn 105 106let test_alpn_of_version_http11 () = 107 let alpn = Http_version.alpn_of_version Http_version.Http_1_1 in 108 Alcotest.(check (option string)) "HTTP/1.1 ALPN" (Some "http/1.1") alpn 109 110let test_alpn_of_version_http10 () = 111 let alpn = Http_version.alpn_of_version Http_version.Http_1_0 in 112 Alcotest.(check (option string)) "HTTP/1.0 no ALPN" None alpn 113 114let test_version_of_alpn_h2 () = 115 let v = Http_version.version_of_alpn "h2" in 116 match v with 117 | Some Http_version.Http_2 -> Alcotest.(check pass) "h2 -> Http_2" () () 118 | _ -> Alcotest.fail "Expected Some Http_2" 119 120let test_version_of_alpn_http11 () = 121 let v = Http_version.version_of_alpn "http/1.1" in 122 match v with 123 | Some Http_version.Http_1_1 -> 124 Alcotest.(check pass) "http/1.1 -> Http_1_1" () () 125 | _ -> Alcotest.fail "Expected Some Http_1_1" 126 127let test_version_of_alpn_unknown () = 128 let v = Http_version.version_of_alpn "unknown" in 129 Alcotest.(check bool) "unknown ALPN" true (Option.is_none v) 130 131let test_alpn_protocols_preferred () = 132 let protocols = 133 Http_version.alpn_protocols 134 ~preferred:[ Http_version.Http_2; Http_version.Http_1_1 ] 135 in 136 Alcotest.(check (list string)) 137 "preferred order" [ "h2"; "http/1.1" ] protocols 138 139let test_alpn_protocols_single () = 140 let protocols = 141 Http_version.alpn_protocols ~preferred:[ Http_version.Http_1_1 ] 142 in 143 Alcotest.(check (list string)) "single" [ "http/1.1" ] protocols 144 145let test_alpn_filters_http10 () = 146 let protocols = 147 Http_version.alpn_protocols 148 ~preferred: 149 [ Http_version.Http_2; Http_version.Http_1_1; Http_version.Http_1_0 ] 150 in 151 Alcotest.(check (list string)) "filters 1.0" [ "h2"; "http/1.1" ] protocols 152 153(** {1 ALPN Constants Tests} *) 154 155let test_alpn_h2_constant () = 156 Alcotest.(check string) "alpn_h2" "h2" Http_version.alpn_h2 157 158let test_alpn_http11_constant () = 159 Alcotest.(check string) "alpn_http_1_1" "http/1.1" Http_version.alpn_http_1_1 160 161(** {1 Test Suite} *) 162 163let suite = 164 ( "http_version", 165 [ 166 Alcotest.test_case "HTTP/1.0" `Quick test_to_string_http10; 167 Alcotest.test_case "HTTP/1.1" `Quick test_to_string_http11; 168 Alcotest.test_case "HTTP/2" `Quick test_to_string_http_2; 169 Alcotest.test_case "same" `Quick test_equal_same; 170 Alcotest.test_case "different" `Quick test_equal_different; 171 Alcotest.test_case "1.0 vs 1.1" `Quick test_equal_http_versions; 172 Alcotest.test_case "ordering" `Quick test_compare_order; 173 Alcotest.test_case "HTTP/2" `Quick test_multiplexing_http2; 174 Alcotest.test_case "HTTP/1.1" `Quick test_multiplexing_http11; 175 Alcotest.test_case "HTTP/1.0" `Quick test_multiplexing_http10; 176 Alcotest.test_case "HTTP/2" `Quick test_header_compression_http2; 177 Alcotest.test_case "HTTP/1.1" `Quick test_header_compression_http11; 178 Alcotest.test_case "HTTP/1.0" `Quick test_header_compression_http10; 179 Alcotest.test_case "HTTP/2" `Quick test_server_push_http2; 180 Alcotest.test_case "HTTP/1.1" `Quick test_server_push_http11; 181 Alcotest.test_case "HTTP/2 -> h2" `Quick test_alpn_of_version_h2; 182 Alcotest.test_case "HTTP/1.1 -> http/1.1" `Quick 183 test_alpn_of_version_http11; 184 Alcotest.test_case "HTTP/1.0 -> None" `Quick test_alpn_of_version_http10; 185 Alcotest.test_case "h2 -> HTTP/2" `Quick test_version_of_alpn_h2; 186 Alcotest.test_case "http/1.1 -> HTTP/1.1" `Quick 187 test_version_of_alpn_http11; 188 Alcotest.test_case "unknown -> None" `Quick test_version_of_alpn_unknown; 189 Alcotest.test_case "preferred order" `Quick test_alpn_protocols_preferred; 190 Alcotest.test_case "single" `Quick test_alpn_protocols_single; 191 Alcotest.test_case "filters HTTP/1.0" `Quick test_alpn_filters_http10; 192 Alcotest.test_case "h2" `Quick test_alpn_h2_constant; 193 Alcotest.test_case "http/1.1" `Quick test_alpn_http11_constant; 194 ] )