test: add unit tests for do_send seq lifecycle and error handling

This commit is contained in:
lohhiiccc 2026-04-22 23:23:27 +02:00
parent 36b9956b3a
commit 25ee8ad4c6

106
tests/send/test_do_send.c Normal file
View file

@ -0,0 +1,106 @@
#include <criterion/criterion.h>
#include <netinet/in.h>
#include "compiler.h"
#include <stddef.h>
#include <stdint.h>
#include "icmp.h"
#include "internal/ping/send.h"
#include "internal/ping/ping_state.h"
#include "internal/ping/tracker.h"
#include "ping/ping.h"
/* Controllable mock state */
int g_mock_send_ret;
int g_mock_retry_ret;
int __wrap_icmp_send_echo(icmp_handle_t *h __unused, struct in_addr dest
__unused, uint16_t id __unused, uint16_t seq __unused, uint8_t ttl
__unused, const void *payload __unused, size_t len __unused)
{
return g_mock_send_ret;
}
int __wrap_icmp_should_retry(const icmp_handle_t *h __unused)
{
return g_mock_retry_ret;
}
const char *__wrap_icmp_strerror(const icmp_handle_t *h __unused)
{
return "mock error";
}
int __wrap_ping_scheduler_arm(const struct ping_config *c __unused)
{
return 0;
}
static struct ping_config g_config;
static struct ping_tracker g_tracker;
static struct ping_state g_state;
static void
setup(void)
{
g_config = (struct ping_config){0};
g_state = (struct ping_state){
.handle = NULL,
.config = &g_config,
.tracker = &g_tracker,
.seq = 0,
};
ping_tracker_init(&g_tracker);
g_mock_send_ret = 0;
g_mock_retry_ret = 0;
}
Test(do_send, success_increments_seq, .init = setup)
{
g_mock_send_ret = 0;
do_send(&g_state, 16);
cr_assert_eq(g_state.seq, (uint16_t)1);
cr_assert_eq(g_tracker.nb_sent, (size_t)1);
}
Test(do_send, eagain_does_not_consume_seq, .init = setup)
{
g_mock_send_ret = 1;
g_mock_retry_ret = 1;
do_send(&g_state, 16);
cr_assert_eq(g_state.seq, (uint16_t)0);
cr_assert_eq(g_tracker.nb_sent, (size_t)0);
}
Test(do_send, hard_error_does_not_consume_seq, .init = setup)
{
g_mock_send_ret = -1;
g_mock_retry_ret = 0;
do_send(&g_state, 16);
cr_assert_eq(g_state.seq, (uint16_t)0);
cr_assert_eq(g_tracker.nb_sent, (size_t)0);
}
Test(do_send, multiple_success_increments_seq, .init = setup)
{
g_mock_send_ret = 0;
do_send(&g_state, 16);
do_send(&g_state, 16);
do_send(&g_state, 16);
cr_assert_eq(g_state.seq, (uint16_t)3);
cr_assert_eq(g_tracker.nb_sent, (size_t)3);
}
Test(do_send, eagain_then_success_uses_same_seq, .init = setup)
{
g_mock_send_ret = 1;
g_mock_retry_ret = 1;
do_send(&g_state, 16);
cr_assert_eq(g_state.seq, (uint16_t)0);
g_mock_send_ret = 0;
g_mock_retry_ret = 0;
do_send(&g_state, 16);
cr_assert_eq(g_state.seq, (uint16_t)1);
cr_assert_eq(g_tracker.nb_sent, (size_t)1);
}