blob: 6abd334e405177a13eac2aab72e70438fc3acb17 [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/elog.h>
39#include <vppinfra/error.h>
40#include <vppinfra/format.h>
41#include <vppinfra/random.h>
42#include <vppinfra/serialize.h>
43#include <vppinfra/unix.h>
44
Dave Barachc3799992016-08-15 11:12:27 -040045int
46test_elog_main (unformat_input_t * input)
Ed Warnickecb9cada2015-12-08 15:45:58 -070047{
Dave Barachc3799992016-08-15 11:12:27 -040048 clib_error_t *error = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070049 u32 i, n_iter, seed, max_events;
Dave Barachc3799992016-08-15 11:12:27 -040050 elog_main_t _em, *em = &_em;
Ed Warnickecb9cada2015-12-08 15:45:58 -070051 u32 verbose;
52 f64 min_sample_time;
Dave Barachc3799992016-08-15 11:12:27 -040053 char *dump_file, *load_file, *merge_file, **merge_files;
54 u8 *tag, **tags;
Dave Barach903fd512017-04-01 11:07:40 -040055 f64 align_tweak;
56 f64 *align_tweaks;
Ed Warnickecb9cada2015-12-08 15:45:58 -070057
58 n_iter = 100;
59 max_events = 100000;
60 seed = 1;
61 verbose = 0;
62 dump_file = 0;
63 load_file = 0;
64 merge_files = 0;
65 tags = 0;
Dave Barach903fd512017-04-01 11:07:40 -040066 align_tweaks = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070067 min_sample_time = 2;
68 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
69 {
70 if (unformat (input, "iter %d", &n_iter))
71 ;
72 else if (unformat (input, "seed %d", &seed))
73 ;
74 else if (unformat (input, "dump %s", &dump_file))
75 ;
76 else if (unformat (input, "load %s", &load_file))
77 ;
78 else if (unformat (input, "tag %s", &tag))
Dave Barachc3799992016-08-15 11:12:27 -040079 vec_add1 (tags, tag);
Ed Warnickecb9cada2015-12-08 15:45:58 -070080 else if (unformat (input, "merge %s", &merge_file))
81 vec_add1 (merge_files, merge_file);
82
83 else if (unformat (input, "verbose %=", &verbose, 1))
84 ;
85 else if (unformat (input, "max-events %d", &max_events))
86 ;
87 else if (unformat (input, "sample-time %f", &min_sample_time))
88 ;
Dave Barach903fd512017-04-01 11:07:40 -040089 else if (unformat (input, "align-tweak %f", &align_tweak))
90 vec_add1 (align_tweaks, align_tweak);
Ed Warnickecb9cada2015-12-08 15:45:58 -070091 else
92 {
93 error = clib_error_create ("unknown input `%U'\n",
94 format_unformat_error, input);
95 goto done;
96 }
97 }
98
99#ifdef CLIB_UNIX
100 if (load_file)
101 {
102 if ((error = elog_read_file (em, load_file)))
103 goto done;
104 }
105
106 else if (merge_files)
107 {
108 uword i;
Dave Barachc3799992016-08-15 11:12:27 -0400109 elog_main_t *ems;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700110 vec_clone (ems, merge_files);
111
Dave Barach903fd512017-04-01 11:07:40 -0400112 /* Supply default tags as needed */
113 if (vec_len (tags) < vec_len (ems))
114 {
115 for (i = vec_len (tags); i < vec_len (ems); i++)
116 vec_add1 (tags, format (0, "F%d%c", i, 0));
117 }
118
Ed Warnickecb9cada2015-12-08 15:45:58 -0700119 elog_init (em, max_events);
120 for (i = 0; i < vec_len (ems); i++)
121 {
Dave Barachc3799992016-08-15 11:12:27 -0400122 if ((error =
123 elog_read_file (i == 0 ? em : &ems[i], merge_files[i])))
Ed Warnickecb9cada2015-12-08 15:45:58 -0700124 goto done;
125 if (i > 0)
Dave Barachc3799992016-08-15 11:12:27 -0400126 {
Dave Barach903fd512017-04-01 11:07:40 -0400127 align_tweak = 0.0;
128 if (i <= vec_len (align_tweaks))
129 align_tweak = align_tweaks[i - 1];
130 elog_merge (em, tags[0], &ems[i], tags[i], align_tweak);
Dave Barachc3799992016-08-15 11:12:27 -0400131 tags[0] = 0;
132 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700133 }
134 }
135
136 else
137#endif /* CLIB_UNIX */
138 {
139 f64 t[2];
140
141 elog_init (em, max_events);
142 elog_enable_disable (em, 1);
143 t[0] = unix_time_now ();
144
145 for (i = 0; i < n_iter; i++)
146 {
147 u32 j, n, sum;
148
149 n = 1 + (random_u32 (&seed) % 128);
150 sum = 0;
151 for (j = 0; j < n; j++)
152 sum += random_u32 (&seed);
153
154 {
155 ELOG_TYPE_XF (e);
156 ELOG (em, e, sum);
157 }
158
159 {
160 ELOG_TYPE_XF (e);
161 ELOG (em, e, sum + 1);
162 }
163
164 {
Dave Barachc3799992016-08-15 11:12:27 -0400165 struct
166 {
167 u32 string_index;
168 f32 f;
169 } *d;
170 ELOG_TYPE_DECLARE (e) =
171 {
172 .format = "fumble %s %.9f",.format_args =
173 "t4f4",.n_enum_strings = 4,.enum_strings =
174 {
175 "string0", "string1", "string2", "string3",},};
Ed Warnickecb9cada2015-12-08 15:45:58 -0700176
177 d = ELOG_DATA (em, e);
178
179 d->string_index = sum & 3;
180 d->f = (sum & 0xff) / 128.;
181 }
Dave Barachc3799992016-08-15 11:12:27 -0400182
Ed Warnickecb9cada2015-12-08 15:45:58 -0700183 {
Dave Barachc3799992016-08-15 11:12:27 -0400184 ELOG_TYPE_DECLARE (e) =
185 {
186 .format = "bar %d.%d.%d.%d",.format_args = "i1i1i1i1",};
Ed Warnickecb9cada2015-12-08 15:45:58 -0700187 ELOG_TRACK (my_track);
Dave Barachc3799992016-08-15 11:12:27 -0400188 u8 *d = ELOG_TRACK_DATA (em, e, my_track);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700189 d[0] = i + 0;
190 d[1] = i + 1;
191 d[2] = i + 2;
192 d[3] = i + 3;
193 }
194
195 {
Dave Barachc3799992016-08-15 11:12:27 -0400196 ELOG_TYPE_DECLARE (e) =
197 {
198 .format = "bar `%s'",.format_args = "s20",};
199 struct
200 {
201 char s[20];
202 } *d;
203 u8 *v;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700204
205 d = ELOG_DATA (em, e);
206 v = format (0, "foo %d%c", i, 0);
Damjan Marionf1213b82016-03-13 02:22:06 +0100207 clib_memcpy (d->s, v, clib_min (vec_len (v), sizeof (d->s)));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700208 }
209
210 {
Dave Barachc3799992016-08-15 11:12:27 -0400211 ELOG_TYPE_DECLARE (e) =
212 {
213 .format = "bar `%s'",.format_args = "T4",};
214 struct
215 {
216 u32 offset;
217 } *d;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700218
219 d = ELOG_DATA (em, e);
220 d->offset = elog_string (em, "string table %d", i);
221 }
222 }
223
Dave Barachc3799992016-08-15 11:12:27 -0400224 do
225 {
226 t[1] = unix_time_now ();
227 }
228 while (t[1] - t[0] < min_sample_time);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700229 }
230
231#ifdef CLIB_UNIX
232 if (dump_file)
233 {
Dave Barach903fd512017-04-01 11:07:40 -0400234 if ((error =
235 elog_write_file (em, dump_file, 0 /* do not flush ring */ )))
Ed Warnickecb9cada2015-12-08 15:45:58 -0700236 goto done;
237 }
238#endif
239
240 if (verbose)
241 {
Dave Barachc3799992016-08-15 11:12:27 -0400242 elog_event_t *e, *es;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700243 es = elog_get_events (em);
244 vec_foreach (e, es)
Dave Barachc3799992016-08-15 11:12:27 -0400245 {
246 clib_warning ("%18.9f: %12U %U\n", e->time,
Florin Corasaefbede2018-12-19 13:07:49 -0800247 format_elog_track_name, em, e, format_elog_event, em,
248 e);
Dave Barachc3799992016-08-15 11:12:27 -0400249 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700250 }
251
Dave Barachc3799992016-08-15 11:12:27 -0400252done:
Ed Warnickecb9cada2015-12-08 15:45:58 -0700253 if (error)
254 clib_error_report (error);
255 return 0;
256}
257
258#ifdef CLIB_UNIX
Dave Barachc3799992016-08-15 11:12:27 -0400259int
260main (int argc, char *argv[])
Ed Warnickecb9cada2015-12-08 15:45:58 -0700261{
262 unformat_input_t i;
263 int r;
264
Dave Barach903fd512017-04-01 11:07:40 -0400265 clib_mem_init (0, 3ULL << 30);
266
Ed Warnickecb9cada2015-12-08 15:45:58 -0700267 unformat_init_command_line (&i, argv);
268 r = test_elog_main (&i);
269 unformat_free (&i);
270 return r;
271}
272#endif
Dave Barachc3799992016-08-15 11:12:27 -0400273
Dave Barach903fd512017-04-01 11:07:40 -0400274/**
275 * @brief GDB callable function: vl - Return vector length of vector
276 *
277 * @param *p - void - address of vector
278 *
279 * @return length - u32
280 *
281 */
282u32
283vl (void *p)
284{
285 return vec_len (p);
286}
287
288/**
289 * @brief GDB callable function: pe - call pool_elts - number of elements in a pool
290 *
291 * @param *v - void - address of pool
292 *
293 * @return number - uword
294 *
295 */
296#include <vppinfra/pool.h>
297uword
298pe (void *v)
299{
300 return (pool_elts (v));
301}
302
303#include <vppinfra/hash.h>
304uword
305he (void *v)
306{
307 return (hash_elts (v));
308}
309
Dave Barachc3799992016-08-15 11:12:27 -0400310/*
311 * fd.io coding-style-patch-verification: ON
312 *
313 * Local Variables:
314 * eval: (c-set-style "gnu")
315 * End:
316 */