X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Ftest-util.c;h=b98fc79aa3903f0bfe3ddc6d4716aba56b621c2e;hb=9879b94f4381a342c66489dae3b4d4150d0dce6b;hp=c8026c13bf1de44fa628cafb57018a968a23107b;hpb=e0edde6fee279cdbbf3c179f5f50adaf0c7c7f1e;p=openvswitch diff --git a/tests/test-util.c b/tests/test-util.c index c8026c13..b98fc79a 100644 --- a/tests/test-util.c +++ b/tests/test-util.c @@ -22,9 +22,13 @@ #include #include "byte-order.h" +#include "command-line.h" #include "random.h" #include "util.h" +#undef NDEBUG +#include + static void check_log_2_floor(uint32_t x, int n) { @@ -35,6 +39,25 @@ check_log_2_floor(uint32_t x, int n) } } +static void +test_log_2_floor(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_log_2_floor(1 << n, n); + + /* Check maximum x such that f(x) == n. */ + check_log_2_floor((1 << n) | ((1 << n) - 1), n); + + /* Check a random value in the middle. */ + check_log_2_floor((random_uint32() & ((1 << n) - 1)) | (1 << n), n); + } + + /* log_2_floor(0) is undefined, so don't check it. */ +} + static void check_ctz(uint32_t x, int n) { @@ -45,6 +68,79 @@ check_ctz(uint32_t x, int n) } } +static void +test_ctz(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_ctz(1 << n, n); + + /* Check maximum x such that f(x) == n. */ + check_ctz(UINT32_MAX << n, n); + + /* Check a random value in the middle. */ + check_ctz((random_uint32() | 1) << n, n); + } + + /* Check ctz(0). */ + check_ctz(0, 32); +} + +static void +shuffle(unsigned int *p, size_t n) +{ + for (; n > 1; n--, p++) { + unsigned int *q = &p[rand() % n]; + unsigned int tmp = *p; + *p = *q; + *q = tmp; + } +} + +static void +check_popcount(uint32_t x, int n) +{ + if (popcount(x) != n) { + fprintf(stderr, "popcount(%#"PRIx32") is %d but should be %d\n", + x, popcount(x), n); + abort(); + } +} + +static void +test_popcount(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + unsigned int bits[32]; + int i; + + for (i = 0; i < ARRAY_SIZE(bits); i++) { + bits[i] = 1u << i; + } + + check_popcount(0, 0); + + for (i = 0; i < 1000; i++) { + uint32_t x = 0; + int j; + + shuffle(bits, ARRAY_SIZE(bits)); + for (j = 0; j < 32; j++) { + x |= bits[j]; + check_popcount(x, j + 1); + } + assert(x == UINT32_MAX); + + shuffle(bits, ARRAY_SIZE(bits)); + for (j = 31; j >= 0; j--) { + x &= ~bits[j]; + check_popcount(x, j); + } + assert(x == 0); + } +} + /* Returns the sum of the squares of the first 'n' positive integers. */ static unsigned int sum_of_squares(int n) @@ -53,7 +149,7 @@ sum_of_squares(int n) } static void -check_bitwise_copy(void) +test_bitwise_copy(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { unsigned int n_loops; int src_ofs; @@ -103,7 +199,7 @@ check_bitwise_copy(void) } static void -check_bitwise_zero(void) +test_bitwise_zero(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { unsigned int n_loops; int dst_ofs; @@ -144,7 +240,7 @@ check_bitwise_zero(void) } static void -check_bitwise_one(void) +test_bitwise_one(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { unsigned int n_loops; int dst_ofs; @@ -185,11 +281,10 @@ check_bitwise_one(void) } static void -check_bitwise_is_all_zeros(void) +test_bitwise_is_all_zeros(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { int n_loops; - n_loops = 0; for (n_loops = 0; n_loops < 100; n_loops++) { ovs_be64 x = htonll(0); int i; @@ -229,36 +324,34 @@ check_bitwise_is_all_zeros(void) } } -int -main(void) +static void +test_follow_symlinks(int argc, char *argv[]) { - int n; + int i; - for (n = 0; n < 32; n++) { - /* Check minimum x such that f(x) == n. */ - check_log_2_floor(1 << n, n); - check_ctz(1 << n, n); - - /* Check maximum x such that f(x) == n. */ - check_log_2_floor((1 << n) | ((1 << n) - 1), n); - check_ctz(UINT32_MAX << n, n); - - /* Check a random value in the middle. */ - check_log_2_floor((random_uint32() & ((1 << n) - 1)) | (1 << n), n); - check_ctz((random_uint32() | 1) << n, n); + for (i = 1; i < argc; i++) { + char *target = follow_symlinks(argv[i]); + puts(target); + free(target); } +} + +static const struct command commands[] = { + {"ctz", 0, 0, test_ctz}, + {"popcount", 0, 0, test_popcount}, + {"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}, + {NULL, 0, 0, NULL}, +}; - /* Check ctz(0). - * (log_2_floor(0) is undefined.) */ - check_ctz(0, 32); - - check_bitwise_copy(); - - check_bitwise_zero(); - - check_bitwise_one(); - - check_bitwise_is_all_zeros(); - +int +main(int argc, char *argv[]) +{ + set_program_name(argv[0]); + run_command(argc - 1, argv + 1, commands); return 0; }