net-tools/tests/ping/stats/test_stats.c
2026-03-16 22:20:06 +01:00

115 lines
3.2 KiB
C

#include <criterion/criterion.h>
#include <stdint.h>
#include <math.h>
#include "internal/ping/stats.h"
Test(ping_stats, init_neutral)
{
struct ping_stats s;
double min_ms, max_ms, avg_ms, mdev_ms;
ping_stats_init(&s);
cr_assert_eq(s.count, (size_t)0);
ping_stats_get(&s, &min_ms, &max_ms, &avg_ms, &mdev_ms);
cr_assert_float_eq(min_ms, 0.0, 1e-9);
cr_assert_float_eq(max_ms, 0.0, 1e-9);
cr_assert_float_eq(avg_ms, 0.0, 1e-9);
cr_assert_float_eq(mdev_ms, 0.0, 1e-9);
}
Test(ping_stats, single_update)
{
struct ping_stats s;
double min_ms, max_ms, avg_ms, mdev_ms;
ping_stats_init(&s);
ping_stats_update(&s, 10000000LL); /* 10 ms */
ping_stats_get(&s, &min_ms, &max_ms, &avg_ms, &mdev_ms);
cr_assert_float_eq(min_ms, 10.0, 1e-6);
cr_assert_float_eq(max_ms, 10.0, 1e-6);
cr_assert_float_eq(avg_ms, 10.0, 1e-6);
cr_assert_float_eq(mdev_ms, 0.0, 1e-3);
}
Test(ping_stats, multiple_updates)
{
struct ping_stats s;
double min_ms, max_ms, avg_ms, mdev_ms;
ping_stats_init(&s);
ping_stats_update(&s, 10000000LL); /* 10 ms */
ping_stats_update(&s, 20000000LL); /* 20 ms */
ping_stats_update(&s, 30000000LL); /* 30 ms */
ping_stats_get(&s, &min_ms, &max_ms, &avg_ms, &mdev_ms);
cr_assert_float_eq(min_ms, 10.0, 1e-6);
cr_assert_float_eq(max_ms, 30.0, 1e-6);
cr_assert_float_eq(avg_ms, 20.0, 1e-6);
cr_assert(mdev_ms > 0.0, "mdev should be > 0 for different values");
}
Test(ping_stats, identical_values_mdev_zero)
{
struct ping_stats s;
double min_ms, max_ms, avg_ms, mdev_ms;
ping_stats_init(&s);
ping_stats_update(&s, 15000000LL);
ping_stats_update(&s, 15000000LL);
ping_stats_update(&s, 15000000LL);
ping_stats_get(&s, &min_ms, &max_ms, &avg_ms, &mdev_ms);
cr_assert_float_eq(min_ms, 15.0, 1e-6);
cr_assert_float_eq(max_ms, 15.0, 1e-6);
cr_assert_float_eq(avg_ms, 15.0, 1e-6);
cr_assert_float_eq(mdev_ms, 0.0, 1e-3);
}
Test(ping_stats, count_tracked)
{
struct ping_stats s;
ping_stats_init(&s);
ping_stats_update(&s, 10000000LL);
ping_stats_update(&s, 20000000LL);
ping_stats_update(&s, 30000000LL);
cr_assert_eq(s.count, (size_t)3);
}
Test(ping_stats, min_max_out_of_order)
{
struct ping_stats s;
double min_ms, max_ms, avg_ms, mdev_ms;
ping_stats_init(&s);
ping_stats_update(&s, 30000000LL); /* 30 ms */
ping_stats_update(&s, 10000000LL); /* 10 ms */
ping_stats_update(&s, 20000000LL); /* 20 ms */
ping_stats_get(&s, &min_ms, &max_ms, &avg_ms, &mdev_ms);
cr_assert_float_eq(min_ms, 10.0, 1e-6);
cr_assert_float_eq(max_ms, 30.0, 1e-6);
}
Test(ping_stats, large_rtt_no_overflow)
{
struct ping_stats s;
double min_ms, max_ms, avg_ms, mdev_ms;
ping_stats_init(&s);
ping_stats_update(&s, 10000000000LL); /* 10 s = 10000 ms */
ping_stats_get(&s, &min_ms, &max_ms, &avg_ms, &mdev_ms);
cr_assert(min_ms > 0.0, "min_ms should be > 0");
cr_assert(max_ms > 0.0, "max_ms should be > 0");
cr_assert(avg_ms > 0.0, "avg_ms should be > 0");
cr_assert_float_eq(avg_ms, 10000.0, 1e-3);
}
Test(ping_stats, two_values_avg)
{
struct ping_stats s;
double min_ms, max_ms, avg_ms, mdev_ms;
ping_stats_init(&s);
ping_stats_update(&s, 10000000LL); /* 10 ms */
ping_stats_update(&s, 30000000LL); /* 30 ms */
ping_stats_get(&s, &min_ms, &max_ms, &avg_ms, &mdev_ms);
cr_assert_float_eq(avg_ms, 20.0, 1e-6);
}