Check if performance module is calculating statistics as expected. Outputs that are currently not as expected have been annotated with FIXME.
Signed-off-by: Jakub Sitnicki <j...@redhat.com> --- tests/automake.mk | 3 +- tests/library.at | 5 ++ tests/test-performance.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 tests/test-performance.c diff --git a/tests/automake.mk b/tests/automake.mk index 18698ebc3..f7ef68059 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -364,7 +364,8 @@ tests_ovstest_SOURCES = \ tests/test-uuid.c \ tests/test-bitmap.c \ tests/test-vconn.c \ - tests/test-aa.c + tests/test-aa.c \ + tests/test-performance.c if !WIN32 tests_ovstest_SOURCES += \ diff --git a/tests/library.at b/tests/library.at index 5efbfbb7c..dc6631376 100644 --- a/tests/library.at +++ b/tests/library.at @@ -251,3 +251,8 @@ AT_CLEANUP AT_SETUP([rcu]) AT_CHECK([ovstest test-rcu-quiesce], [0], []) AT_CLEANUP + +AT_SETUP([performance module]) +AT_CHECK([ovstest test-performance], [0], [.... +], [ignore]) +AT_CLEANUP diff --git a/tests/test-performance.c b/tests/test-performance.c new file mode 100644 index 000000000..b5659dc32 --- /dev/null +++ b/tests/test-performance.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018 Red Hat, Inc. + * + * 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> +#undef NDEBUG +#include "performance.h" +#include <assert.h> +#include <math.h> +#include <stdio.h> +#include "ovstest.h" +#include "util.h" + +#define MAX_SAMPLES 100 +#define UNIT PERF_MS + +struct test_data { + const char *name; + unsigned long long samples[MAX_SAMPLES]; + size_t num_samples; + struct performance_stats expected_stats; +}; + +struct test_data data_sets[] = { + { + .name = "1-interval-zero-length", + .samples = { 1, 1 }, /* FIXME: First sample can't be 0. */ + .num_samples = 2, + .expected_stats = { + .count = 1, + .max = 0, + .min = 0, + .pctl_95 = 0, + .ewma_50 = 0, + .ewma_1 = 0, + }, + }, + { + .name = "1-interval-unit-length", + /* FIXME: First sample can't be 0. */ + .samples = { 1, 2 }, + .num_samples = 2, + .expected_stats = { + .count = 1, + .max = 1, + .min = 0, /* FIXME: min should be 1. */ + .pctl_95 = 0, + .ewma_50 = 1, + .ewma_1 = 1, + }, + }, + { + .name = "10-intervals-unit-length", + .samples = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, + .num_samples = 11, + .expected_stats = { + .count = 10, + .max = 1, + .min = 0, /* FIXME: min should be 1. */ + .pctl_95 = 1, + .ewma_50 = 1, + .ewma_1 = 1, + }, + }, + { + .name = "10-intervals-linear-growth", + .samples = { 1, 2, 4, 7, 11, 16, 22, 29, 37, 46, 56 }, + .num_samples = 11, + .expected_stats = { + .count = 10, + .max = 10, + .min = 0, /* FIXME: min should be 1. */ + .pctl_95 = 5.8, /* FIXME: 95th percentile should be close to 10. */ + .ewma_50 = 9.0, + .ewma_1 = 1.4, + }, + }, +}; + +#define ASSERT_MSG(COND, MSG, ...) \ + if (!(COND)) { \ + fprintf(stderr, MSG "\n", ##__VA_ARGS__); \ + assert(COND); \ + } + +#define ASSERT_ULL_EQ(a, b) \ + ASSERT_MSG(a == b, \ + "Assertion '%s == %s' failed: %llu == %llu", \ + #a, #b, a, b) + +#define ASSERT_DOUBLE_EQ(a, b, eps) \ + ASSERT_MSG(fabs(a - b) < eps, \ + "Assertion '|%s - %s| < %s' failed: |%g - %g| < %g", \ + #a, #b, #eps, a, b, eps) + +#define ASSERT_STATS_EQ(a, b) \ + do { \ + ASSERT_ULL_EQ((a)->count, (b)->count); \ + ASSERT_ULL_EQ((a)->max, (b)->max); \ + ASSERT_ULL_EQ((a)->min, (b)->min); \ + ASSERT_DOUBLE_EQ((a)->pctl_95, (b)->pctl_95, 1e-1); \ + ASSERT_DOUBLE_EQ((a)->ewma_50, (b)->ewma_50, 1e-1); \ + ASSERT_DOUBLE_EQ((a)->ewma_1, (b)->ewma_1, 1e-1); \ + } while (0) + +static void +test_performance_calculate_stats(void) +{ + struct test_data *d; + + for (size_t i = 0; i < ARRAY_SIZE(data_sets); i++) { + d = &data_sets[i]; + + fprintf(stderr, "TEST '%s'\n", d->name); + + performance_create(d->name, UNIT); + for (size_t j = 0; j < d->num_samples - 1; j ++) { + performance_start_sample(d->name, d->samples[j]); + performance_end_sample(d->name, d->samples[j + 1]); + } + performance_sync(); + + struct performance_stats stats = { 0 }; + performance_get_stats(d->name, &stats); + ASSERT_STATS_EQ(&stats, &d->expected_stats); + + printf("."); + } +} + +static void +test_performance_main(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) +{ + test_performance_calculate_stats(); + printf("\n"); +} + +OVSTEST_REGISTER("test-performance", test_performance_main); -- 2.14.3 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev