2 * nghttp2 - HTTP/2 C Library
4 * Copyright (c) 2013 Tatsuhiro Tsujikawa
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 #include "nghttp2_helper_test.h"
27 #include <CUnit/CUnit.h>
29 #include "nghttp2_helper.h"
31 void test_nghttp2_adjust_local_window_size(void) {
32 int32_t local_window_size = 100;
33 int32_t recv_window_size = 50;
34 int32_t recv_reduction = 0;
38 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
40 &recv_reduction, &delta));
41 CU_ASSERT(100 == local_window_size);
42 CU_ASSERT(50 == recv_window_size);
43 CU_ASSERT(0 == recv_reduction);
44 CU_ASSERT(0 == delta);
47 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
49 &recv_reduction, &delta));
50 CU_ASSERT(100 == local_window_size);
51 CU_ASSERT(1 == recv_window_size);
52 CU_ASSERT(0 == recv_reduction);
53 CU_ASSERT(49 == delta);
56 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
58 &recv_reduction, &delta));
59 CU_ASSERT(100 == local_window_size);
60 CU_ASSERT(0 == recv_window_size);
61 CU_ASSERT(0 == recv_reduction);
62 CU_ASSERT(1 == delta);
65 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
67 &recv_reduction, &delta));
68 CU_ASSERT(101 == local_window_size);
69 CU_ASSERT(0 == recv_window_size);
70 CU_ASSERT(0 == recv_reduction);
71 CU_ASSERT(1 == delta);
74 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
76 &recv_reduction, &delta));
77 CU_ASSERT(100 == local_window_size);
78 CU_ASSERT(-1 == recv_window_size);
79 CU_ASSERT(1 == recv_reduction);
80 CU_ASSERT(0 == delta);
83 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
85 &recv_reduction, &delta));
86 CU_ASSERT(101 == local_window_size);
87 CU_ASSERT(0 == recv_window_size);
88 CU_ASSERT(0 == recv_reduction);
89 CU_ASSERT(0 == delta);
92 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
94 &recv_reduction, &delta));
95 CU_ASSERT(201 == local_window_size);
96 CU_ASSERT(0 == recv_window_size);
97 CU_ASSERT(0 == recv_reduction);
98 CU_ASSERT(100 == delta);
101 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
103 &recv_reduction, &delta));
104 CU_ASSERT(198 == local_window_size);
105 CU_ASSERT(-3 == recv_window_size);
106 CU_ASSERT(3 == recv_reduction);
107 CU_ASSERT(0 == delta);
109 recv_window_size += 3;
112 CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
114 &recv_reduction, &delta));
115 CU_ASSERT(201 == local_window_size);
116 CU_ASSERT(3 == recv_window_size);
117 CU_ASSERT(0 == recv_reduction);
118 CU_ASSERT(0 == delta);
120 local_window_size = 100;
121 recv_window_size = 50;
124 CU_ASSERT(NGHTTP2_ERR_FLOW_CONTROL ==
125 nghttp2_adjust_local_window_size(&local_window_size,
126 &recv_window_size, &recv_reduction,
128 CU_ASSERT(100 == local_window_size);
129 CU_ASSERT(50 == recv_window_size);
130 CU_ASSERT(0 == recv_reduction);
131 CU_ASSERT(INT32_MAX == delta);
134 CU_ASSERT(NGHTTP2_ERR_FLOW_CONTROL ==
135 nghttp2_adjust_local_window_size(&local_window_size,
136 &recv_window_size, &recv_reduction,
138 CU_ASSERT(100 == local_window_size);
139 CU_ASSERT(50 == recv_window_size);
140 CU_ASSERT(0 == recv_reduction);
141 CU_ASSERT(INT32_MIN == delta);
144 #define check_header_name(S) \
145 nghttp2_check_header_name((const uint8_t *)S, sizeof(S) - 1)
147 void test_nghttp2_check_header_name(void) {
148 CU_ASSERT(check_header_name(":path"));
149 CU_ASSERT(check_header_name("path"));
150 CU_ASSERT(check_header_name("!#$%&'*+-.^_`|~"));
151 CU_ASSERT(!check_header_name(":PATH"));
152 CU_ASSERT(!check_header_name("path:"));
153 CU_ASSERT(!check_header_name(""));
154 CU_ASSERT(!check_header_name(":"));
157 #define check_header_value(S) \
158 nghttp2_check_header_value((const uint8_t *)S, sizeof(S) - 1)
160 void test_nghttp2_check_header_value(void) {
161 uint8_t goodval[] = {'a', 'b', 0x80u, 'c', 0xffu, 'd', '\t', ' '};
162 uint8_t badval1[] = {'a', 0x1fu, 'b'};
163 uint8_t badval2[] = {'a', 0x7fu, 'b'};
165 CU_ASSERT(check_header_value(" !|}~"));
166 CU_ASSERT(check_header_value(goodval));
167 CU_ASSERT(!check_header_value(badval1));
168 CU_ASSERT(!check_header_value(badval2));