Suggested-by: Ben Pfaff <b...@nicira.com> Signed-off-by: Kmindg <kmi...@gmail.com> --- tests/automake.mk | 1 + tests/library.at | 5 ++ tests/test-bitmap.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 tests/test-bitmap.c
diff --git a/tests/automake.mk b/tests/automake.mk index 1361fc6..2b88ad2 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -244,6 +244,7 @@ tests_ovstest_SOURCES = \ tests/test-stp.c \ tests/test-util.c \ tests/test-uuid.c \ + tests/test-bitmap.c \ tests/test-vconn.c if !WIN32 diff --git a/tests/library.at b/tests/library.at index a5dfd82..ca174bb 100644 --- a/tests/library.at +++ b/tests/library.at @@ -200,3 +200,8 @@ AT_CLEANUP AT_SETUP([snprintf]) AT_CHECK([ovstest test-util snprintf]) AT_CLEANUP + +AT_SETUP([test bitmap functions]) +AT_CHECK([ovstest test-bitmap check], [0], [.. +]) +AT_CLEANUP diff --git a/tests/test-bitmap.c b/tests/test-bitmap.c new file mode 100644 index 0000000..b1274e3 --- /dev/null +++ b/tests/test-bitmap.c @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2014 Kmindg <kmi...@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <config.h> +#include "bitmap.h" +#include "ovstest.h" +#include "timeval.h" +#include "command-line.h" + +#undef NDEBUG +#include <assert.h> + +enum { MAX_BITS = 20 * BITMAP_ULONG_BITS }; + +static int +elapsed(const struct timeval *start) +{ + struct timeval end; + + xgettimeofday(&end); + return timeval_to_msec(&end) - timeval_to_msec(start); +} + +/* Tests bitmap_equal. */ +static void +test_bitmap_equal(void) +{ + unsigned long *a, *b; + + a = bitmap_allocate(MAX_BITS); + b = bitmap_allocate(MAX_BITS); + + /* equal test */ + assert(bitmap_equal(a, b, MAX_BITS)); + assert(bitmap_equal(a, b, MAX_BITS - 1)); + assert(bitmap_equal(a, b, MAX_BITS - (BITMAP_ULONG_BITS - 1))); + + bitmap_set_multiple(a, 10 * BITMAP_ULONG_BITS, BITMAP_ULONG_BITS, true); + assert(bitmap_equal(a, b, 10 * BITMAP_ULONG_BITS)); + + /* non-equal test */ + assert(!bitmap_equal(a, b, 11 * BITMAP_ULONG_BITS)); + assert(!bitmap_equal(a, b, 11 * BITMAP_ULONG_BITS - 1)); + assert(!bitmap_equal(a, b, + 11 * BITMAP_ULONG_BITS - (BITMAP_ULONG_BITS - 1))); +} + +/* Tests bitmap_scan. */ +static void +test_bitmap_scan(void) +{ + unsigned long *a; + + a = bitmap_allocate(MAX_BITS); + + /* scan for 1 */ + assert(bitmap_scan(a, true, 1, BITMAP_ULONG_BITS) == BITMAP_ULONG_BITS); + assert(bitmap_scan(a, true, BITMAP_ULONG_BITS - 1, BITMAP_ULONG_BITS) + == BITMAP_ULONG_BITS); + assert(bitmap_scan(a, true, 0, BITMAP_ULONG_BITS) == BITMAP_ULONG_BITS); + assert(bitmap_scan(a, true, 0, BITMAP_ULONG_BITS + 1) + == BITMAP_ULONG_BITS + 1); + assert(bitmap_scan(a, true, 0, 2 * BITMAP_ULONG_BITS - 1) + == 2 * BITMAP_ULONG_BITS - 1); + + bitmap_set1(a, MAX_BITS - 1); + assert(bitmap_scan(a, true, 0, MAX_BITS) == MAX_BITS - 1); + bitmap_set1(a, MAX_BITS - BITMAP_ULONG_BITS + 1); + assert(bitmap_scan(a, true, 0, MAX_BITS - 1) + == MAX_BITS - BITMAP_ULONG_BITS + 1); + bitmap_set1(a, BITMAP_ULONG_BITS - 1); + assert(bitmap_scan(a, true, 0, MAX_BITS - 1) == BITMAP_ULONG_BITS - 1); + bitmap_set1(a, 0); + assert(bitmap_scan(a, true, 0, MAX_BITS - 1) == 0); + + bitmap_set_multiple(a, 0, MAX_BITS, true); + + /* scan for 0 */ + assert(bitmap_scan(a, false, 1, BITMAP_ULONG_BITS) == BITMAP_ULONG_BITS); + assert(bitmap_scan(a, false, BITMAP_ULONG_BITS - 1, BITMAP_ULONG_BITS) + == BITMAP_ULONG_BITS); + assert(bitmap_scan(a, false, 0, BITMAP_ULONG_BITS) == BITMAP_ULONG_BITS); + assert(bitmap_scan(a, false, 0, BITMAP_ULONG_BITS + 1) + == BITMAP_ULONG_BITS + 1); + assert(bitmap_scan(a, false, 0, 2 * BITMAP_ULONG_BITS - 1) + == 2 * BITMAP_ULONG_BITS - 1); + + bitmap_set0(a, MAX_BITS - 1); + assert(bitmap_scan(a, false, 0, MAX_BITS) == MAX_BITS - 1); + bitmap_set0(a, MAX_BITS - BITMAP_ULONG_BITS + 1); + assert(bitmap_scan(a, false, 0, MAX_BITS - 1) + == MAX_BITS - BITMAP_ULONG_BITS + 1); + bitmap_set0(a, BITMAP_ULONG_BITS - 1); + assert(bitmap_scan(a, false, 0, MAX_BITS - 1) == BITMAP_ULONG_BITS - 1); + bitmap_set0(a, 0); + assert(bitmap_scan(a, false, 0, MAX_BITS - 1) == 0); +} + +static void +run_test(void (*function)(void)) +{ + function(); + printf("."); +} + +static void +run_tests(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + run_test(test_bitmap_equal); + run_test(test_bitmap_scan); + printf("\n"); +} + +static void +run_benchmarks(int argc OVS_UNUSED, char *argv[]) +{ + int n_iter = strtol(argv[1], NULL, 10); + struct timeval start; + + xgettimeofday(&start); + for (int i = 0; i < n_iter; i++) { + test_bitmap_equal(); + } + printf("bitmap equal: %5d ms\n", elapsed(&start)); + + xgettimeofday(&start); + for (int i = 0; i < n_iter; i++) { + test_bitmap_scan(); + } + printf("bitmap scan: %5d ms\n", elapsed(&start)); + printf("\n"); +} + +static const struct command commands[] = { + {"check", 0, 0, run_tests}, + {"benchmark", 1, 1, run_benchmarks}, + {NULL, 0, 0, NULL}, +}; + +static void +test_bitmap_main(int argc, char *argv[]) +{ + set_program_name(argv[0]); + run_command(argc - 1, argv + 1, commands); +} + +OVSTEST_REGISTER("test-bitmap", test_bitmap_main); -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev