• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * nghttp2 - HTTP/2 C Library
3  *
4  * Copyright (c) 2013 Tatsuhiro Tsujikawa
5  *
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:
13  *
14  * The above copyright notice and this permission notice shall be
15  * included in all copies or substantial portions of the Software.
16  *
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.
24  */
25 #include "nghttp2_helper_test.h"
26 
27 #include <stdio.h>
28 
29 #include <CUnit/CUnit.h>
30 
31 #include "nghttp2_helper.h"
32 
test_nghttp2_adjust_local_window_size(void)33 void test_nghttp2_adjust_local_window_size(void) {
34   int32_t local_window_size = 100;
35   int32_t recv_window_size = 50;
36   int32_t recv_reduction = 0;
37   int32_t delta;
38 
39   delta = 0;
40   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
41                                                   &recv_window_size,
42                                                   &recv_reduction, &delta));
43   CU_ASSERT(100 == local_window_size);
44   CU_ASSERT(50 == recv_window_size);
45   CU_ASSERT(0 == recv_reduction);
46   CU_ASSERT(0 == delta);
47 
48   delta = 49;
49   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
50                                                   &recv_window_size,
51                                                   &recv_reduction, &delta));
52   CU_ASSERT(100 == local_window_size);
53   CU_ASSERT(1 == recv_window_size);
54   CU_ASSERT(0 == recv_reduction);
55   CU_ASSERT(49 == delta);
56 
57   delta = 1;
58   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
59                                                   &recv_window_size,
60                                                   &recv_reduction, &delta));
61   CU_ASSERT(100 == local_window_size);
62   CU_ASSERT(0 == recv_window_size);
63   CU_ASSERT(0 == recv_reduction);
64   CU_ASSERT(1 == delta);
65 
66   delta = 1;
67   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
68                                                   &recv_window_size,
69                                                   &recv_reduction, &delta));
70   CU_ASSERT(101 == local_window_size);
71   CU_ASSERT(0 == recv_window_size);
72   CU_ASSERT(0 == recv_reduction);
73   CU_ASSERT(1 == delta);
74 
75   delta = -1;
76   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
77                                                   &recv_window_size,
78                                                   &recv_reduction, &delta));
79   CU_ASSERT(100 == local_window_size);
80   CU_ASSERT(-1 == recv_window_size);
81   CU_ASSERT(1 == recv_reduction);
82   CU_ASSERT(0 == delta);
83 
84   delta = 1;
85   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
86                                                   &recv_window_size,
87                                                   &recv_reduction, &delta));
88   CU_ASSERT(101 == local_window_size);
89   CU_ASSERT(0 == recv_window_size);
90   CU_ASSERT(0 == recv_reduction);
91   CU_ASSERT(0 == delta);
92 
93   delta = 100;
94   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
95                                                   &recv_window_size,
96                                                   &recv_reduction, &delta));
97   CU_ASSERT(201 == local_window_size);
98   CU_ASSERT(0 == recv_window_size);
99   CU_ASSERT(0 == recv_reduction);
100   CU_ASSERT(100 == delta);
101 
102   delta = -3;
103   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
104                                                   &recv_window_size,
105                                                   &recv_reduction, &delta));
106   CU_ASSERT(198 == local_window_size);
107   CU_ASSERT(-3 == recv_window_size);
108   CU_ASSERT(3 == recv_reduction);
109   CU_ASSERT(0 == delta);
110 
111   recv_window_size += 3;
112 
113   delta = 3;
114   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
115                                                   &recv_window_size,
116                                                   &recv_reduction, &delta));
117   CU_ASSERT(201 == local_window_size);
118   CU_ASSERT(3 == recv_window_size);
119   CU_ASSERT(0 == recv_reduction);
120   CU_ASSERT(0 == delta);
121 
122   local_window_size = 100;
123   recv_window_size = 50;
124   recv_reduction = 0;
125   delta = INT32_MAX;
126   CU_ASSERT(NGHTTP2_ERR_FLOW_CONTROL ==
127             nghttp2_adjust_local_window_size(&local_window_size,
128                                              &recv_window_size, &recv_reduction,
129                                              &delta));
130   CU_ASSERT(100 == local_window_size);
131   CU_ASSERT(50 == recv_window_size);
132   CU_ASSERT(0 == recv_reduction);
133   CU_ASSERT(INT32_MAX == delta);
134 
135   delta = INT32_MIN;
136   CU_ASSERT(NGHTTP2_ERR_FLOW_CONTROL ==
137             nghttp2_adjust_local_window_size(&local_window_size,
138                                              &recv_window_size, &recv_reduction,
139                                              &delta));
140   CU_ASSERT(100 == local_window_size);
141   CU_ASSERT(50 == recv_window_size);
142   CU_ASSERT(0 == recv_reduction);
143   CU_ASSERT(INT32_MIN == delta);
144 }
145 
146 #define check_header_name(S)                                                   \
147   nghttp2_check_header_name((const uint8_t *)S, sizeof(S) - 1)
148 
test_nghttp2_check_header_name(void)149 void test_nghttp2_check_header_name(void) {
150   CU_ASSERT(check_header_name(":path"));
151   CU_ASSERT(check_header_name("path"));
152   CU_ASSERT(check_header_name("!#$%&'*+-.^_`|~"));
153   CU_ASSERT(!check_header_name(":PATH"));
154   CU_ASSERT(!check_header_name("path:"));
155   CU_ASSERT(!check_header_name(""));
156   CU_ASSERT(!check_header_name(":"));
157 }
158 
159 #define check_header_value(S)                                                  \
160   nghttp2_check_header_value((const uint8_t *)S, sizeof(S) - 1)
161 
test_nghttp2_check_header_value(void)162 void test_nghttp2_check_header_value(void) {
163   uint8_t goodval[] = {'a', 'b', 0x80u, 'c', 0xffu, 'd', '\t', ' '};
164   uint8_t badval1[] = {'a', 0x1fu, 'b'};
165   uint8_t badval2[] = {'a', 0x7fu, 'b'};
166 
167   CU_ASSERT(check_header_value(" !|}~"));
168   CU_ASSERT(check_header_value(goodval));
169   CU_ASSERT(!check_header_value(badval1));
170   CU_ASSERT(!check_header_value(badval2));
171   CU_ASSERT(check_header_value(""));
172   CU_ASSERT(check_header_value(" "));
173   CU_ASSERT(check_header_value("\t"));
174 }
175 
176 #define check_header_value_rfc9113(S)                                          \
177   nghttp2_check_header_value_rfc9113((const uint8_t *)S, sizeof(S) - 1)
178 
test_nghttp2_check_header_value_rfc9113(void)179 void test_nghttp2_check_header_value_rfc9113(void) {
180   uint8_t goodval[] = {'a', 'b', 0x80u, 'c', 0xffu, 'd'};
181   uint8_t badval1[] = {'a', 0x1fu, 'b'};
182   uint8_t badval2[] = {'a', 0x7fu, 'b'};
183 
184   CU_ASSERT(check_header_value_rfc9113("!|}~"));
185   CU_ASSERT(!check_header_value_rfc9113(" !|}~"));
186   CU_ASSERT(!check_header_value_rfc9113("!|}~ "));
187   CU_ASSERT(!check_header_value_rfc9113("\t!|}~"));
188   CU_ASSERT(!check_header_value_rfc9113("!|}~\t"));
189   CU_ASSERT(check_header_value_rfc9113(goodval));
190   CU_ASSERT(!check_header_value_rfc9113(badval1));
191   CU_ASSERT(!check_header_value_rfc9113(badval2));
192   CU_ASSERT(check_header_value_rfc9113(""));
193   CU_ASSERT(!check_header_value_rfc9113(" "));
194   CU_ASSERT(!check_header_value_rfc9113("\t"));
195 }
196