source: mainline/uspace/srv/net/tcp/test/segment.c@ 3f932a7e

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 3f932a7e was 3f932a7e, checked in by Jiri Svoboda <jiri@…>, 7 years ago

PCUT_INIT declaration also needs a terminating semicolon.

  • Property mode set to 100644
File size: 5.7 KB
Line 
1/*
2 * Copyright (c) 2017 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <pcut/pcut.h>
30
31#include "main.h"
32#include "../segment.h"
33
34PCUT_INIT;
35
36PCUT_TEST_SUITE(segment);
37
38/** Test create/destroy control segment */
39PCUT_TEST(ctrl_seg_mkdel)
40{
41 tcp_segment_t *seg;
42
43 seg = tcp_segment_make_ctrl(CTL_SYN);
44 PCUT_ASSERT_NOT_NULL(seg);
45 tcp_segment_delete(seg);
46}
47
48/** Test create/destroy data segment */
49PCUT_TEST(data_seg_mkdel)
50{
51 tcp_segment_t *seg;
52 uint8_t *data;
53 size_t i, dsize;
54
55 dsize = 15;
56 data = malloc(dsize);
57 PCUT_ASSERT_NOT_NULL(data);
58
59 for (i = 0; i < dsize; i++)
60 data[i] = (uint8_t) i;
61
62 seg = tcp_segment_make_data(CTL_SYN, data, dsize);
63 PCUT_ASSERT_NOT_NULL(seg);
64
65 tcp_segment_delete(seg);
66 free(data);
67}
68
69/** Test create/duplicate/destroy control segment */
70PCUT_TEST(ctrl_seg_dup)
71{
72 tcp_segment_t *seg, *dup;
73
74 seg = tcp_segment_make_ctrl(CTL_SYN);
75 PCUT_ASSERT_NOT_NULL(seg);
76
77 seg->seq = 20;
78 seg->ack = 19;
79 seg->wnd = 18;
80 seg->up = 17;
81
82 dup = tcp_segment_dup(seg);
83 test_seg_same(seg, dup);
84
85 tcp_segment_delete(seg);
86 tcp_segment_delete(dup);
87}
88
89/** Test create/duplicate/destroy data segment */
90PCUT_TEST(data_seg_dup)
91{
92 tcp_segment_t *seg, *dup;
93 uint8_t *data;
94 size_t i, dsize;
95
96 dsize = 15;
97 data = malloc(dsize);
98 PCUT_ASSERT_NOT_NULL(data);
99
100 for (i = 0; i < dsize; i++)
101 data[i] = (uint8_t) i;
102
103 seg = tcp_segment_make_data(CTL_SYN, data, dsize);
104 PCUT_ASSERT_NOT_NULL(seg);
105
106 seg->seq = 20;
107 seg->ack = 19;
108 seg->wnd = 18;
109 seg->up = 17;
110
111 dup = tcp_segment_dup(seg);
112 test_seg_same(seg, dup);
113
114 tcp_segment_delete(seg);
115 tcp_segment_delete(dup);
116 free(data);
117}
118
119/** Test reset segment for segment with ACK not set */
120PCUT_TEST(noack_seg_rst)
121{
122 tcp_segment_t *seg, *rst;
123
124 seg = tcp_segment_make_ctrl(CTL_SYN);
125 PCUT_ASSERT_NOT_NULL(seg);
126
127 seg->seq = 20;
128 seg->ack = 19;
129 seg->wnd = 18;
130 seg->up = 17;
131
132 rst = tcp_segment_make_rst(seg);
133 PCUT_ASSERT_NOT_NULL(seg);
134
135 tcp_segment_delete(seg);
136 tcp_segment_delete(rst);
137}
138
139/** Test reset segment for segment with ACK set */
140PCUT_TEST(ack_seg_rst)
141{
142 tcp_segment_t *seg, *rst;
143
144 seg = tcp_segment_make_ctrl(CTL_SYN | CTL_ACK);
145 PCUT_ASSERT_NOT_NULL(seg);
146
147 seg->seq = 20;
148 seg->ack = 19;
149 seg->wnd = 18;
150 seg->up = 17;
151
152 rst = tcp_segment_make_rst(seg);
153 PCUT_ASSERT_NOT_NULL(seg);
154
155 tcp_segment_delete(seg);
156 tcp_segment_delete(rst);
157}
158
159/** Test copying out data segment text */
160PCUT_TEST(data_seg_text)
161{
162 tcp_segment_t *seg;
163 uint8_t *data;
164 uint8_t *cdata;
165 size_t i, dsize;
166
167 dsize = 15;
168 data = malloc(dsize);
169 PCUT_ASSERT_NOT_NULL(data);
170 cdata = malloc(dsize);
171 PCUT_ASSERT_NOT_NULL(cdata);
172
173 for (i = 0; i < dsize; i++)
174 data[i] = (uint8_t) i;
175
176 seg = tcp_segment_make_data(CTL_SYN, data, dsize);
177 PCUT_ASSERT_NOT_NULL(seg);
178
179 PCUT_ASSERT_INT_EQUALS(dsize, tcp_segment_text_size(seg));
180 tcp_segment_text_copy(seg, cdata, dsize);
181
182 for (i = 0; i < dsize; i++)
183 PCUT_ASSERT_INT_EQUALS(data[i], cdata[i]);
184
185 tcp_segment_delete(seg);
186 free(data);
187 free(cdata);
188}
189
190/** Test trimming data segment text */
191PCUT_TEST(data_seg_trim)
192{
193 tcp_segment_t *seg;
194 uint8_t *data;
195 uint8_t *cdata;
196 size_t i, dsize;
197
198 dsize = 15;
199 data = malloc(dsize);
200 PCUT_ASSERT_NOT_NULL(data);
201 cdata = malloc(dsize);
202 PCUT_ASSERT_NOT_NULL(cdata);
203
204 for (i = 0; i < dsize; i++)
205 data[i] = (uint8_t) i;
206
207 seg = tcp_segment_make_data(CTL_SYN | CTL_FIN, data, dsize);
208 PCUT_ASSERT_NOT_NULL(seg);
209
210 PCUT_ASSERT_INT_EQUALS(dsize, tcp_segment_text_size(seg));
211 tcp_segment_text_copy(seg, cdata, dsize);
212
213 for (i = 0; i < dsize; i++)
214 PCUT_ASSERT_INT_EQUALS(data[i], cdata[i]);
215
216 PCUT_ASSERT_INT_EQUALS(CTL_SYN | CTL_FIN, seg->ctrl);
217
218 tcp_segment_trim(seg, 1, 0);
219 PCUT_ASSERT_INT_EQUALS(CTL_FIN, seg->ctrl);
220 PCUT_ASSERT_INT_EQUALS(dsize, tcp_segment_text_size(seg));
221
222 tcp_segment_trim(seg, 0, 1);
223 PCUT_ASSERT_INT_EQUALS(0, seg->ctrl);
224 PCUT_ASSERT_INT_EQUALS(dsize, tcp_segment_text_size(seg));
225
226 tcp_segment_trim(seg, 1, 0);
227 PCUT_ASSERT_INT_EQUALS(0, seg->ctrl);
228 PCUT_ASSERT_INT_EQUALS(dsize - 1, tcp_segment_text_size(seg));
229
230 tcp_segment_text_copy(seg, cdata, dsize - 1);
231 for (i = 0; i < dsize - 1; i++)
232 PCUT_ASSERT_INT_EQUALS(data[i + 1], cdata[i]);
233
234 tcp_segment_trim(seg, 0, 1);
235 PCUT_ASSERT_INT_EQUALS(0, seg->ctrl);
236 PCUT_ASSERT_INT_EQUALS(dsize - 2, tcp_segment_text_size(seg));
237
238 tcp_segment_text_copy(seg, cdata, dsize - 2);
239 for (i = 0; i < dsize - 2; i++)
240 PCUT_ASSERT_INT_EQUALS(data[i + 1], cdata[i]);
241
242 tcp_segment_delete(seg);
243 free(data);
244 free(cdata);
245}
246
247PCUT_EXPORT(segment);
Note: See TracBrowser for help on using the repository browser.