forked from
anil.recoil.org/ocaml-requests
A batteries included HTTP/1.1 client in OCaml
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 ] )