Branch data Line data Source code
1 : : /*
2 : : * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
3 : : *
4 : : * Licensed under the Apache License, Version 2.0 (the "License");
5 : : * you may not use this file except in compliance with the License.
6 : : * You may obtain a copy of the License at:
7 : : *
8 : : * http://www.apache.org/licenses/LICENSE-2.0
9 : : *
10 : : * Unless required by applicable law or agreed to in writing, software
11 : : * distributed under the License is distributed on an "AS IS" BASIS,
12 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : : * See the License for the specific language governing permissions and
14 : : * limitations under the License.
15 : : */
16 : :
17 : : #include <config.h>
18 : : #undef NDEBUG
19 : : #include "util.h"
20 : : #include <assert.h>
21 : : #include <getopt.h>
22 : : #include <inttypes.h>
23 : : #include <limits.h>
24 : : #include <stdio.h>
25 : : #include <stdlib.h>
26 : : #include "byte-order.h"
27 : : #include "command-line.h"
28 : : #include "ovstest.h"
29 : : #include "random.h"
30 : : #include "openvswitch/vlog.h"
31 : :
32 : : static void
33 : 96 : check_log_2_floor(uint32_t x, int n)
34 : : {
35 [ - + ]: 96 : if (log_2_floor(x) != n) {
36 : 0 : fprintf(stderr, "log_2_floor(%"PRIu32") is %d but should be %d\n",
37 : : x, log_2_floor(x), n);
38 : 0 : abort();
39 : : }
40 : 96 : }
41 : :
42 : : static void
43 : 1 : test_log_2_floor(struct ovs_cmdl_context *ctx OVS_UNUSED)
44 : : {
45 : : int n;
46 : :
47 [ + + ]: 33 : for (n = 0; n < 32; n++) {
48 : : /* Check minimum x such that f(x) == n. */
49 : 32 : check_log_2_floor(1 << n, n);
50 : :
51 : : /* Check maximum x such that f(x) == n. */
52 : 32 : check_log_2_floor((1 << n) | ((1 << n) - 1), n);
53 : :
54 : : /* Check a random value in the middle. */
55 : 32 : check_log_2_floor((random_uint32() & ((1 << n) - 1)) | (1 << n), n);
56 : : }
57 : :
58 : : /* log_2_floor(0) is undefined, so don't check it. */
59 : 1 : }
60 : :
61 : : static void
62 : 97 : check_ctz32(uint32_t x, int n)
63 : : {
64 [ - + ]: 97 : if (ctz32(x) != n) {
65 : 0 : fprintf(stderr, "ctz32(%"PRIu32") is %d but should be %d\n",
66 : : x, ctz32(x), n);
67 : 0 : abort();
68 : : }
69 : 97 : }
70 : :
71 : : static void
72 : 193 : check_ctz64(uint64_t x, int n)
73 : : {
74 [ - + ]: 193 : if (ctz64(x) != n) {
75 : 0 : fprintf(stderr, "ctz64(%"PRIu64") is %d but should be %d\n",
76 : : x, ctz64(x), n);
77 : 0 : abort();
78 : : }
79 : 193 : }
80 : :
81 : : static void
82 : 1 : test_ctz(struct ovs_cmdl_context *ctx OVS_UNUSED)
83 : : {
84 : : int n;
85 : :
86 [ + + ]: 33 : for (n = 0; n < 32; n++) {
87 : : /* Check minimum x such that f(x) == n. */
88 : 32 : check_ctz32(1 << n, n);
89 : :
90 : : /* Check maximum x such that f(x) == n. */
91 : 32 : check_ctz32(UINT32_MAX << n, n);
92 : :
93 : : /* Check a random value in the middle. */
94 : 32 : check_ctz32((random_uint32() | 1) << n, n);
95 : : }
96 : :
97 : :
98 [ + + ]: 65 : for (n = 0; n < 64; n++) {
99 : : /* Check minimum x such that f(x) == n. */
100 : 64 : check_ctz64(UINT64_C(1) << n, n);
101 : :
102 : : /* Check maximum x such that f(x) == n. */
103 : 64 : check_ctz64(UINT64_MAX << n, n);
104 : :
105 : : /* Check a random value in the middle. */
106 : 64 : check_ctz64((random_uint64() | UINT64_C(1)) << n, n);
107 : : }
108 : :
109 : : /* Check ctz(0). */
110 : 1 : check_ctz32(0, 32);
111 : 1 : check_ctz64(0, 64);
112 : 1 : }
113 : :
114 : : static void
115 : 97 : check_clz32(uint32_t x, int n)
116 : : {
117 [ - + ]: 97 : if (clz32(x) != n) {
118 : 0 : fprintf(stderr, "clz32(%"PRIu32") is %d but should be %d\n",
119 : : x, clz32(x), n);
120 : 0 : abort();
121 : : }
122 : 97 : }
123 : :
124 : : static void
125 : 193 : check_clz64(uint64_t x, int n)
126 : : {
127 [ - + ]: 193 : if (clz64(x) != n) {
128 : 0 : fprintf(stderr, "clz64(%"PRIu64") is %d but should be %d\n",
129 : : x, clz64(x), n);
130 : 0 : abort();
131 : : }
132 : 193 : }
133 : :
134 : : static void
135 : 1 : test_clz(struct ovs_cmdl_context *ctx OVS_UNUSED)
136 : : {
137 : : int n;
138 : :
139 [ + + ]: 33 : for (n = 0; n < 32; n++) {
140 : : /* Check minimum x such that f(x) == n. */
141 : 32 : check_clz32((1u << 31) >> n, n);
142 : :
143 : : /* Check maximum x such that f(x) == n. */
144 : 32 : check_clz32(UINT32_MAX >> n, n);
145 : :
146 : : /* Check a random value in the middle. */
147 : 32 : check_clz32((random_uint32() | 1u << 31) >> n, n);
148 : : }
149 : :
150 [ + + ]: 65 : for (n = 0; n < 64; n++) {
151 : : /* Check minimum x such that f(x) == n. */
152 : 64 : check_clz64((UINT64_C(1) << 63) >> n, n);
153 : :
154 : : /* Check maximum x such that f(x) == n. */
155 : 64 : check_clz64(UINT64_MAX >> n, n);
156 : :
157 : : /* Check a random value in the middle. */
158 : 64 : check_clz64((random_uint64() | UINT64_C(1) << 63) >> n, n);
159 : : }
160 : :
161 : : /* Check clz(0). */
162 : 1 : check_clz32(0, 32);
163 : 1 : check_clz64(0, 64);
164 : 1 : }
165 : :
166 : : /* Returns a random number in the range 'min'...'max' inclusive. */
167 : : static uint32_t
168 : 64 : random_in_range(uint32_t min, uint32_t max)
169 : : {
170 [ + + ]: 64 : return min == max ? min : min + random_range(max - min + 1);
171 : : }
172 : :
173 : : static void
174 : 97 : check_rup2(uint32_t x, int n)
175 : : {
176 : 97 : uint32_t rup2 = ROUND_UP_POW2(x);
177 [ - + ]: 97 : if (rup2 != n) {
178 : 0 : fprintf(stderr, "ROUND_UP_POW2(%#"PRIx32") is %#"PRIx32" "
179 : : "but should be %#"PRIx32"\n", x, rup2, n);
180 : 0 : abort();
181 : : }
182 : 97 : }
183 : :
184 : : static void
185 : 1 : test_round_up_pow2(struct ovs_cmdl_context *ctx OVS_UNUSED)
186 : : {
187 : : int n;
188 : :
189 [ + + ]: 33 : for (n = 0; n < 32; n++) {
190 : : /* Min, max value for which ROUND_UP_POW2 should yield (1 << n). */
191 : 32 : uint32_t min = ((1u << n) >> 1) + 1;
192 : 32 : uint32_t max = 1u << n;
193 : :
194 : 32 : check_rup2(min, 1u << n);
195 : 32 : check_rup2(max, 1u << n);
196 : 32 : check_rup2(random_in_range(min, max), 1u << n);
197 : : }
198 : 1 : check_rup2(0, 0);
199 : 1 : }
200 : :
201 : : static void
202 : 97 : check_rdp2(uint32_t x, int n)
203 : : {
204 : 97 : uint32_t rdp2 = ROUND_DOWN_POW2(x);
205 [ - + ]: 97 : if (rdp2 != n) {
206 : 0 : fprintf(stderr, "ROUND_DOWN_POW2(%#"PRIx32") is %#"PRIx32" "
207 : : "but should be %#"PRIx32"\n", x, rdp2, n);
208 : 0 : abort();
209 : : }
210 : 97 : }
211 : :
212 : : static void
213 : 1 : test_round_down_pow2(struct ovs_cmdl_context *ctx OVS_UNUSED)
214 : : {
215 : : int n;
216 : :
217 [ + + ]: 33 : for (n = 0; n < 32; n++) {
218 : : /* Min, max value for which ROUND_DOWN_POW2 should yield (1 << n). */
219 : 32 : uint32_t min = 1u << n;
220 : 32 : uint32_t max = ((1u << n) << 1) - 1;
221 : :
222 : 32 : check_rdp2(min, 1u << n);
223 : 32 : check_rdp2(max, 1u << n);
224 : 32 : check_rdp2(random_in_range(min, max), 1u << n);
225 : : }
226 : 1 : check_rdp2(0, 0);
227 : 1 : }
228 : :
229 : : static void
230 : 2000 : shuffle(uint64_t *p, size_t n)
231 : : {
232 [ + + ]: 128000 : for (; n > 1; n--, p++) {
233 : 126000 : uint64_t *q = &p[random_range(n)];
234 : 126000 : uint64_t tmp = *p;
235 : 126000 : *p = *q;
236 : 126000 : *q = tmp;
237 : : }
238 : 2000 : }
239 : :
240 : : static void
241 : 128001 : check_count_1bits(uint64_t x, int n)
242 : : {
243 [ - + ]: 128001 : if (count_1bits(x) != n) {
244 : 0 : fprintf(stderr, "count_1bits(%#"PRIx64") is %d but should be %d\n",
245 : : x, count_1bits(x), n);
246 : 0 : abort();
247 : : }
248 : 128001 : }
249 : :
250 : : static void
251 : 1 : test_count_1bits(struct ovs_cmdl_context *ctx OVS_UNUSED)
252 : : {
253 : : uint64_t bits[64];
254 : : int i;
255 : :
256 [ + + ]: 65 : for (i = 0; i < ARRAY_SIZE(bits); i++) {
257 : 64 : bits[i] = UINT64_C(1) << i;
258 : : }
259 : :
260 : 1 : check_count_1bits(0, 0);
261 : :
262 [ + + ]: 1001 : for (i = 0; i < 1000; i++) {
263 : 1000 : uint64_t x = 0;
264 : : int j;
265 : :
266 : 1000 : shuffle(bits, ARRAY_SIZE(bits));
267 [ + + ]: 65000 : for (j = 0; j < 64; j++) {
268 : 64000 : x |= bits[j];
269 : 64000 : check_count_1bits(x, j + 1);
270 : : }
271 [ - + ]: 1000 : assert(x == UINT64_MAX);
272 : :
273 : 1000 : shuffle(bits, ARRAY_SIZE(bits));
274 [ + + ]: 65000 : for (j = 63; j >= 0; j--) {
275 : 64000 : x &= ~bits[j];
276 : 64000 : check_count_1bits(x, j);
277 : : }
278 [ - + ]: 1000 : assert(x == 0);
279 : : }
280 : 1 : }
281 : :
282 : : /* Returns the sum of the squares of the first 'n' positive integers. */
283 : : static unsigned int
284 : 1 : sum_of_squares(int n)
285 : : {
286 : 1 : return n * (n + 1) * (2 * n + 1) / 6;
287 : : }
288 : :
289 : : static void
290 : 1 : test_bitwise_copy(struct ovs_cmdl_context *ctx OVS_UNUSED)
291 : : {
292 : : unsigned int n_loops;
293 : : int src_ofs;
294 : : int dst_ofs;
295 : : int n_bits;
296 : :
297 : 1 : n_loops = 0;
298 [ + + ]: 66 : for (n_bits = 0; n_bits <= 64; n_bits++) {
299 [ + + ]: 2145 : for (src_ofs = 0; src_ofs < 64 - n_bits; src_ofs++) {
300 [ + + ]: 91520 : for (dst_ofs = 0; dst_ofs < 64 - n_bits; dst_ofs++) {
301 : 89440 : ovs_be64 src = htonll(random_uint64());
302 : 89440 : ovs_be64 dst = htonll(random_uint64());
303 : 89440 : ovs_be64 orig_dst = dst;
304 : : ovs_be64 expect;
305 : :
306 [ - + ]: 89440 : if (n_bits == 64) {
307 : 0 : expect = dst;
308 : : } else {
309 : 89440 : uint64_t mask = (UINT64_C(1) << n_bits) - 1;
310 : 89440 : expect = orig_dst & ~htonll(mask << dst_ofs);
311 : 89440 : expect |= htonll(((ntohll(src) >> src_ofs) & mask)
312 : : << dst_ofs);
313 : : }
314 : :
315 : 89440 : bitwise_copy(&src, sizeof src, src_ofs,
316 : : &dst, sizeof dst, dst_ofs,
317 : : n_bits);
318 [ - + ]: 89440 : if (expect != dst) {
319 : 0 : fprintf(stderr,"copy_bits(0x%016"PRIx64",8,%d, "
320 : : "0x%016"PRIx64",8,%d, %d) yielded 0x%016"PRIx64" "
321 : : "instead of the expected 0x%016"PRIx64"\n",
322 : : ntohll(src), src_ofs,
323 : : ntohll(orig_dst), dst_ofs,
324 : : n_bits,
325 : : ntohll(dst), ntohll(expect));
326 : 0 : abort();
327 : : }
328 : :
329 : 89440 : n_loops++;
330 : : }
331 : : }
332 : : }
333 : :
334 [ - + ]: 1 : if (n_loops != sum_of_squares(64)) {
335 : 0 : abort();
336 : : }
337 : 1 : }
338 : :
339 : : static void
340 : 1 : test_bitwise_zero(struct ovs_cmdl_context *ctx OVS_UNUSED)
341 : : {
342 : : unsigned int n_loops;
343 : : int dst_ofs;
344 : : int n_bits;
345 : :
346 : 1 : n_loops = 0;
347 [ + + ]: 66 : for (n_bits = 0; n_bits <= 64; n_bits++) {
348 [ + + ]: 2145 : for (dst_ofs = 0; dst_ofs < 64 - n_bits; dst_ofs++) {
349 : 2080 : ovs_be64 dst = htonll(random_uint64());
350 : 2080 : ovs_be64 orig_dst = dst;
351 : : ovs_be64 expect;
352 : :
353 [ - + ]: 2080 : if (n_bits == 64) {
354 : 0 : expect = htonll(0);
355 : : } else {
356 : 2080 : uint64_t mask = (UINT64_C(1) << n_bits) - 1;
357 : 2080 : expect = orig_dst & ~htonll(mask << dst_ofs);
358 : : }
359 : :
360 : 2080 : bitwise_zero(&dst, sizeof dst, dst_ofs, n_bits);
361 [ - + ]: 2080 : if (expect != dst) {
362 : 0 : fprintf(stderr,"bitwise_zero(0x%016"PRIx64",8,%d, %d) "
363 : : "yielded 0x%016"PRIx64" "
364 : : "instead of the expected 0x%016"PRIx64"\n",
365 : : ntohll(orig_dst), dst_ofs,
366 : : n_bits,
367 : : ntohll(dst), ntohll(expect));
368 : 0 : abort();
369 : : }
370 : :
371 : 2080 : n_loops++;
372 : : }
373 : : }
374 : :
375 [ - + ]: 1 : if (n_loops != 64 * (64 + 1) / 2) {
376 : 0 : abort();
377 : : }
378 : 1 : }
379 : :
380 : : static void
381 : 1 : test_bitwise_one(struct ovs_cmdl_context *ctx OVS_UNUSED)
382 : : {
383 : : unsigned int n_loops;
384 : : int dst_ofs;
385 : : int n_bits;
386 : :
387 : 1 : n_loops = 0;
388 [ + + ]: 66 : for (n_bits = 0; n_bits <= 64; n_bits++) {
389 [ + + ]: 2145 : for (dst_ofs = 0; dst_ofs < 64 - n_bits; dst_ofs++) {
390 : 2080 : ovs_be64 dst = htonll(random_uint64());
391 : 2080 : ovs_be64 orig_dst = dst;
392 : : ovs_be64 expect;
393 : :
394 [ - + ]: 2080 : if (n_bits == 64) {
395 : 0 : expect = OVS_BE64_MAX;
396 : : } else {
397 : 2080 : uint64_t mask = (UINT64_C(1) << n_bits) - 1;
398 : 2080 : expect = orig_dst | htonll(mask << dst_ofs);
399 : : }
400 : :
401 : 2080 : bitwise_one(&dst, sizeof dst, dst_ofs, n_bits);
402 [ - + ]: 2080 : if (expect != dst) {
403 : 0 : fprintf(stderr,"bitwise_one(0x%016"PRIx64",8,%d, %d) "
404 : : "yielded 0x%016"PRIx64" "
405 : : "instead of the expected 0x%016"PRIx64"\n",
406 : : ntohll(orig_dst), dst_ofs,
407 : : n_bits,
408 : : ntohll(dst), ntohll(expect));
409 : 0 : abort();
410 : : }
411 : :
412 : 2080 : n_loops++;
413 : : }
414 : : }
415 : :
416 [ - + ]: 1 : if (n_loops != 64 * (64 + 1) / 2) {
417 : 0 : abort();
418 : : }
419 : 1 : }
420 : :
421 : : static void
422 : 1 : test_bitwise_is_all_zeros(struct ovs_cmdl_context *ctx OVS_UNUSED)
423 : : {
424 : : int n_loops;
425 : :
426 [ + + ]: 101 : for (n_loops = 0; n_loops < 100; n_loops++) {
427 : 100 : ovs_be64 x = htonll(0);
428 : : int i;
429 : :
430 [ + + ]: 6500 : for (i = 0; i < 64; i++) {
431 : : ovs_be64 bit;
432 : : int ofs, n;
433 : :
434 : : /* Change a random 0-bit into a 1-bit. */
435 : : do {
436 : 31644 : bit = htonll(UINT64_C(1) << (random_range(64)));
437 [ + + ]: 31644 : } while (x & bit);
438 : 6400 : x |= bit;
439 : :
440 [ + + ]: 416000 : for (ofs = 0; ofs < 64; ofs++) {
441 [ + + ]: 14131200 : for (n = 0; n <= 64 - ofs; n++) {
442 : : bool expect;
443 : : bool answer;
444 : :
445 : 13721600 : expect = (n == 64
446 : : ? x == 0
447 [ + + ]: 13721600 : : !(x & htonll(((UINT64_C(1) << n) - 1)
448 : : << ofs)));
449 : 13721600 : answer = bitwise_is_all_zeros(&x, sizeof x, ofs, n);
450 [ - + ]: 13721600 : if (expect != answer) {
451 [ # # ][ # # ]: 0 : fprintf(stderr,
452 : : "bitwise_is_all_zeros(0x%016"PRIx64",8,%d,%d "
453 : : "returned %s instead of %s\n",
454 : : ntohll(x), ofs, n,
455 : : answer ? "true" : "false",
456 : : expect ? "true" : "false");
457 : 0 : abort();
458 : : }
459 : : }
460 : : }
461 : : }
462 : : }
463 : 1 : }
464 : :
465 : : static int
466 : 27456000 : trivial_bitwise_rscan(const void *p, unsigned int len, bool target,
467 : : int start, int end)
468 : : {
469 : : int ofs;
470 : :
471 [ + + ]: 89869341 : for (ofs = start; ofs > end; ofs--) {
472 [ + + ]: 86846964 : if (bitwise_get_bit(p, len, ofs) == target) {
473 : 24433623 : break;
474 : : }
475 : : }
476 : 27456000 : return ofs;
477 : : }
478 : :
479 : : static void
480 : 1 : test_bitwise_rscan(struct ovs_cmdl_context *ctx OVS_UNUSED)
481 : : {
482 : : /* All 1s */
483 : 1 : uint8_t s1[3] = {0xff, 0xff, 0xff};
484 : : /* Target is the first bit */
485 [ - + ]: 1 : ovs_assert(23 == bitwise_rscan(s1, 3, 1, 23, -1));
486 : : /* Target is not found, return -1 */
487 [ - + ]: 1 : ovs_assert(-1 == bitwise_rscan(s1, 3, 0, 23, -1));
488 : : /* Target is not found and end != -1, return end */
489 [ - + ]: 1 : ovs_assert(20 == bitwise_rscan(s1, 3, 0, 23, 20));
490 : :
491 : : /* bit 20 - 23 are 0s */
492 : 1 : uint8_t s2[3] = {0x0f, 0xff, 0xff};
493 : : /* Target is in the first byte but not the first bit */
494 [ - + ]: 1 : ovs_assert(19 == bitwise_rscan(s2, 3, 1, 23, -1));
495 : : /* Target exists before the start postion */
496 [ - + ]: 1 : ovs_assert(18 == bitwise_rscan(s2, 3, 1, 18, -1));
497 : : /* Target exists after the end postion, return end */
498 [ - + ]: 1 : ovs_assert(20 == bitwise_rscan(s2, 3, 1, 23, 20));
499 : : /* Target is at the end postion, return end */
500 [ - + ]: 1 : ovs_assert(19 == bitwise_rscan(s2, 3, 1, 23, 19));
501 : : /* start == end, target at start */
502 [ - + ]: 1 : ovs_assert(19 == bitwise_rscan(s2, 3, 1, 19, 19));
503 : : /* start == end, target not at start */
504 [ - + ]: 1 : ovs_assert(20 == bitwise_rscan(s2, 3, 1, 20, 20));
505 : : /* Target is 0 ... */
506 [ - + ]: 1 : ovs_assert(22 == bitwise_rscan(s2, 3, 0, 22, -1));
507 : :
508 : : /* bit 4 - 23 are 0s */
509 : 1 : uint8_t s3[3] = {0x00, 0x00, 0x0f};
510 : : /* Target is in the end byte */
511 [ - + ]: 1 : ovs_assert(3 == bitwise_rscan(s3, 3, 1, 16, -1));
512 : : /* Target exists after the end byte, return end */
513 [ - + ]: 1 : ovs_assert(15 == bitwise_rscan(s3, 3, 1, 23, 15));
514 : : /* Target exists in end byte but after the end bit, return end */
515 [ - + ]: 1 : ovs_assert(4 == bitwise_rscan(s3, 3, 1, 23, 4));
516 : : /* Target is 0 ... */
517 [ - + ]: 1 : ovs_assert(12 == bitwise_rscan(s3, 3, 0, 12, -1));
518 : :
519 : : /* All 0s */
520 : 1 : uint8_t s4[3] = {0x00, 0x00, 0x00};
521 : : /* Target not found */
522 [ - + ]: 1 : ovs_assert(-1 == bitwise_rscan(s4, 3, 1, 23, -1));
523 : : /* Target is 0 ..., start is 0 */
524 [ - + ]: 1 : ovs_assert(0 == bitwise_rscan(s4, 3, 0, 0, -1));
525 : :
526 : : int n_loops;
527 [ + + ]: 101 : for (n_loops = 0; n_loops < 100; n_loops++) {
528 : 100 : ovs_be64 x = htonll(0);
529 : : int i;
530 : :
531 [ + + ]: 6500 : for (i = 0; i < 64; i++) {
532 : : ovs_be64 bit;
533 : :
534 : : /* Change a random 0-bit into a 1-bit. */
535 : : do {
536 : 28835 : bit = htonll(UINT64_C(1) << (random_range(64)));
537 [ + + ]: 28835 : } while (x & bit);
538 : 6400 : x |= bit;
539 : :
540 [ + + ]: 422400 : for (int end = -1; end <= 63; end++) {
541 [ + + ]: 14144000 : for (int start = end; start <= 63; start++) {
542 [ + + ]: 41184000 : for (int target = 0; target < 2; target++) {
543 : 27456000 : bool expect = trivial_bitwise_rscan(
544 : : &x, sizeof x, target, start, end);
545 : 27456000 : bool answer = bitwise_rscan(
546 : : &x, sizeof x, target, start, end);
547 [ - + ]: 27456000 : if (expect != answer) {
548 [ # # ][ # # ]: 0 : fprintf(stderr,
[ # # ]
549 : : "bitwise_rscan(0x%016"PRIx64",8,%s,%d,%d) "
550 : : "returned %s instead of %s\n",
551 : : ntohll(x),
552 : : target ? "true" : "false",
553 : : start, end,
554 : : answer ? "true" : "false",
555 : : expect ? "true" : "false");
556 : 0 : abort();
557 : : }
558 : : }
559 : : }
560 : : }
561 : : }
562 : : }
563 : 1 : }
564 : :
565 : : static void
566 : 20 : test_follow_symlinks(struct ovs_cmdl_context *ctx)
567 : : {
568 : : int i;
569 : :
570 [ + + ]: 40 : for (i = 1; i < ctx->argc; i++) {
571 : 20 : char *target = follow_symlinks(ctx->argv[i]);
572 : 20 : puts(target);
573 : 20 : free(target);
574 : : }
575 : 20 : }
576 : :
577 : : static void
578 : 0 : test_assert(struct ovs_cmdl_context *ctx OVS_UNUSED)
579 : : {
580 : 0 : ovs_assert(false);
581 : : }
582 : :
583 : : static void
584 : 1 : test_ovs_scan(struct ovs_cmdl_context *ctx OVS_UNUSED)
585 : : {
586 : : char str[16], str2[16], str3[16];
587 : : long double ld, ld2;
588 : : long long ll, ll2;
589 : : signed char c, c2;
590 : : ptrdiff_t pd, pd2;
591 : : intmax_t im, im2;
592 : : size_t sz, sz2;
593 : : int n, n2, n3;
594 : : double d, d2;
595 : : short s, s2;
596 : : float f, f2;
597 : : long l, l2;
598 : : int i, i2;
599 : :
600 [ - + ]: 1 : ovs_assert(ovs_scan("", " "));
601 [ - + ]: 1 : ovs_assert(ovs_scan(" ", " "));
602 [ - + ]: 1 : ovs_assert(ovs_scan(" ", " "));
603 [ - + ]: 1 : ovs_assert(ovs_scan(" \t ", " "));
604 : :
605 [ - + ]: 1 : ovs_assert(ovs_scan("xyzzy", "xyzzy"));
606 [ - + ]: 1 : ovs_assert(ovs_scan("xy%zzy", "xy%%zzy"));
607 [ - + ]: 1 : ovs_assert(!ovs_scan(" xy%zzy", "xy%%zzy"));
608 [ - + ]: 1 : ovs_assert(ovs_scan(" xy%\tzzy", " xy%% zzy"));
609 : :
610 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%d", &i));
611 [ - + ]: 1 : ovs_assert(i == 123);
612 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%d", &i));
613 [ - + ]: 1 : ovs_assert(i == 0);
614 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%d%d", &i, &i2));
615 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%d", &i));
616 [ - + ]: 1 : ovs_assert(i == 123);
617 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%d", &i));
618 [ - + ]: 1 : ovs_assert(i == -123);
619 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%d", &i));
620 [ - + ]: 1 : ovs_assert(i == 123);
621 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%d", &i));
622 [ - + ]: 1 : ovs_assert(i == 123);
623 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%d", &i));
624 [ - + ]: 1 : ovs_assert(i == 0);
625 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2d %d", &i, &i2));
626 [ - + ]: 1 : ovs_assert(i == 12);
627 [ - + ]: 1 : ovs_assert(i2 == 3);
628 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2d %d", &i, &i2));
629 [ - + ]: 1 : ovs_assert(i == 1);
630 [ - + ]: 1 : ovs_assert(i2 == 23);
631 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2d %d", &i, &i2));
632 [ - + ]: 1 : ovs_assert(i == -1);
633 [ - + ]: 1 : ovs_assert(i2 == 23);
634 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2d %d", &i, &i2));
635 [ - + ]: 1 : ovs_assert(i == 1);
636 [ - + ]: 1 : ovs_assert(i2 == 23);
637 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%*2d %d", &i));
638 [ - + ]: 1 : ovs_assert(i == 3);
639 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2d %*d", &i));
640 [ - + ]: 1 : ovs_assert(i == 1);
641 [ - + ]: 1 : ovs_assert(i2 == 23);
642 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%*2d %*d"));
643 : :
644 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%u", &i));
645 [ - + ]: 1 : ovs_assert(i == 123);
646 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%u", &i));
647 [ - + ]: 1 : ovs_assert(i == 0);
648 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%u%u", &i, &i2));
649 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%u", &i));
650 [ - + ]: 1 : ovs_assert(i == 123);
651 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%u", &i));
652 [ - + ]: 1 : ovs_assert(i == -123);
653 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%u", &i));
654 [ - + ]: 1 : ovs_assert(i == 123);
655 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%u", &i));
656 [ - + ]: 1 : ovs_assert(i == 123);
657 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%u", &i));
658 [ - + ]: 1 : ovs_assert(i == 0);
659 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2u %u", &i, &i2));
660 [ - + ]: 1 : ovs_assert(i == 12);
661 [ - + ]: 1 : ovs_assert(i2 == 3);
662 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2u %u", &i, &i2));
663 [ - + ]: 1 : ovs_assert(i == 1);
664 [ - + ]: 1 : ovs_assert(i2 == 23);
665 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2u %u", &i, &i2));
666 [ - + ]: 1 : ovs_assert(i == -1);
667 [ - + ]: 1 : ovs_assert(i2 == 23);
668 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2u %u", &i, &i2));
669 [ - + ]: 1 : ovs_assert(i == 1);
670 [ - + ]: 1 : ovs_assert(i2 == 23);
671 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%*2u %u", &i));
672 [ - + ]: 1 : ovs_assert(i == 3);
673 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2u %*u", &i));
674 [ - + ]: 1 : ovs_assert(i == 1);
675 [ - + ]: 1 : ovs_assert(i2 == 23);
676 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%*2u %*u"));
677 : :
678 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%i", &i));
679 [ - + ]: 1 : ovs_assert(i == 123);
680 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%i", &i));
681 [ - + ]: 1 : ovs_assert(i == 0);
682 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%i%i", &i, &i2));
683 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%i", &i));
684 [ - + ]: 1 : ovs_assert(i == 123);
685 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%i", &i));
686 [ - + ]: 1 : ovs_assert(i == -123);
687 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%i", &i));
688 [ - + ]: 1 : ovs_assert(i == 0123);
689 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%i", &i));
690 [ - + ]: 1 : ovs_assert(i == 123);
691 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%i", &i));
692 [ - + ]: 1 : ovs_assert(i == 0x123);
693 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2i %i", &i, &i2));
694 [ - + ]: 1 : ovs_assert(i == 12);
695 [ - + ]: 1 : ovs_assert(i2 == 3);
696 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2i %i", &i, &i2));
697 [ - + ]: 1 : ovs_assert(i == 1);
698 [ - + ]: 1 : ovs_assert(i2 == 23);
699 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2i %i", &i, &i2));
700 [ - + ]: 1 : ovs_assert(i == -1);
701 [ - + ]: 1 : ovs_assert(i2 == 23);
702 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2i %i", &i, &i2));
703 [ - + ]: 1 : ovs_assert(i == 1);
704 [ - + ]: 1 : ovs_assert(i2 == 23);
705 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%*2i %i", &i));
706 [ - + ]: 1 : ovs_assert(i == 3);
707 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2i %*i", &i));
708 [ - + ]: 1 : ovs_assert(i == 1);
709 [ - + ]: 1 : ovs_assert(i2 == 23);
710 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%*2i %*i"));
711 : :
712 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%o", &i));
713 [ - + ]: 1 : ovs_assert(i == 0123);
714 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%o", &i));
715 [ - + ]: 1 : ovs_assert(i == 0);
716 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%o%o", &i, &i2));
717 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%o", &i));
718 [ - + ]: 1 : ovs_assert(i == 0123);
719 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%o", &i));
720 [ - + ]: 1 : ovs_assert(i == -0123);
721 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%o", &i));
722 [ - + ]: 1 : ovs_assert(i == 0123);
723 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%o", &i));
724 [ - + ]: 1 : ovs_assert(i == 0123);
725 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%o", &i));
726 [ - + ]: 1 : ovs_assert(i == 0);
727 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2o %o", &i, &i2));
728 [ - + ]: 1 : ovs_assert(i == 012);
729 [ - + ]: 1 : ovs_assert(i2 == 3);
730 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2o %o", &i, &i2));
731 [ - + ]: 1 : ovs_assert(i == 1);
732 [ - + ]: 1 : ovs_assert(i2 == 023);
733 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2o %o", &i, &i2));
734 [ - + ]: 1 : ovs_assert(i == -1);
735 [ - + ]: 1 : ovs_assert(i2 == 023);
736 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2o %o", &i, &i2));
737 [ - + ]: 1 : ovs_assert(i == 1);
738 [ - + ]: 1 : ovs_assert(i2 == 023);
739 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%*2o %o", &i));
740 [ - + ]: 1 : ovs_assert(i == 3);
741 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2o %*o", &i));
742 [ - + ]: 1 : ovs_assert(i == 1);
743 [ - + ]: 1 : ovs_assert(i2 == 023);
744 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%*2o %*o"));
745 : :
746 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%x", &i));
747 [ - + ]: 1 : ovs_assert(i == 0x123);
748 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%x", &i));
749 [ - + ]: 1 : ovs_assert(i == 0);
750 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%x%x", &i, &i2));
751 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%x", &i));
752 [ - + ]: 1 : ovs_assert(i == 0x123);
753 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%x", &i));
754 [ - + ]: 1 : ovs_assert(i == -0x123);
755 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%x", &i));
756 [ - + ]: 1 : ovs_assert(i == 0x123);
757 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%x", &i));
758 [ - + ]: 1 : ovs_assert(i == 0x123);
759 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%x", &i));
760 [ - + ]: 1 : ovs_assert(i == 0x123);
761 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2x %x", &i, &i2));
762 [ - + ]: 1 : ovs_assert(i == 0x12);
763 [ - + ]: 1 : ovs_assert(i2 == 3);
764 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2x %x", &i, &i2));
765 [ - + ]: 1 : ovs_assert(i == 1);
766 [ - + ]: 1 : ovs_assert(i2 == 0x23);
767 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2x %x", &i, &i2));
768 [ - + ]: 1 : ovs_assert(i == -1);
769 [ - + ]: 1 : ovs_assert(i2 == 0x23);
770 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2x %x", &i, &i2));
771 [ - + ]: 1 : ovs_assert(i == 1);
772 [ - + ]: 1 : ovs_assert(i2 == 0x23);
773 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%*2x %x", &i));
774 [ - + ]: 1 : ovs_assert(i == 3);
775 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2x %*x", &i));
776 [ - + ]: 1 : ovs_assert(i == 1);
777 [ - + ]: 1 : ovs_assert(i2 == 0x23);
778 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%*2x %*x"));
779 : :
780 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%hd", &s));
781 [ - + ]: 1 : ovs_assert(s == 123);
782 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%hd%hd", &s, &s2));
783 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%hd", &s));
784 [ - + ]: 1 : ovs_assert(s == 123);
785 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%hd", &s));
786 [ - + ]: 1 : ovs_assert(s == -123);
787 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%hd", &s));
788 [ - + ]: 1 : ovs_assert(s == 123);
789 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%hd", &s));
790 [ - + ]: 1 : ovs_assert(s == 123);
791 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%hd", &s));
792 [ - + ]: 1 : ovs_assert(s == 0);
793 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2hd %hd", &s, &s2));
794 [ - + ]: 1 : ovs_assert(s == 12);
795 [ - + ]: 1 : ovs_assert(s2 == 3);
796 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2hd %hd", &s, &s2));
797 [ - + ]: 1 : ovs_assert(s == 1);
798 [ - + ]: 1 : ovs_assert(s2 == 23);
799 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2hd %hd", &s, &s2));
800 [ - + ]: 1 : ovs_assert(s == -1);
801 [ - + ]: 1 : ovs_assert(s2 == 23);
802 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2hd %hd", &s, &s2));
803 [ - + ]: 1 : ovs_assert(s == 1);
804 [ - + ]: 1 : ovs_assert(s2 == 23);
805 : :
806 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%hhd", &c));
807 [ - + ]: 1 : ovs_assert(c == 123);
808 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%hhd", &c));
809 [ - + ]: 1 : ovs_assert(c == 0);
810 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%hhd%hhd", &c, &c2));
811 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%hhd", &c));
812 [ - + ]: 1 : ovs_assert(c == 123);
813 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%hhd", &c));
814 [ - + ]: 1 : ovs_assert(c == -123);
815 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%hhd", &c));
816 [ - + ]: 1 : ovs_assert(c == 123);
817 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%hhd", &c));
818 [ - + ]: 1 : ovs_assert(c == 123);
819 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%hhd", &c));
820 [ - + ]: 1 : ovs_assert(c == 0);
821 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2hhd %hhd", &c, &c2));
822 [ - + ]: 1 : ovs_assert(c == 12);
823 [ - + ]: 1 : ovs_assert(c2 == 3);
824 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2hhd %hhd", &c, &c2));
825 [ - + ]: 1 : ovs_assert(c == 1);
826 [ - + ]: 1 : ovs_assert(c2 == 23);
827 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2hhd %hhd", &c, &c2));
828 [ - + ]: 1 : ovs_assert(c == -1);
829 [ - + ]: 1 : ovs_assert(c2 == 23);
830 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2hhd %hhd", &c, &c2));
831 [ - + ]: 1 : ovs_assert(c == 1);
832 [ - + ]: 1 : ovs_assert(c2 == 23);
833 : :
834 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%ld", &l));
835 [ - + ]: 1 : ovs_assert(l == 123);
836 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%ld", &l));
837 [ - + ]: 1 : ovs_assert(l == 0);
838 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%ld%ld", &l, &l2));
839 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%ld", &l));
840 [ - + ]: 1 : ovs_assert(l == 123);
841 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%ld", &l));
842 [ - + ]: 1 : ovs_assert(l == -123);
843 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%ld", &l));
844 [ - + ]: 1 : ovs_assert(l == 123);
845 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%ld", &l));
846 [ - + ]: 1 : ovs_assert(l == 123);
847 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%ld", &l));
848 [ - + ]: 1 : ovs_assert(l == 0);
849 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2ld %ld", &l, &l2));
850 [ - + ]: 1 : ovs_assert(l == 12);
851 [ - + ]: 1 : ovs_assert(l2 == 3);
852 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2ld %ld", &l, &l2));
853 [ - + ]: 1 : ovs_assert(l == 1);
854 [ - + ]: 1 : ovs_assert(l2 == 23);
855 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2ld %ld", &l, &l2));
856 [ - + ]: 1 : ovs_assert(l == -1);
857 [ - + ]: 1 : ovs_assert(l2 == 23);
858 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2ld %ld", &l, &l2));
859 [ - + ]: 1 : ovs_assert(l == 1);
860 [ - + ]: 1 : ovs_assert(l2 == 23);
861 : :
862 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%lld", &ll));
863 [ - + ]: 1 : ovs_assert(ll == 123);
864 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%lld", &ll));
865 [ - + ]: 1 : ovs_assert(ll == 0);
866 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%lld%lld", &ll, &ll2));
867 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%lld", &ll));
868 [ - + ]: 1 : ovs_assert(ll == 123);
869 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%lld", &ll));
870 [ - + ]: 1 : ovs_assert(ll == -123);
871 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%lld", &ll));
872 [ - + ]: 1 : ovs_assert(ll == 123);
873 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%lld", &ll));
874 [ - + ]: 1 : ovs_assert(ll == 123);
875 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%lld", &ll));
876 [ - + ]: 1 : ovs_assert(ll == 0);
877 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2lld %lld", &ll, &ll2));
878 [ - + ]: 1 : ovs_assert(ll == 12);
879 [ - + ]: 1 : ovs_assert(ll2 == 3);
880 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2lld %lld", &ll, &ll2));
881 [ - + ]: 1 : ovs_assert(ll == 1);
882 [ - + ]: 1 : ovs_assert(ll2 == 23);
883 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2lld %lld", &ll, &ll2));
884 [ - + ]: 1 : ovs_assert(ll == -1);
885 [ - + ]: 1 : ovs_assert(ll2 == 23);
886 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2lld %lld", &ll, &ll2));
887 [ - + ]: 1 : ovs_assert(ll == 1);
888 [ - + ]: 1 : ovs_assert(ll2 == 23);
889 : :
890 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%jd", &im));
891 [ - + ]: 1 : ovs_assert(im == 123);
892 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%jd", &im));
893 [ - + ]: 1 : ovs_assert(im == 0);
894 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%jd%jd", &im, &im2));
895 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%jd", &im));
896 [ - + ]: 1 : ovs_assert(im == 123);
897 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%jd", &im));
898 [ - + ]: 1 : ovs_assert(im == -123);
899 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%jd", &im));
900 [ - + ]: 1 : ovs_assert(im == 123);
901 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%jd", &im));
902 [ - + ]: 1 : ovs_assert(im == 123);
903 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%jd", &im));
904 [ - + ]: 1 : ovs_assert(im == 0);
905 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2jd %jd", &im, &im2));
906 [ - + ]: 1 : ovs_assert(im == 12);
907 [ - + ]: 1 : ovs_assert(im2 == 3);
908 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2jd %jd", &im, &im2));
909 [ - + ]: 1 : ovs_assert(im == 1);
910 [ - + ]: 1 : ovs_assert(im2 == 23);
911 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2jd %jd", &im, &im2));
912 [ - + ]: 1 : ovs_assert(im == -1);
913 [ - + ]: 1 : ovs_assert(im2 == 23);
914 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2jd %jd", &im, &im2));
915 [ - + ]: 1 : ovs_assert(im == 1);
916 [ - + ]: 1 : ovs_assert(im2 == 23);
917 : :
918 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%td", &pd));
919 [ - + ]: 1 : ovs_assert(pd == 123);
920 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%td", &pd));
921 [ - + ]: 1 : ovs_assert(pd == 0);
922 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%td%td", &pd, &pd2));
923 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%td", &pd));
924 [ - + ]: 1 : ovs_assert(pd == 123);
925 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%td", &pd));
926 [ - + ]: 1 : ovs_assert(pd == -123);
927 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%td", &pd));
928 [ - + ]: 1 : ovs_assert(pd == 123);
929 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%td", &pd));
930 [ - + ]: 1 : ovs_assert(pd == 123);
931 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%td", &pd));
932 [ - + ]: 1 : ovs_assert(pd == 0);
933 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2td %td", &pd, &pd2));
934 [ - + ]: 1 : ovs_assert(pd == 12);
935 [ - + ]: 1 : ovs_assert(pd2 == 3);
936 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2td %td", &pd, &pd2));
937 [ - + ]: 1 : ovs_assert(pd == 1);
938 [ - + ]: 1 : ovs_assert(pd2 == 23);
939 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2td %td", &pd, &pd2));
940 [ - + ]: 1 : ovs_assert(pd == -1);
941 [ - + ]: 1 : ovs_assert(pd2 == 23);
942 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2td %td", &pd, &pd2));
943 [ - + ]: 1 : ovs_assert(pd == 1);
944 [ - + ]: 1 : ovs_assert(pd2 == 23);
945 : :
946 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%zd", &sz));
947 [ - + ]: 1 : ovs_assert(sz == 123);
948 [ - + ]: 1 : ovs_assert(ovs_scan("0", "%zd", &sz));
949 [ - + ]: 1 : ovs_assert(sz == 0);
950 [ - + ]: 1 : ovs_assert(!ovs_scan("123", "%zd%zd", &sz, &sz2));
951 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%zd", &sz));
952 [ - + ]: 1 : ovs_assert(sz == 123);
953 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%zd", &sz));
954 [ - + ]: 1 : ovs_assert(sz == -123);
955 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%zd", &sz));
956 [ - + ]: 1 : ovs_assert(sz == 123);
957 [ - + ]: 1 : ovs_assert(ovs_scan(" 123", "%zd", &sz));
958 [ - + ]: 1 : ovs_assert(sz == 123);
959 [ - + ]: 1 : ovs_assert(ovs_scan("0x123", "%zd", &sz));
960 [ - + ]: 1 : ovs_assert(sz == 0);
961 [ - + ]: 1 : ovs_assert(ovs_scan("123", "%2zd %zd", &sz, &sz2));
962 [ - + ]: 1 : ovs_assert(sz == 12);
963 [ - + ]: 1 : ovs_assert(sz2 == 3);
964 [ - + ]: 1 : ovs_assert(ovs_scan("+123", "%2zd %zd", &sz, &sz2));
965 [ - + ]: 1 : ovs_assert(sz == 1);
966 [ - + ]: 1 : ovs_assert(sz2 == 23);
967 [ - + ]: 1 : ovs_assert(ovs_scan("-123", "%2zd %zd", &sz, &sz2));
968 [ - + ]: 1 : ovs_assert(sz == -1);
969 [ - + ]: 1 : ovs_assert(sz2 == 23);
970 [ - + ]: 1 : ovs_assert(ovs_scan("0123", "%2zd %zd", &sz, &sz2));
971 [ - + ]: 1 : ovs_assert(sz == 1);
972 [ - + ]: 1 : ovs_assert(sz2 == 23);
973 : :
974 [ - + ]: 1 : ovs_assert(ovs_scan("0.25", "%f", &f));
975 [ - + ]: 1 : ovs_assert(f == 0.25);
976 [ - + ]: 1 : ovs_assert(ovs_scan("1.0", "%f", &f));
977 [ - + ]: 1 : ovs_assert(f == 1.0);
978 [ - + ]: 1 : ovs_assert(ovs_scan("-5", "%f", &f));
979 [ - + ]: 1 : ovs_assert(f == -5.0);
980 [ - + ]: 1 : ovs_assert(ovs_scan("+6", "%f", &f));
981 [ - + ]: 1 : ovs_assert(f == 6.0);
982 [ - + ]: 1 : ovs_assert(ovs_scan("-1e5", "%f", &f));
983 [ - + ]: 1 : ovs_assert(f == -1e5);
984 [ - + ]: 1 : ovs_assert(ovs_scan("-.25", "%f", &f));
985 [ - + ]: 1 : ovs_assert(f == -.25);
986 [ - + ]: 1 : ovs_assert(ovs_scan("+123.e1", "%f", &f));
987 [ - + ]: 1 : ovs_assert(f == 1230.0);
988 [ - + ]: 1 : ovs_assert(ovs_scan("25e-2", "%f", &f));
989 [ - + ]: 1 : ovs_assert(f == 0.25);
990 [ - + ]: 1 : ovs_assert(ovs_scan("0.25", "%1f %f", &f, &f2));
991 [ - + ]: 1 : ovs_assert(f == 0);
992 [ - + ]: 1 : ovs_assert(f2 == 0.25);
993 [ - + ]: 1 : ovs_assert(ovs_scan("1.0", "%2f %f", &f, &f2));
994 [ - + ]: 1 : ovs_assert(f == 1.0);
995 [ - + ]: 1 : ovs_assert(f2 == 0.0);
996 [ - + ]: 1 : ovs_assert(!ovs_scan("-5", "%1f", &f));
997 [ - + ]: 1 : ovs_assert(!ovs_scan("+6", "%1f", &f));
998 [ - + ]: 1 : ovs_assert(!ovs_scan("-1e5", "%2f %*f", &f));
999 [ - + ]: 1 : ovs_assert(f == -1);
1000 [ - + ]: 1 : ovs_assert(!ovs_scan("-.25", "%2f", &f));
1001 [ - + ]: 1 : ovs_assert(!ovs_scan("+123.e1", "%6f", &f));
1002 [ - + ]: 1 : ovs_assert(!ovs_scan("25e-2", "%4f", &f));
1003 : :
1004 [ - + ]: 1 : ovs_assert(ovs_scan("0.25", "%lf", &d));
1005 [ - + ]: 1 : ovs_assert(d == 0.25);
1006 [ - + ]: 1 : ovs_assert(ovs_scan("1.0", "%lf", &d));
1007 [ - + ]: 1 : ovs_assert(d == 1.0);
1008 [ - + ]: 1 : ovs_assert(ovs_scan("-5", "%lf", &d));
1009 [ - + ]: 1 : ovs_assert(d == -5.0);
1010 [ - + ]: 1 : ovs_assert(ovs_scan("+6", "%lf", &d));
1011 [ - + ]: 1 : ovs_assert(d == 6.0);
1012 [ - + ]: 1 : ovs_assert(ovs_scan("-1e5", "%lf", &d));
1013 [ - + ]: 1 : ovs_assert(d == -1e5);
1014 [ - + ]: 1 : ovs_assert(ovs_scan("-.25", "%lf", &d));
1015 [ - + ]: 1 : ovs_assert(d == -.25);
1016 [ - + ]: 1 : ovs_assert(ovs_scan("+123.e1", "%lf", &d));
1017 [ - + ]: 1 : ovs_assert(d == 1230.0);
1018 [ - + ]: 1 : ovs_assert(ovs_scan("25e-2", "%lf", &d));
1019 [ - + ]: 1 : ovs_assert(d == 0.25);
1020 [ - + ]: 1 : ovs_assert(ovs_scan("0.25", "%1lf %lf", &d, &d2));
1021 [ - + ]: 1 : ovs_assert(d == 0);
1022 [ - + ]: 1 : ovs_assert(d2 == 0.25);
1023 [ - + ]: 1 : ovs_assert(ovs_scan("1.0", "%2lf %lf", &d, &d2));
1024 [ - + ]: 1 : ovs_assert(d == 1.0);
1025 [ - + ]: 1 : ovs_assert(d2 == 0.0);
1026 [ - + ]: 1 : ovs_assert(!ovs_scan("-5", "%1lf", &d));
1027 [ - + ]: 1 : ovs_assert(!ovs_scan("+6", "%1lf", &d));
1028 [ - + ]: 1 : ovs_assert(!ovs_scan("-1e5", "%2lf %*f", &d));
1029 [ - + ]: 1 : ovs_assert(d == -1);
1030 [ - + ]: 1 : ovs_assert(!ovs_scan("-.25", "%2lf", &d));
1031 [ - + ]: 1 : ovs_assert(!ovs_scan("+123.e1", "%6lf", &d));
1032 [ - + ]: 1 : ovs_assert(!ovs_scan("25e-2", "%4lf", &d));
1033 : :
1034 [ - + ]: 1 : ovs_assert(ovs_scan("0.25", "%Lf", &ld));
1035 [ - + ]: 1 : ovs_assert(ld == 0.25);
1036 [ - + ]: 1 : ovs_assert(ovs_scan("1.0", "%Lf", &ld));
1037 [ - + ]: 1 : ovs_assert(ld == 1.0);
1038 [ - + ]: 1 : ovs_assert(ovs_scan("-5", "%Lf", &ld));
1039 [ - + ]: 1 : ovs_assert(ld == -5.0);
1040 [ - + ]: 1 : ovs_assert(ovs_scan("+6", "%Lf", &ld));
1041 [ - + ]: 1 : ovs_assert(ld == 6.0);
1042 [ - + ]: 1 : ovs_assert(ovs_scan("-1e5", "%Lf", &ld));
1043 [ - + ]: 1 : ovs_assert(ld == -1e5);
1044 [ - + ]: 1 : ovs_assert(ovs_scan("-.25", "%Lf", &ld));
1045 [ - + ]: 1 : ovs_assert(ld == -.25);
1046 [ - + ]: 1 : ovs_assert(ovs_scan("+123.e1", "%Lf", &ld));
1047 [ - + ]: 1 : ovs_assert(ld == 1230.0);
1048 [ - + ]: 1 : ovs_assert(ovs_scan("25e-2", "%Lf", &ld));
1049 [ - + ]: 1 : ovs_assert(ld == 0.25);
1050 [ - + ]: 1 : ovs_assert(ovs_scan("0.25", "%1Lf %Lf", &ld, &ld2));
1051 [ - + ]: 1 : ovs_assert(ld == 0);
1052 [ - + ]: 1 : ovs_assert(ld2 == 0.25);
1053 [ - + ]: 1 : ovs_assert(ovs_scan("1.0", "%2Lf %Lf", &ld, &ld2));
1054 [ - + ]: 1 : ovs_assert(ld == 1.0);
1055 [ - + ]: 1 : ovs_assert(ld2 == 0.0);
1056 [ - + ]: 1 : ovs_assert(!ovs_scan("-5", "%1Lf", &ld));
1057 [ - + ]: 1 : ovs_assert(!ovs_scan("+6", "%1Lf", &ld));
1058 [ - + ]: 1 : ovs_assert(!ovs_scan("-1e5", "%2Lf %*f", &ld));
1059 [ - + ]: 1 : ovs_assert(ld == -1);
1060 [ - + ]: 1 : ovs_assert(!ovs_scan("-.25", "%2Lf", &ld));
1061 [ - + ]: 1 : ovs_assert(!ovs_scan("+123.e1", "%6Lf", &ld));
1062 [ - + ]: 1 : ovs_assert(!ovs_scan("25e-2", "%4Lf", &ld));
1063 : :
1064 [ - + ]: 1 : ovs_assert(ovs_scan(" Hello,\tworld ", "%*s%n%*s%n", &n, &n2));
1065 [ - + ]: 1 : ovs_assert(n == 7);
1066 [ - + ]: 1 : ovs_assert(n2 == 13);
1067 [ - + ]: 1 : ovs_assert(!ovs_scan(" Hello,\tworld ", "%*s%*s%*s"));
1068 [ - + ]: 1 : ovs_assert(ovs_scan(" Hello,\tworld ", "%6s%n%5s%n", str, &n, str2, &n2));
1069 [ - + ]: 1 : ovs_assert(!strcmp(str, "Hello,"));
1070 [ - + ]: 1 : ovs_assert(n == 7);
1071 [ - + ]: 1 : ovs_assert(!strcmp(str2, "world"));
1072 [ - + ]: 1 : ovs_assert(n2 == 13);
1073 [ - + ]: 1 : ovs_assert(ovs_scan(" Hello,\tworld ", "%5s%5s%5s", str, str2, str3));
1074 [ - + ]: 1 : ovs_assert(!strcmp(str, "Hello"));
1075 [ - + ]: 1 : ovs_assert(!strcmp(str2, ","));
1076 [ - + ]: 1 : ovs_assert(!strcmp(str3, "world"));
1077 [ - + ]: 1 : ovs_assert(!ovs_scan(" ", "%*s"));
1078 : :
1079 [ - + ]: 1 : ovs_assert(ovs_scan(" Hello,\tworld ", "%*c%n%*c%n%c%n",
1080 : : &n, &n2, &c, &n3));
1081 [ - + ]: 1 : ovs_assert(n == 1);
1082 [ - + ]: 1 : ovs_assert(n2 == 2);
1083 [ - + ]: 1 : ovs_assert(c == 'e');
1084 [ - + ]: 1 : ovs_assert(n3 == 3);
1085 [ - + ]: 1 : ovs_assert(ovs_scan(" Hello,\tworld ", "%*5c%5c", str));
1086 [ - + ]: 1 : ovs_assert(!memcmp(str, "o,\two", 5));
1087 [ - + ]: 1 : ovs_assert(!ovs_scan(" Hello,\tworld ", "%*15c"));
1088 : :
1089 [ - + ]: 1 : ovs_assert(ovs_scan("0x1234xyzzy", "%9[x0-9a-fA-F]%n", str, &n));
1090 [ - + ]: 1 : ovs_assert(!strcmp(str, "0x1234x"));
1091 [ - + ]: 1 : ovs_assert(n == 7);
1092 [ - + ]: 1 : ovs_assert(ovs_scan("foo:bar=baz", "%5[^:=]%n:%5[^:=]%n=%5[^:=]%n",
1093 : : str, &n, str2, &n2, str3, &n3));
1094 [ - + ]: 1 : ovs_assert(!strcmp(str, "foo"));
1095 [ - + ]: 1 : ovs_assert(n == 3);
1096 [ - + ]: 1 : ovs_assert(!strcmp(str2, "bar"));
1097 [ - + ]: 1 : ovs_assert(n2 == 7);
1098 [ - + ]: 1 : ovs_assert(!strcmp(str3, "baz"));
1099 [ - + ]: 1 : ovs_assert(n3 == 11);
1100 [ - + ]: 1 : ovs_assert(!ovs_scan(" ", "%*[0-9]"));
1101 [ - + ]: 1 : ovs_assert(ovs_scan("0x123a]4xyzzy-", "%[]x0-9a-fA-F]", str));
1102 [ - + ]: 1 : ovs_assert(!strcmp(str, "0x123a]4x"));
1103 [ - + ]: 1 : ovs_assert(ovs_scan("abc]xyz","%[^]xyz]", str));
1104 [ - + ]: 1 : ovs_assert(!strcmp(str, "abc"));
1105 [ - + ]: 1 : ovs_assert(!ovs_scan("0x123a]4xyzzy-", "%[x0-9]a-fA-F]", str));
1106 [ - + ]: 1 : ovs_assert(ovs_scan("0x12-3]xyz", "%[x0-9a-f-]", str));
1107 [ - + ]: 1 : ovs_assert(!strcmp(str, "0x12-3"));
1108 [ - + ]: 1 : ovs_assert(ovs_scan("0x12-3]xyz", "%[^a-f-]", str));
1109 [ - + ]: 1 : ovs_assert(!strcmp(str, "0x12"));
1110 [ - + ]: 1 : ovs_assert(sscanf("0x12-3]xyz", "%[^-a-f]", str));
1111 [ - + ]: 1 : ovs_assert(!strcmp(str, "0x12"));
1112 : 1 : }
1113 : :
1114 : : static void
1115 : 1 : test_snprintf(struct ovs_cmdl_context *ctx OVS_UNUSED)
1116 : : {
1117 : : char s[16];
1118 : :
1119 [ - + ]: 1 : ovs_assert(snprintf(s, 4, "abcde") == 5);
1120 [ - + ]: 1 : ovs_assert(!strcmp(s, "abc"));
1121 : :
1122 [ - + ]: 1 : ovs_assert(snprintf(s, 5, "abcde") == 5);
1123 [ - + ]: 1 : ovs_assert(!strcmp(s, "abcd"));
1124 : :
1125 [ - + ]: 1 : ovs_assert(snprintf(s, 6, "abcde") == 5);
1126 [ - + ]: 1 : ovs_assert(!strcmp(s, "abcde"));
1127 : :
1128 [ - + ]: 1 : ovs_assert(snprintf(NULL, 0, "abcde") == 5);
1129 : 1 : }
1130 : :
1131 : : #ifndef _WIN32
1132 : : static void
1133 : 13 : test_file_name(struct ovs_cmdl_context *ctx)
1134 : : {
1135 : : int i;
1136 : :
1137 [ + + ]: 26 : for (i = 1; i < ctx->argc; i++) {
1138 : : char *dir, *base;
1139 : :
1140 : 13 : dir = dir_name(ctx->argv[i]);
1141 : 13 : puts(dir);
1142 : 13 : free(dir);
1143 : :
1144 : 13 : base = base_name(ctx->argv[i]);
1145 : 13 : puts(base);
1146 : 13 : free(base);
1147 : : }
1148 : 13 : }
1149 : : #endif /* _WIN32 */
1150 : :
1151 : : static const struct ovs_cmdl_command commands[] = {
1152 : : {"ctz", NULL, 0, 0, test_ctz, OVS_RO},
1153 : : {"clz", NULL, 0, 0, test_clz, OVS_RO},
1154 : : {"round_up_pow2", NULL, 0, 0, test_round_up_pow2, OVS_RO},
1155 : : {"round_down_pow2", NULL, 0, 0, test_round_down_pow2, OVS_RO},
1156 : : {"count_1bits", NULL, 0, 0, test_count_1bits, OVS_RO},
1157 : : {"log_2_floor", NULL, 0, 0, test_log_2_floor, OVS_RO},
1158 : : {"bitwise_copy", NULL, 0, 0, test_bitwise_copy, OVS_RO},
1159 : : {"bitwise_zero", NULL, 0, 0, test_bitwise_zero, OVS_RO},
1160 : : {"bitwise_one", NULL, 0, 0, test_bitwise_one, OVS_RO},
1161 : : {"bitwise_is_all_zeros", NULL, 0, 0, test_bitwise_is_all_zeros, OVS_RO},
1162 : : {"bitwise_rscan", NULL, 0, 0, test_bitwise_rscan, OVS_RO},
1163 : : {"follow-symlinks", NULL, 1, INT_MAX, test_follow_symlinks, OVS_RO},
1164 : : {"assert", NULL, 0, 0, test_assert, OVS_RO},
1165 : : {"ovs_scan", NULL, 0, 0, test_ovs_scan, OVS_RO},
1166 : : {"snprintf", NULL, 0, 0, test_snprintf, OVS_RO},
1167 : : #ifndef _WIN32
1168 : : {"file_name", NULL, 1, INT_MAX, test_file_name, OVS_RO},
1169 : : #endif
1170 : : {NULL, NULL, 0, 0, NULL, OVS_RO},
1171 : : };
1172 : :
1173 : : static void
1174 : 46 : parse_options(int argc, char *argv[])
1175 : : {
1176 : : enum {
1177 : : VLOG_OPTION_ENUMS
1178 : : };
1179 : : static const struct option long_options[] = {
1180 : : VLOG_LONG_OPTIONS,
1181 : : {NULL, 0, NULL, 0},
1182 : : };
1183 : 46 : char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
1184 : :
1185 : : for (;;) {
1186 : 46 : int c = getopt_long(argc, argv, short_options, long_options, NULL);
1187 [ + - ]: 46 : if (c == -1) {
1188 : 46 : break;
1189 : : }
1190 : :
1191 [ # # # # : 0 : switch (c) {
# # ]
1192 : 0 : VLOG_OPTION_HANDLERS
1193 : :
1194 : : case '?':
1195 : 0 : exit(EXIT_FAILURE);
1196 : :
1197 : : default:
1198 : 0 : abort();
1199 : : }
1200 : 0 : }
1201 : 46 : free(short_options);
1202 : 46 : }
1203 : :
1204 : : static void
1205 : 46 : test_util_main(int argc, char *argv[])
1206 : : {
1207 : 46 : struct ovs_cmdl_context ctx = { .argc = 0, };
1208 : 46 : set_program_name(argv[0]);
1209 : 46 : parse_options(argc, argv);
1210 : : /* On Windows, stderr is fully buffered if connected to a pipe.
1211 : : * Make it _IONBF so that an abort does not miss log contents.
1212 : : * POSIX doesn't define the circumstances in which stderr is
1213 : : * fully buffered either. */
1214 : 46 : setvbuf(stderr, NULL, _IONBF, 0);
1215 : 46 : ctx.argc = argc - optind;
1216 : 46 : ctx.argv = argv + optind;
1217 : 46 : ovs_cmdl_run_command(&ctx, commands);
1218 : 46 : }
1219 : :
1220 : 1266 : OVSTEST_REGISTER("test-util", test_util_main);
|