X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Ftest-util.c;h=ffd4dcefd8ef0110f1131518164fd1d97883eb86;hb=c5cf10598f8c9f4428291e9df3ecd72a05fb1ccf;hp=b98fc79aa3903f0bfe3ddc6d4716aba56b621c2e;hpb=a656cb7736fd9f5926c2b1bdd6f50dafc3aa796a;p=sliver-openvswitch.git diff --git a/tests/test-util.c b/tests/test-util.c index b98fc79aa..ffd4dcefd 100644 --- a/tests/test-util.c +++ b/tests/test-util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012 Nicira, Inc. + * Copyright (c) 2011, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -25,6 +26,8 @@ #include "command-line.h" #include "random.h" #include "util.h" +#include "vlog.h" +#include "ovstest.h" #undef NDEBUG #include @@ -59,11 +62,21 @@ test_log_2_floor(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) } static void -check_ctz(uint32_t x, int n) +check_ctz32(uint32_t x, int n) { - if (ctz(x) != n) { - fprintf(stderr, "ctz(%"PRIu32") is %d but should be %d\n", - x, ctz(x), n); + if (ctz32(x) != n) { + fprintf(stderr, "ctz32(%"PRIu32") is %d but should be %d\n", + x, ctz32(x), n); + abort(); + } +} + +static void +check_ctz64(uint64_t x, int n) +{ + if (ctz64(x) != n) { + fprintf(stderr, "ctz64(%"PRIu64") is %d but should be %d\n", + x, ctz64(x), n); abort(); } } @@ -75,67 +88,195 @@ test_ctz(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) for (n = 0; n < 32; n++) { /* Check minimum x such that f(x) == n. */ - check_ctz(1 << n, n); + check_ctz32(1 << n, n); /* Check maximum x such that f(x) == n. */ - check_ctz(UINT32_MAX << n, n); + check_ctz32(UINT32_MAX << n, n); /* Check a random value in the middle. */ - check_ctz((random_uint32() | 1) << n, n); + check_ctz32((random_uint32() | 1) << n, n); + } + + + for (n = 0; n < 64; n++) { + /* Check minimum x such that f(x) == n. */ + check_ctz64(UINT64_C(1) << n, n); + + /* Check maximum x such that f(x) == n. */ + check_ctz64(UINT64_MAX << n, n); + + /* Check a random value in the middle. */ + check_ctz64((random_uint64() | UINT64_C(1)) << n, n); } /* Check ctz(0). */ - check_ctz(0, 32); + check_ctz32(0, 32); + check_ctz64(0, 64); +} + +static void +check_clz32(uint32_t x, int n) +{ + if (clz32(x) != n) { + fprintf(stderr, "clz32(%"PRIu32") is %d but should be %d\n", + x, clz32(x), n); + abort(); + } +} + +static void +check_clz64(uint64_t x, int n) +{ + if (clz64(x) != n) { + fprintf(stderr, "clz64(%"PRIu64") is %d but should be %d\n", + x, clz64(x), n); + abort(); + } +} + +static void +test_clz(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + int n; + + for (n = 0; n < 32; n++) { + /* Check minimum x such that f(x) == n. */ + check_clz32((1u << 31) >> n, n); + + /* Check maximum x such that f(x) == n. */ + check_clz32(UINT32_MAX >> n, n); + + /* Check a random value in the middle. */ + check_clz32((random_uint32() | 1u << 31) >> n, n); + } + + for (n = 0; n < 64; n++) { + /* Check minimum x such that f(x) == n. */ + check_clz64((UINT64_C(1) << 63) >> n, n); + + /* Check maximum x such that f(x) == n. */ + check_clz64(UINT64_MAX >> n, n); + + /* Check a random value in the middle. */ + check_clz64((random_uint64() | UINT64_C(1) << 63) >> n, n); + } + + /* Check clz(0). */ + check_clz32(0, 32); + check_clz64(0, 64); +} + +/* Returns a random number in the range 'min'...'max' inclusive. */ +static uint32_t +random_in_range(uint32_t min, uint32_t max) +{ + return min == max ? min : min + random_range(max - min + 1); +} + +static void +check_rup2(uint32_t x, int n) +{ + uint32_t rup2 = ROUND_UP_POW2(x); + if (rup2 != n) { + fprintf(stderr, "ROUND_UP_POW2(%#"PRIx32") is %#"PRIx32" " + "but should be %#"PRIx32"\n", x, rup2, n); + abort(); + } +} + +static void +test_round_up_pow2(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + int n; + + for (n = 0; n < 32; n++) { + /* Min, max value for which ROUND_UP_POW2 should yield (1 << n). */ + uint32_t min = ((1u << n) >> 1) + 1; + uint32_t max = 1u << n; + + check_rup2(min, 1u << n); + check_rup2(max, 1u << n); + check_rup2(random_in_range(min, max), 1u << n); + } + check_rup2(0, 0); } static void -shuffle(unsigned int *p, size_t n) +check_rdp2(uint32_t x, int n) +{ + uint32_t rdp2 = ROUND_DOWN_POW2(x); + if (rdp2 != n) { + fprintf(stderr, "ROUND_DOWN_POW2(%#"PRIx32") is %#"PRIx32" " + "but should be %#"PRIx32"\n", x, rdp2, n); + abort(); + } +} + +static void +test_round_down_pow2(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + int n; + + for (n = 0; n < 32; n++) { + /* Min, max value for which ROUND_DOWN_POW2 should yield (1 << n). */ + uint32_t min = 1u << n; + uint32_t max = ((1u << n) << 1) - 1; + + check_rdp2(min, 1u << n); + check_rdp2(max, 1u << n); + check_rdp2(random_in_range(min, max), 1u << n); + } + check_rdp2(0, 0); +} + +static void +shuffle(uint64_t *p, size_t n) { for (; n > 1; n--, p++) { - unsigned int *q = &p[rand() % n]; - unsigned int tmp = *p; + uint64_t *q = &p[random_range(n)]; + uint64_t tmp = *p; *p = *q; *q = tmp; } } static void -check_popcount(uint32_t x, int n) +check_count_1bits(uint64_t x, int n) { - if (popcount(x) != n) { - fprintf(stderr, "popcount(%#"PRIx32") is %d but should be %d\n", - x, popcount(x), n); + if (count_1bits(x) != n) { + fprintf(stderr, "count_1bits(%#"PRIx64") is %d but should be %d\n", + x, count_1bits(x), n); abort(); } } static void -test_popcount(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +test_count_1bits(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { - unsigned int bits[32]; + uint64_t bits[64]; int i; for (i = 0; i < ARRAY_SIZE(bits); i++) { - bits[i] = 1u << i; + bits[i] = UINT64_C(1) << i; } - check_popcount(0, 0); + check_count_1bits(0, 0); for (i = 0; i < 1000; i++) { - uint32_t x = 0; + uint64_t x = 0; int j; shuffle(bits, ARRAY_SIZE(bits)); - for (j = 0; j < 32; j++) { + for (j = 0; j < 64; j++) { x |= bits[j]; - check_popcount(x, j + 1); + check_count_1bits(x, j + 1); } - assert(x == UINT32_MAX); + assert(x == UINT64_MAX); shuffle(bits, ARRAY_SIZE(bits)); - for (j = 31; j >= 0; j--) { + for (j = 63; j >= 0; j--) { x &= ~bits[j]; - check_popcount(x, j); + check_count_1bits(x, j); } assert(x == 0); } @@ -254,7 +395,7 @@ test_bitwise_one(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) ovs_be64 expect; if (n_bits == 64) { - expect = htonll(UINT64_MAX); + expect = OVS_BE64_MAX; } else { uint64_t mask = (UINT64_C(1) << n_bits) - 1; expect = orig_dst | htonll(mask << dst_ofs); @@ -295,7 +436,7 @@ test_bitwise_is_all_zeros(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) /* Change a random 0-bit into a 1-bit. */ do { - bit = htonll(UINT64_C(1) << (random_uint32() % 64)); + bit = htonll(UINT64_C(1) << (random_range(64))); } while (x & bit); x |= bit; @@ -335,23 +476,617 @@ test_follow_symlinks(int argc, char *argv[]) free(target); } } + +static void +test_assert(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + ovs_assert(false); +} + +static void +test_ovs_scan(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + char str[16], str2[16], str3[16]; + long double ld, ld2; + long long ll, ll2; + signed char c, c2; + ptrdiff_t pd, pd2; + intmax_t im, im2; + size_t sz, sz2; + int n, n2, n3; + double d, d2; + short s, s2; + float f, f2; + long l, l2; + int i, i2; + + ovs_assert(ovs_scan("", "")); + ovs_assert(ovs_scan("", " ")); + ovs_assert(ovs_scan(" ", " ")); + ovs_assert(ovs_scan(" ", " ")); + ovs_assert(ovs_scan(" \t ", " ")); + + ovs_assert(ovs_scan("xyzzy", "xyzzy")); + ovs_assert(ovs_scan("xy%zzy", "xy%%zzy")); + ovs_assert(!ovs_scan(" xy%zzy", "xy%%zzy")); + ovs_assert(ovs_scan(" xy%\tzzy", " xy%% zzy")); + + ovs_assert(ovs_scan("123", "%d", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("0", "%d", &i)); + ovs_assert(i == 0); + ovs_assert(!ovs_scan("123", "%d%d", &i, &i2)); + ovs_assert(ovs_scan("+123", "%d", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("-123", "%d", &i)); + ovs_assert(i == -123); + ovs_assert(ovs_scan("0123", "%d", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan(" 123", "%d", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("0x123", "%d", &i)); + ovs_assert(i == 0); + ovs_assert(ovs_scan("123", "%2d %d", &i, &i2)); + ovs_assert(i == 12); + ovs_assert(i2 == 3); + ovs_assert(ovs_scan("+123", "%2d %d", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("-123", "%2d %d", &i, &i2)); + ovs_assert(i == -1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("0123", "%2d %d", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("123", "%*2d %d", &i)); + ovs_assert(i == 3); + ovs_assert(ovs_scan("+123", "%2d %*d", &i)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("-123", "%*2d %*d")); + + ovs_assert(ovs_scan("123", "%u", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("0", "%u", &i)); + ovs_assert(i == 0); + ovs_assert(!ovs_scan("123", "%u%u", &i, &i2)); + ovs_assert(ovs_scan("+123", "%u", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("-123", "%u", &i)); + ovs_assert(i == -123); + ovs_assert(ovs_scan("0123", "%u", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan(" 123", "%u", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("0x123", "%u", &i)); + ovs_assert(i == 0); + ovs_assert(ovs_scan("123", "%2u %u", &i, &i2)); + ovs_assert(i == 12); + ovs_assert(i2 == 3); + ovs_assert(ovs_scan("+123", "%2u %u", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("-123", "%2u %u", &i, &i2)); + ovs_assert(i == -1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("0123", "%2u %u", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("123", "%*2u %u", &i)); + ovs_assert(i == 3); + ovs_assert(ovs_scan("+123", "%2u %*u", &i)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("-123", "%*2u %*u")); + + ovs_assert(ovs_scan("123", "%i", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("0", "%i", &i)); + ovs_assert(i == 0); + ovs_assert(!ovs_scan("123", "%i%i", &i, &i2)); + ovs_assert(ovs_scan("+123", "%i", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("-123", "%i", &i)); + ovs_assert(i == -123); + ovs_assert(ovs_scan("0123", "%i", &i)); + ovs_assert(i == 0123); + ovs_assert(ovs_scan(" 123", "%i", &i)); + ovs_assert(i == 123); + ovs_assert(ovs_scan("0x123", "%i", &i)); + ovs_assert(i == 0x123); + ovs_assert(ovs_scan("123", "%2i %i", &i, &i2)); + ovs_assert(i == 12); + ovs_assert(i2 == 3); + ovs_assert(ovs_scan("+123", "%2i %i", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("-123", "%2i %i", &i, &i2)); + ovs_assert(i == -1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("0123", "%2i %i", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("123", "%*2i %i", &i)); + ovs_assert(i == 3); + ovs_assert(ovs_scan("+123", "%2i %*i", &i)); + ovs_assert(i == 1); + ovs_assert(i2 == 23); + ovs_assert(ovs_scan("-123", "%*2i %*i")); + + ovs_assert(ovs_scan("123", "%o", &i)); + ovs_assert(i == 0123); + ovs_assert(ovs_scan("0", "%o", &i)); + ovs_assert(i == 0); + ovs_assert(!ovs_scan("123", "%o%o", &i, &i2)); + ovs_assert(ovs_scan("+123", "%o", &i)); + ovs_assert(i == 0123); + ovs_assert(ovs_scan("-123", "%o", &i)); + ovs_assert(i == -0123); + ovs_assert(ovs_scan("0123", "%o", &i)); + ovs_assert(i == 0123); + ovs_assert(ovs_scan(" 123", "%o", &i)); + ovs_assert(i == 0123); + ovs_assert(ovs_scan("0x123", "%o", &i)); + ovs_assert(i == 0); + ovs_assert(ovs_scan("123", "%2o %o", &i, &i2)); + ovs_assert(i == 012); + ovs_assert(i2 == 3); + ovs_assert(ovs_scan("+123", "%2o %o", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 023); + ovs_assert(ovs_scan("-123", "%2o %o", &i, &i2)); + ovs_assert(i == -1); + ovs_assert(i2 == 023); + ovs_assert(ovs_scan("0123", "%2o %o", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 023); + ovs_assert(ovs_scan("123", "%*2o %o", &i)); + ovs_assert(i == 3); + ovs_assert(ovs_scan("+123", "%2o %*o", &i)); + ovs_assert(i == 1); + ovs_assert(i2 == 023); + ovs_assert(ovs_scan("-123", "%*2o %*o")); + + ovs_assert(ovs_scan("123", "%x", &i)); + ovs_assert(i == 0x123); + ovs_assert(ovs_scan("0", "%x", &i)); + ovs_assert(i == 0); + ovs_assert(!ovs_scan("123", "%x%x", &i, &i2)); + ovs_assert(ovs_scan("+123", "%x", &i)); + ovs_assert(i == 0x123); + ovs_assert(ovs_scan("-123", "%x", &i)); + ovs_assert(i == -0x123); + ovs_assert(ovs_scan("0123", "%x", &i)); + ovs_assert(i == 0x123); + ovs_assert(ovs_scan(" 123", "%x", &i)); + ovs_assert(i == 0x123); + ovs_assert(ovs_scan("0x123", "%x", &i)); + ovs_assert(i == 0x123); + ovs_assert(ovs_scan("123", "%2x %x", &i, &i2)); + ovs_assert(i == 0x12); + ovs_assert(i2 == 3); + ovs_assert(ovs_scan("+123", "%2x %x", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 0x23); + ovs_assert(ovs_scan("-123", "%2x %x", &i, &i2)); + ovs_assert(i == -1); + ovs_assert(i2 == 0x23); + ovs_assert(ovs_scan("0123", "%2x %x", &i, &i2)); + ovs_assert(i == 1); + ovs_assert(i2 == 0x23); + ovs_assert(ovs_scan("123", "%*2x %x", &i)); + ovs_assert(i == 3); + ovs_assert(ovs_scan("+123", "%2x %*x", &i)); + ovs_assert(i == 1); + ovs_assert(i2 == 0x23); + ovs_assert(ovs_scan("-123", "%*2x %*x")); + + ovs_assert(ovs_scan("123", "%hd", &s)); + ovs_assert(s == 123); + ovs_assert(!ovs_scan("123", "%hd%hd", &s, &s2)); + ovs_assert(ovs_scan("+123", "%hd", &s)); + ovs_assert(s == 123); + ovs_assert(ovs_scan("-123", "%hd", &s)); + ovs_assert(s == -123); + ovs_assert(ovs_scan("0123", "%hd", &s)); + ovs_assert(s == 123); + ovs_assert(ovs_scan(" 123", "%hd", &s)); + ovs_assert(s == 123); + ovs_assert(ovs_scan("0x123", "%hd", &s)); + ovs_assert(s == 0); + ovs_assert(ovs_scan("123", "%2hd %hd", &s, &s2)); + ovs_assert(s == 12); + ovs_assert(s2 == 3); + ovs_assert(ovs_scan("+123", "%2hd %hd", &s, &s2)); + ovs_assert(s == 1); + ovs_assert(s2 == 23); + ovs_assert(ovs_scan("-123", "%2hd %hd", &s, &s2)); + ovs_assert(s == -1); + ovs_assert(s2 == 23); + ovs_assert(ovs_scan("0123", "%2hd %hd", &s, &s2)); + ovs_assert(s == 1); + ovs_assert(s2 == 23); + + ovs_assert(ovs_scan("123", "%hhd", &c)); + ovs_assert(c == 123); + ovs_assert(ovs_scan("0", "%hhd", &c)); + ovs_assert(c == 0); + ovs_assert(!ovs_scan("123", "%hhd%hhd", &c, &c2)); + ovs_assert(ovs_scan("+123", "%hhd", &c)); + ovs_assert(c == 123); + ovs_assert(ovs_scan("-123", "%hhd", &c)); + ovs_assert(c == -123); + ovs_assert(ovs_scan("0123", "%hhd", &c)); + ovs_assert(c == 123); + ovs_assert(ovs_scan(" 123", "%hhd", &c)); + ovs_assert(c == 123); + ovs_assert(ovs_scan("0x123", "%hhd", &c)); + ovs_assert(c == 0); + ovs_assert(ovs_scan("123", "%2hhd %hhd", &c, &c2)); + ovs_assert(c == 12); + ovs_assert(c2 == 3); + ovs_assert(ovs_scan("+123", "%2hhd %hhd", &c, &c2)); + ovs_assert(c == 1); + ovs_assert(c2 == 23); + ovs_assert(ovs_scan("-123", "%2hhd %hhd", &c, &c2)); + ovs_assert(c == -1); + ovs_assert(c2 == 23); + ovs_assert(ovs_scan("0123", "%2hhd %hhd", &c, &c2)); + ovs_assert(c == 1); + ovs_assert(c2 == 23); + + ovs_assert(ovs_scan("123", "%ld", &l)); + ovs_assert(l == 123); + ovs_assert(ovs_scan("0", "%ld", &l)); + ovs_assert(l == 0); + ovs_assert(!ovs_scan("123", "%ld%ld", &l, &l2)); + ovs_assert(ovs_scan("+123", "%ld", &l)); + ovs_assert(l == 123); + ovs_assert(ovs_scan("-123", "%ld", &l)); + ovs_assert(l == -123); + ovs_assert(ovs_scan("0123", "%ld", &l)); + ovs_assert(l == 123); + ovs_assert(ovs_scan(" 123", "%ld", &l)); + ovs_assert(l == 123); + ovs_assert(ovs_scan("0x123", "%ld", &l)); + ovs_assert(l == 0); + ovs_assert(ovs_scan("123", "%2ld %ld", &l, &l2)); + ovs_assert(l == 12); + ovs_assert(l2 == 3); + ovs_assert(ovs_scan("+123", "%2ld %ld", &l, &l2)); + ovs_assert(l == 1); + ovs_assert(l2 == 23); + ovs_assert(ovs_scan("-123", "%2ld %ld", &l, &l2)); + ovs_assert(l == -1); + ovs_assert(l2 == 23); + ovs_assert(ovs_scan("0123", "%2ld %ld", &l, &l2)); + ovs_assert(l == 1); + ovs_assert(l2 == 23); + + ovs_assert(ovs_scan("123", "%lld", &ll)); + ovs_assert(ll == 123); + ovs_assert(ovs_scan("0", "%lld", &ll)); + ovs_assert(ll == 0); + ovs_assert(!ovs_scan("123", "%lld%lld", &ll, &ll2)); + ovs_assert(ovs_scan("+123", "%lld", &ll)); + ovs_assert(ll == 123); + ovs_assert(ovs_scan("-123", "%lld", &ll)); + ovs_assert(ll == -123); + ovs_assert(ovs_scan("0123", "%lld", &ll)); + ovs_assert(ll == 123); + ovs_assert(ovs_scan(" 123", "%lld", &ll)); + ovs_assert(ll == 123); + ovs_assert(ovs_scan("0x123", "%lld", &ll)); + ovs_assert(ll == 0); + ovs_assert(ovs_scan("123", "%2lld %lld", &ll, &ll2)); + ovs_assert(ll == 12); + ovs_assert(ll2 == 3); + ovs_assert(ovs_scan("+123", "%2lld %lld", &ll, &ll2)); + ovs_assert(ll == 1); + ovs_assert(ll2 == 23); + ovs_assert(ovs_scan("-123", "%2lld %lld", &ll, &ll2)); + ovs_assert(ll == -1); + ovs_assert(ll2 == 23); + ovs_assert(ovs_scan("0123", "%2lld %lld", &ll, &ll2)); + ovs_assert(ll == 1); + ovs_assert(ll2 == 23); + + ovs_assert(ovs_scan("123", "%jd", &im)); + ovs_assert(im == 123); + ovs_assert(ovs_scan("0", "%jd", &im)); + ovs_assert(im == 0); + ovs_assert(!ovs_scan("123", "%jd%jd", &im, &im2)); + ovs_assert(ovs_scan("+123", "%jd", &im)); + ovs_assert(im == 123); + ovs_assert(ovs_scan("-123", "%jd", &im)); + ovs_assert(im == -123); + ovs_assert(ovs_scan("0123", "%jd", &im)); + ovs_assert(im == 123); + ovs_assert(ovs_scan(" 123", "%jd", &im)); + ovs_assert(im == 123); + ovs_assert(ovs_scan("0x123", "%jd", &im)); + ovs_assert(im == 0); + ovs_assert(ovs_scan("123", "%2jd %jd", &im, &im2)); + ovs_assert(im == 12); + ovs_assert(im2 == 3); + ovs_assert(ovs_scan("+123", "%2jd %jd", &im, &im2)); + ovs_assert(im == 1); + ovs_assert(im2 == 23); + ovs_assert(ovs_scan("-123", "%2jd %jd", &im, &im2)); + ovs_assert(im == -1); + ovs_assert(im2 == 23); + ovs_assert(ovs_scan("0123", "%2jd %jd", &im, &im2)); + ovs_assert(im == 1); + ovs_assert(im2 == 23); + + ovs_assert(ovs_scan("123", "%td", &pd)); + ovs_assert(pd == 123); + ovs_assert(ovs_scan("0", "%td", &pd)); + ovs_assert(pd == 0); + ovs_assert(!ovs_scan("123", "%td%td", &pd, &pd2)); + ovs_assert(ovs_scan("+123", "%td", &pd)); + ovs_assert(pd == 123); + ovs_assert(ovs_scan("-123", "%td", &pd)); + ovs_assert(pd == -123); + ovs_assert(ovs_scan("0123", "%td", &pd)); + ovs_assert(pd == 123); + ovs_assert(ovs_scan(" 123", "%td", &pd)); + ovs_assert(pd == 123); + ovs_assert(ovs_scan("0x123", "%td", &pd)); + ovs_assert(pd == 0); + ovs_assert(ovs_scan("123", "%2td %td", &pd, &pd2)); + ovs_assert(pd == 12); + ovs_assert(pd2 == 3); + ovs_assert(ovs_scan("+123", "%2td %td", &pd, &pd2)); + ovs_assert(pd == 1); + ovs_assert(pd2 == 23); + ovs_assert(ovs_scan("-123", "%2td %td", &pd, &pd2)); + ovs_assert(pd == -1); + ovs_assert(pd2 == 23); + ovs_assert(ovs_scan("0123", "%2td %td", &pd, &pd2)); + ovs_assert(pd == 1); + ovs_assert(pd2 == 23); + + ovs_assert(ovs_scan("123", "%zd", &sz)); + ovs_assert(sz == 123); + ovs_assert(ovs_scan("0", "%zd", &sz)); + ovs_assert(sz == 0); + ovs_assert(!ovs_scan("123", "%zd%zd", &sz, &sz2)); + ovs_assert(ovs_scan("+123", "%zd", &sz)); + ovs_assert(sz == 123); + ovs_assert(ovs_scan("-123", "%zd", &sz)); + ovs_assert(sz == -123); + ovs_assert(ovs_scan("0123", "%zd", &sz)); + ovs_assert(sz == 123); + ovs_assert(ovs_scan(" 123", "%zd", &sz)); + ovs_assert(sz == 123); + ovs_assert(ovs_scan("0x123", "%zd", &sz)); + ovs_assert(sz == 0); + ovs_assert(ovs_scan("123", "%2zd %zd", &sz, &sz2)); + ovs_assert(sz == 12); + ovs_assert(sz2 == 3); + ovs_assert(ovs_scan("+123", "%2zd %zd", &sz, &sz2)); + ovs_assert(sz == 1); + ovs_assert(sz2 == 23); + ovs_assert(ovs_scan("-123", "%2zd %zd", &sz, &sz2)); + ovs_assert(sz == -1); + ovs_assert(sz2 == 23); + ovs_assert(ovs_scan("0123", "%2zd %zd", &sz, &sz2)); + ovs_assert(sz == 1); + ovs_assert(sz2 == 23); + + ovs_assert(ovs_scan("0.25", "%f", &f)); + ovs_assert(f == 0.25); + ovs_assert(ovs_scan("1.0", "%f", &f)); + ovs_assert(f == 1.0); + ovs_assert(ovs_scan("-5", "%f", &f)); + ovs_assert(f == -5.0); + ovs_assert(ovs_scan("+6", "%f", &f)); + ovs_assert(f == 6.0); + ovs_assert(ovs_scan("-1e5", "%f", &f)); + ovs_assert(f == -1e5); + ovs_assert(ovs_scan("-.25", "%f", &f)); + ovs_assert(f == -.25); + ovs_assert(ovs_scan("+123.e1", "%f", &f)); + ovs_assert(f == 1230.0); + ovs_assert(ovs_scan("25e-2", "%f", &f)); + ovs_assert(f == 0.25); + ovs_assert(ovs_scan("0.25", "%1f %f", &f, &f2)); + ovs_assert(f == 0); + ovs_assert(f2 == 0.25); + ovs_assert(ovs_scan("1.0", "%2f %f", &f, &f2)); + ovs_assert(f == 1.0); + ovs_assert(f2 == 0.0); + ovs_assert(!ovs_scan("-5", "%1f", &f)); + ovs_assert(!ovs_scan("+6", "%1f", &f)); + ovs_assert(!ovs_scan("-1e5", "%2f %*f", &f)); + ovs_assert(f == -1); + ovs_assert(!ovs_scan("-.25", "%2f", &f)); + ovs_assert(!ovs_scan("+123.e1", "%6f", &f)); + ovs_assert(!ovs_scan("25e-2", "%4f", &f)); + + ovs_assert(ovs_scan("0.25", "%lf", &d)); + ovs_assert(d == 0.25); + ovs_assert(ovs_scan("1.0", "%lf", &d)); + ovs_assert(d == 1.0); + ovs_assert(ovs_scan("-5", "%lf", &d)); + ovs_assert(d == -5.0); + ovs_assert(ovs_scan("+6", "%lf", &d)); + ovs_assert(d == 6.0); + ovs_assert(ovs_scan("-1e5", "%lf", &d)); + ovs_assert(d == -1e5); + ovs_assert(ovs_scan("-.25", "%lf", &d)); + ovs_assert(d == -.25); + ovs_assert(ovs_scan("+123.e1", "%lf", &d)); + ovs_assert(d == 1230.0); + ovs_assert(ovs_scan("25e-2", "%lf", &d)); + ovs_assert(d == 0.25); + ovs_assert(ovs_scan("0.25", "%1lf %lf", &d, &d2)); + ovs_assert(d == 0); + ovs_assert(d2 == 0.25); + ovs_assert(ovs_scan("1.0", "%2lf %lf", &d, &d2)); + ovs_assert(d == 1.0); + ovs_assert(d2 == 0.0); + ovs_assert(!ovs_scan("-5", "%1lf", &d)); + ovs_assert(!ovs_scan("+6", "%1lf", &d)); + ovs_assert(!ovs_scan("-1e5", "%2lf %*f", &d)); + ovs_assert(d == -1); + ovs_assert(!ovs_scan("-.25", "%2lf", &d)); + ovs_assert(!ovs_scan("+123.e1", "%6lf", &d)); + ovs_assert(!ovs_scan("25e-2", "%4lf", &d)); + + ovs_assert(ovs_scan("0.25", "%Lf", &ld)); + ovs_assert(ld == 0.25); + ovs_assert(ovs_scan("1.0", "%Lf", &ld)); + ovs_assert(ld == 1.0); + ovs_assert(ovs_scan("-5", "%Lf", &ld)); + ovs_assert(ld == -5.0); + ovs_assert(ovs_scan("+6", "%Lf", &ld)); + ovs_assert(ld == 6.0); + ovs_assert(ovs_scan("-1e5", "%Lf", &ld)); + ovs_assert(ld == -1e5); + ovs_assert(ovs_scan("-.25", "%Lf", &ld)); + ovs_assert(ld == -.25); + ovs_assert(ovs_scan("+123.e1", "%Lf", &ld)); + ovs_assert(ld == 1230.0); + ovs_assert(ovs_scan("25e-2", "%Lf", &ld)); + ovs_assert(ld == 0.25); + ovs_assert(ovs_scan("0.25", "%1Lf %Lf", &ld, &ld2)); + ovs_assert(ld == 0); + ovs_assert(ld2 == 0.25); + ovs_assert(ovs_scan("1.0", "%2Lf %Lf", &ld, &ld2)); + ovs_assert(ld == 1.0); + ovs_assert(ld2 == 0.0); + ovs_assert(!ovs_scan("-5", "%1Lf", &ld)); + ovs_assert(!ovs_scan("+6", "%1Lf", &ld)); + ovs_assert(!ovs_scan("-1e5", "%2Lf %*f", &ld)); + ovs_assert(ld == -1); + ovs_assert(!ovs_scan("-.25", "%2Lf", &ld)); + ovs_assert(!ovs_scan("+123.e1", "%6Lf", &ld)); + ovs_assert(!ovs_scan("25e-2", "%4Lf", &ld)); + + ovs_assert(ovs_scan(" Hello,\tworld ", "%*s%n%*s%n", &n, &n2)); + ovs_assert(n == 7); + ovs_assert(n2 == 13); + ovs_assert(!ovs_scan(" Hello,\tworld ", "%*s%*s%*s")); + ovs_assert(ovs_scan(" Hello,\tworld ", "%6s%n%5s%n", str, &n, str2, &n2)); + ovs_assert(!strcmp(str, "Hello,")); + ovs_assert(n == 7); + ovs_assert(!strcmp(str2, "world")); + ovs_assert(n2 == 13); + ovs_assert(ovs_scan(" Hello,\tworld ", "%5s%5s%5s", str, str2, str3)); + ovs_assert(!strcmp(str, "Hello")); + ovs_assert(!strcmp(str2, ",")); + ovs_assert(!strcmp(str3, "world")); + ovs_assert(!ovs_scan(" ", "%*s")); + + ovs_assert(ovs_scan(" Hello,\tworld ", "%*c%n%*c%n%c%n", + &n, &n2, &c, &n3)); + ovs_assert(n == 1); + ovs_assert(n2 == 2); + ovs_assert(c == 'e'); + ovs_assert(n3 == 3); + ovs_assert(ovs_scan(" Hello,\tworld ", "%*5c%5c", str)); + ovs_assert(!memcmp(str, "o,\two", 5)); + ovs_assert(!ovs_scan(" Hello,\tworld ", "%*15c")); + + ovs_assert(ovs_scan("0x1234xyzzy", "%9[x0-9a-fA-F]%n", str, &n)); + ovs_assert(!strcmp(str, "0x1234x")); + ovs_assert(n == 7); + ovs_assert(ovs_scan("foo:bar=baz", "%5[^:=]%n:%5[^:=]%n=%5[^:=]%n", + str, &n, str2, &n2, str3, &n3)); + ovs_assert(!strcmp(str, "foo")); + ovs_assert(n == 3); + ovs_assert(!strcmp(str2, "bar")); + ovs_assert(n2 == 7); + ovs_assert(!strcmp(str3, "baz")); + ovs_assert(n3 == 11); + ovs_assert(!ovs_scan(" ", "%*[0-9]")); + ovs_assert(ovs_scan("0x123a]4xyzzy-", "%[]x0-9a-fA-F]", str)); + ovs_assert(!strcmp(str, "0x123a]4x")); + ovs_assert(ovs_scan("abc]xyz","%[^]xyz]", str)); + ovs_assert(!strcmp(str, "abc")); + ovs_assert(!ovs_scan("0x123a]4xyzzy-", "%[x0-9]a-fA-F]", str)); + ovs_assert(ovs_scan("0x12-3]xyz", "%[x0-9a-f-]", str)); + ovs_assert(!strcmp(str, "0x12-3")); + ovs_assert(ovs_scan("0x12-3]xyz", "%[^a-f-]", str)); + ovs_assert(!strcmp(str, "0x12")); + ovs_assert(sscanf("0x12-3]xyz", "%[^-a-f]", str)); + ovs_assert(!strcmp(str, "0x12")); +} + +static void +test_snprintf(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + char s[16]; + + ovs_assert(snprintf(s, 4, "abcde") == 5); + ovs_assert(!strcmp(s, "abc")); + + ovs_assert(snprintf(s, 5, "abcde") == 5); + ovs_assert(!strcmp(s, "abcd")); + + ovs_assert(snprintf(s, 6, "abcde") == 5); + ovs_assert(!strcmp(s, "abcde")); + + ovs_assert(snprintf(NULL, 0, "abcde") == 5); +} static const struct command commands[] = { {"ctz", 0, 0, test_ctz}, - {"popcount", 0, 0, test_popcount}, + {"clz", 0, 0, test_clz}, + {"round_up_pow2", 0, 0, test_round_up_pow2}, + {"round_down_pow2", 0, 0, test_round_down_pow2}, + {"count_1bits", 0, 0, test_count_1bits}, {"log_2_floor", 0, 0, test_log_2_floor}, {"bitwise_copy", 0, 0, test_bitwise_copy}, {"bitwise_zero", 0, 0, test_bitwise_zero}, {"bitwise_one", 0, 0, test_bitwise_one}, {"bitwise_is_all_zeros", 0, 0, test_bitwise_is_all_zeros}, {"follow-symlinks", 1, INT_MAX, test_follow_symlinks}, + {"assert", 0, 0, test_assert}, + {"ovs_scan", 0, 0, test_ovs_scan}, + {"snprintf", 0, 0, test_snprintf}, {NULL, 0, 0, NULL}, }; -int -main(int argc, char *argv[]) +static void +parse_options(int argc, char *argv[]) +{ + enum { + VLOG_OPTION_ENUMS + }; + static const struct option long_options[] = { + VLOG_LONG_OPTIONS, + {NULL, 0, NULL, 0}, + }; + char *short_options = long_options_to_short_options(long_options); + + for (;;) { + int c = getopt_long(argc, argv, short_options, long_options, NULL); + if (c == -1) { + break; + } + + switch (c) { + VLOG_OPTION_HANDLERS + + case '?': + exit(EXIT_FAILURE); + + default: + abort(); + } + } + free(short_options); +} + +static void +test_util_main(int argc, char *argv[]) { set_program_name(argv[0]); - run_command(argc - 1, argv + 1, commands); - return 0; + parse_options(argc, argv); + run_command(argc - optind, argv + optind, commands); } + +OVSTEST_REGISTER("test-util", test_util_main);