tizen 2.4 release
[external/nghttp2.git] / tests / nghttp2_helper_test.c
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 <CUnit/CUnit.h>
28
29 #include "nghttp2_helper.h"
30
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;
35   int32_t delta;
36
37   delta = 0;
38   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
39                                                   &recv_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);
45
46   delta = 49;
47   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
48                                                   &recv_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);
54
55   delta = 1;
56   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
57                                                   &recv_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);
63
64   delta = 1;
65   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
66                                                   &recv_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);
72
73   delta = -1;
74   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
75                                                   &recv_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);
81
82   delta = 1;
83   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
84                                                   &recv_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);
90
91   delta = 100;
92   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
93                                                   &recv_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);
99
100   delta = -3;
101   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
102                                                   &recv_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);
108
109   recv_window_size += 3;
110
111   delta = 3;
112   CU_ASSERT(0 == nghttp2_adjust_local_window_size(&local_window_size,
113                                                   &recv_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);
119
120   local_window_size = 100;
121   recv_window_size = 50;
122   recv_reduction = 0;
123   delta = INT32_MAX;
124   CU_ASSERT(NGHTTP2_ERR_FLOW_CONTROL ==
125             nghttp2_adjust_local_window_size(&local_window_size,
126                                              &recv_window_size, &recv_reduction,
127                                              &delta));
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);
132
133   delta = INT32_MIN;
134   CU_ASSERT(NGHTTP2_ERR_FLOW_CONTROL ==
135             nghttp2_adjust_local_window_size(&local_window_size,
136                                              &recv_window_size, &recv_reduction,
137                                              &delta));
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);
142 }
143
144 #define check_header_name(S)                                                   \
145   nghttp2_check_header_name((const uint8_t *)S, sizeof(S) - 1)
146
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(":"));
155 }
156
157 #define check_header_value(S)                                                  \
158   nghttp2_check_header_value((const uint8_t *)S, sizeof(S) - 1)
159
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'};
164
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));
169 }