X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Ftest-util.c;h=3eecc7a4cd62bf3832e78bdb724d61f573864b97;hb=3f0cbe2df696701ad07f61add08692a1eca54f67;hp=23b86e8c8705871171687132d6ed03954548653a;hpb=79a010aa803dc43c7a2d70046f0ad4a2d4cb4a11;p=sliver-openvswitch.git diff --git a/tests/test-util.c b/tests/test-util.c index 23b86e8c8..3eecc7a4c 100644 --- a/tests/test-util.c +++ b/tests/test-util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012 Nicira Networks. + * Copyright (c) 2011, 2012 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,14 +16,20 @@ #include +#include #include #include #include #include #include "byte-order.h" +#include "command-line.h" #include "random.h" #include "util.h" +#include "vlog.h" + +#undef NDEBUG +#include static void check_log_2_floor(uint32_t x, int n) @@ -35,6 +41,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 +70,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 +151,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 +201,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 +242,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 +283,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 +326,73 @@ check_bitwise_is_all_zeros(void) } } -int -main(void) +static void +test_follow_symlinks(int argc, char *argv[]) { - int n; - - 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); + int i; - /* 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); } +} - /* Check ctz(0). - * (log_2_floor(0) is undefined.) */ - check_ctz(0, 32); +static void +test_assert(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + ovs_assert(false); +} + +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}, + {"assert", 0, 0, test_assert}, + {NULL, 0, 0, NULL}, +}; - check_bitwise_copy(); +static void +parse_options(int argc, char *argv[]) +{ + enum { + VLOG_OPTION_ENUMS + }; + static 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; + } - check_bitwise_zero(); + switch (c) { + VLOG_OPTION_HANDLERS - check_bitwise_one(); + case '?': + exit(EXIT_FAILURE); - check_bitwise_is_all_zeros(); + default: + abort(); + } + } + free(short_options); +} +int +main(int argc, char *argv[]) +{ + set_program_name(argv[0]); + parse_options(argc, argv); + run_command(argc - optind, argv + optind, commands); return 0; }