diff mbox series

[ovs-dev,3/3] tests: Add tests for performance library module

Message ID 20180228141715.23882-4-jkbs@redhat.com
State Changes Requested
Headers show
Series [ovs-dev,1/3] performance: Add API for retrieving calculated statistics | expand

Commit Message

Jakub Sitnicki Feb. 28, 2018, 2:17 p.m. UTC
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 <jkbs@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

--
2.14.3

Comments

Ben Pfaff Feb. 28, 2018, 9:36 p.m. UTC | #1
On Wed, Feb 28, 2018 at 03:17:15PM +0100, Jakub Sitnicki wrote:
> 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 <jkbs@redhat.com>

Clang does not like one piece of code:

../tests/test-performance.c:135:46: error: missing field 'unit' initializer [-Werror,-Wmissing-field-initializers]

"sparse" pointed out that variables should be "static":

../tests/test-performance.c:36:18: error: symbol 'data_sets' was not declared. Should it be static?
Jakub Sitnicki March 1, 2018, 10:18 a.m. UTC | #2
On Wed, 28 Feb 2018 13:36:34 -0800
Ben Pfaff <blp@ovn.org> wrote:

> On Wed, Feb 28, 2018 at 03:17:15PM +0100, Jakub Sitnicki wrote:
> > 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 <jkbs@redhat.com>  
> 
> Clang does not like one piece of code:
> 
> ../tests/test-performance.c:135:46: error: missing field 'unit' initializer [-Werror,-Wmissing-field-initializers]
> 
> "sparse" pointed out that variables should be "static":
> 
> ../tests/test-performance.c:36:18: error: symbol 'data_sets' was not declared. Should it be static?

Thank you for reporting these errors.

I will correct them and coordinate with Mark.

-Jakub
diff mbox series

Patch

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);