blob: e00eec3268f498a6b566c473c843f8882ccae9eb [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001/*
2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15/*
16 Copyright (c) 2005 Eliot Dresselhaus
17
18 Permission is hereby granted, free of charge, to any person obtaining
19 a copy of this software and associated documentation files (the
20 "Software"), to deal in the Software without restriction, including
21 without limitation the rights to use, copy, modify, merge, publish,
22 distribute, sublicense, and/or sell copies of the Software, and to
23 permit persons to whom the Software is furnished to do so, subject to
24 the following conditions:
25
26 The above copyright notice and this permission notice shall be
27 included in all copies or substantial portions of the Software.
28
29 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36*/
37
38#include <vppinfra/format.h>
39#include <vppinfra/random.h>
40#include <vppinfra/serialize.h>
41#include <vppinfra/os.h>
42
43#define foreach_my_vector_type \
44 _ (u8, a8) \
45 _ (u16, a16) \
46 _ (u32, a32)
47
Dave Barachc3799992016-08-15 11:12:27 -040048typedef struct
49{
Ed Warnickecb9cada2015-12-08 15:45:58 -070050#define _(t,f) t f;
51 foreach_my_vector_type
52#undef _
53} my_vector_type_t;
54
Dave Barachc3799992016-08-15 11:12:27 -040055static void
56serialize_my_vector_type_single (serialize_main_t * m, va_list * va)
Ed Warnickecb9cada2015-12-08 15:45:58 -070057{
Dave Barachc3799992016-08-15 11:12:27 -040058 my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
Ed Warnickecb9cada2015-12-08 15:45:58 -070059 u32 n = va_arg (*va, u32);
60 u32 i;
61
62 for (i = 0; i < n; i++)
63 {
64#define _(t,f) serialize_integer (m, v[i].f, sizeof (v[i].f));
65 foreach_my_vector_type;
66 }
67#undef _
68}
69
Dave Barachc3799992016-08-15 11:12:27 -040070static void
71unserialize_my_vector_type_single (serialize_main_t * m, va_list * va)
Ed Warnickecb9cada2015-12-08 15:45:58 -070072{
Dave Barachc3799992016-08-15 11:12:27 -040073 my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
Ed Warnickecb9cada2015-12-08 15:45:58 -070074 u32 n = va_arg (*va, u32);
75 u32 i;
76
77 for (i = 0; i < n; i++)
78 {
79#define _(t,f) { u32 tmp; unserialize_integer (m, &tmp, sizeof (v[i].f)); v[i].f = tmp; }
80 foreach_my_vector_type;
81#undef _
82 }
83}
84
Dave Barachc3799992016-08-15 11:12:27 -040085static void
86serialize_my_vector_type_multiple (serialize_main_t * m, va_list * va)
Ed Warnickecb9cada2015-12-08 15:45:58 -070087{
Dave Barachc3799992016-08-15 11:12:27 -040088 my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
Ed Warnickecb9cada2015-12-08 15:45:58 -070089 u32 n = va_arg (*va, u32);
90
91#define _(t,f) \
92 serialize_multiple \
93 (m, \
94 &v[0].f, \
95 STRUCT_SIZE_OF (my_vector_type_t, f), \
96 STRUCT_STRIDE_OF (my_vector_type_t, f), \
97 n);
98
99 foreach_my_vector_type;
100
101#undef _
102}
103
Dave Barachc3799992016-08-15 11:12:27 -0400104static void
105unserialize_my_vector_type_multiple (serialize_main_t * m, va_list * va)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700106{
Dave Barachc3799992016-08-15 11:12:27 -0400107 my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700108 u32 n = va_arg (*va, u32);
109
110#define _(t,f) \
111 unserialize_multiple \
112 (m, \
113 &v[0].f, \
114 STRUCT_SIZE_OF (my_vector_type_t, f), \
115 STRUCT_STRIDE_OF (my_vector_type_t, f), \
116 n);
117
118 foreach_my_vector_type;
119
120#undef _
121}
122
Dave Barachc3799992016-08-15 11:12:27 -0400123typedef struct
124{
Ed Warnickecb9cada2015-12-08 15:45:58 -0700125 u32 n_iter;
126 u32 seed;
127 u32 verbose;
128 u32 multiple;
129 u32 max_len;
130
Dave Barachc3799992016-08-15 11:12:27 -0400131 my_vector_type_t **test_vectors;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700132
Dave Barachc3799992016-08-15 11:12:27 -0400133 char *dump_file;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700134
135 serialize_main_t serialize_main;
136 serialize_main_t unserialize_main;
137} test_serialize_main_t;
138
Dave Barachc3799992016-08-15 11:12:27 -0400139int
140test_serialize_main (unformat_input_t * input)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700141{
Dave Barachc3799992016-08-15 11:12:27 -0400142 clib_error_t *error = 0;
143 test_serialize_main_t _tm, *tm = &_tm;
144 serialize_main_t *sm = &tm->serialize_main;
145 serialize_main_t *um = &tm->unserialize_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700146 uword i;
147
148 memset (tm, 0, sizeof (tm[0]));
149 tm->n_iter = 100;
150 tm->seed = 1;
151 tm->max_len = 128;
152 tm->verbose = 0;
153 tm->multiple = 1;
154
155 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
156 {
157 if (unformat (input, "iter %d", &tm->n_iter))
158 ;
159 else if (unformat (input, "seed %d", &tm->seed))
160 ;
161 else if (unformat (input, "file %s", &tm->dump_file))
162 ;
163 else if (unformat (input, "max-len %d", &tm->max_len))
164 ;
165 else if (unformat (input, "multiple %=", &tm->multiple, 1))
166 ;
167 else if (unformat (input, "single %=", &tm->multiple, 0))
168 ;
169 else if (unformat (input, "verbose %=", &tm->verbose, 1))
170 ;
171 else
172 {
173 error = clib_error_create ("unknown input `%U'\n",
174 format_unformat_error, input);
175 goto done;
176 }
177 }
178
179 if (tm->seed == 0)
180 tm->seed = random_default_seed ();
181
Dave Barachc3799992016-08-15 11:12:27 -0400182 clib_warning ("iter %d seed %d max-len %d", tm->n_iter, tm->seed,
183 tm->max_len);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700184
185#ifdef CLIB_UNIX
186 if (tm->dump_file)
187 serialize_open_unix_file (sm, tm->dump_file);
188 else
189#endif
190 serialize_open_vector (sm, 0);
191
192 vec_resize (tm->test_vectors, tm->n_iter);
193 for (i = 0; i < tm->n_iter; i++)
194 {
195 uword l = 1 + (random_u32 (&tm->seed) % tm->max_len);
Dave Barachc3799992016-08-15 11:12:27 -0400196 my_vector_type_t *mv;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700197
198 vec_resize (tm->test_vectors[i], l);
199 vec_foreach (mv, tm->test_vectors[i])
Dave Barachc3799992016-08-15 11:12:27 -0400200 {
Ed Warnickecb9cada2015-12-08 15:45:58 -0700201#define _(t,f) mv->f = random_u32 (&tm->seed) & pow2_mask (31);
Dave Barachc3799992016-08-15 11:12:27 -0400202 foreach_my_vector_type;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700203#undef _
Dave Barachc3799992016-08-15 11:12:27 -0400204 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700205
206 vec_serialize (sm, tm->test_vectors[i],
Dave Barachc3799992016-08-15 11:12:27 -0400207 tm->multiple ? serialize_my_vector_type_multiple :
208 serialize_my_vector_type_single);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700209 }
210
211 if (tm->verbose)
Dave Barachc3799992016-08-15 11:12:27 -0400212 clib_warning ("overflow vector max bytes %d",
213 vec_max_len (sm->stream.overflow_buffer));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700214
215 serialize_close (sm);
216
217#ifdef CLIB_UNIX
218 if (tm->dump_file)
219 {
220 if ((error = unserialize_open_unix_file (um, tm->dump_file)))
221 goto done;
222 }
223 else
224#endif
225 {
Dave Barachc3799992016-08-15 11:12:27 -0400226 u8 *v = serialize_close_vector (sm);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700227 unserialize_open_data (um, v, vec_len (v));
228 }
229
230 for (i = 0; i < tm->n_iter; i++)
231 {
Dave Barachc3799992016-08-15 11:12:27 -0400232 my_vector_type_t *mv0;
233 my_vector_type_t *mv1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700234
235 vec_unserialize (um, &mv0,
Dave Barachc3799992016-08-15 11:12:27 -0400236 tm->multiple ? unserialize_my_vector_type_multiple :
237 unserialize_my_vector_type_single);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700238 mv1 = tm->test_vectors[i];
239
240 if (vec_len (mv0) != vec_len (mv1))
241 os_panic ();
242 if (memcmp (mv0, mv1, vec_len (mv0) * sizeof (mv0[0])))
243 os_panic ();
244
245 vec_free (mv0);
246 }
247
Dave Barachc3799992016-08-15 11:12:27 -0400248done:
Ed Warnickecb9cada2015-12-08 15:45:58 -0700249 if (error)
250 clib_error_report (error);
251 return 0;
252}
253
254#ifdef CLIB_UNIX
Dave Barachc3799992016-08-15 11:12:27 -0400255int
256main (int argc, char *argv[])
Ed Warnickecb9cada2015-12-08 15:45:58 -0700257{
258 unformat_input_t i;
259 int r;
260
261 unformat_init_command_line (&i, argv);
262 r = test_serialize_main (&i);
263 unformat_free (&i);
264 return r;
265}
266#endif
Dave Barachc3799992016-08-15 11:12:27 -0400267
268/*
269 * fd.io coding-style-patch-verification: ON
270 *
271 * Local Variables:
272 * eval: (c-set-style "gnu")
273 * End:
274 */