/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ztest.h>
#include <string.h>
#include <inttypes.h>
#include <zephyr/net/net_timeout.h>

#include "../../../subsys/net/ip/net_timeout.c"

#define HALFMAX_S (23U + 60U * (31U + 60U * (20U + 24U * 24U)))
#define NTO_MAX_S HALFMAX_S
#define FULLMAX_S (47U + 60U * (2U + 60U * (17U + 24U * 49U)))

#if 0
static void dump_nto(const struct net_timeout *nto)
{
	uint64_t remaining = nto->timer_timeout;
	uint64_t deadline = nto->timer_start;

	remaining += NET_TIMEOUT_MAX_VALUE * nto->wrap_counter;
	deadline += remaining;

	printk("start %u, rem %u * %u + %u = %" PRIu64 ", ends %" PRIu64 "\n",
	       nto->timer_start, nto->wrap_counter,
	       NET_TIMEOUT_MAX_VALUE, nto->timer_timeout,
	       remaining, deadline);
}
#endif

static void test_basics(void)
{
	zassert_equal(NET_TIMEOUT_MAX_VALUE, INT32_MAX,
		      "Max value not as expected");
	zassert_equal(((uint32_t)(INT32_MAX / MSEC_PER_SEC)),
		      HALFMAX_S,
		      "Half-max constant is wrong");
	zassert_equal((UINT32_MAX / MSEC_PER_SEC),
		      FULLMAX_S,
		      "Full-max constant is wrong");
}

static void test_set(void)
{
	struct net_timeout nto;
	uint32_t now = 4;
	uint32_t lifetime = 0U;

	/* Zero is a special case. */
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, 0, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, 0, NULL);
	zassert_equal(nto.timer_timeout, 0, NULL);

	/* Less than the max is straightforward. */
	lifetime = NTO_MAX_S / 2;
	++now;
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, 0, NULL);
	zassert_equal(nto.timer_timeout, lifetime * MSEC_PER_SEC,
		      NULL);

	/* Max must not incur wrap, so fraction is not zero. */
	lifetime = NTO_MAX_S;
	++now;
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, 0, NULL);
	zassert_equal(nto.timer_timeout, lifetime * MSEC_PER_SEC,
		      NULL);

	/* Next after max does wrap. */
	lifetime += 1U;
	++now;
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, 1U, NULL);
	zassert_equal(nto.timer_timeout,
		      (lifetime * MSEC_PER_SEC) % NET_TIMEOUT_MAX_VALUE,
		      NULL);

	/* Fullmax should be one plus partial */
	lifetime = FULLMAX_S;
	++now;
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, 1U, NULL);
	zassert_equal(nto.timer_timeout,
		      (lifetime * (uint64_t)MSEC_PER_SEC) % NET_TIMEOUT_MAX_VALUE,
		      NULL);

	/* Multiples of max must also not have a zero fraction. */
	lifetime = NET_TIMEOUT_MAX_VALUE;
	++now;
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, MSEC_PER_SEC - 1, NULL);
	zassert_equal(nto.timer_timeout, NET_TIMEOUT_MAX_VALUE, NULL);
}

static void test_deadline(void)
{
	struct net_timeout nto;
	uint64_t now = 1234;
	uint64_t rollover31 = BIT64(31);
	uint64_t rollover32 = BIT64(32);
	uint32_t lifetime = 562;

	net_timeout_set(&nto, lifetime, now);
	uint64_t expected = now + lifetime * MSEC_PER_SEC;
	zassert_equal(net_timeout_deadline(&nto, now),
		      expected,
		      NULL);

	/* Advancing now has no effect until it wraps. */
	zassert_equal(net_timeout_deadline(&nto, now + 23U),
		      expected,
		      NULL);

	/* Advancing by 2^31 is not a wrap. */
	now += rollover31;
	zassert_equal(net_timeout_deadline(&nto, now),
		      expected,
		      NULL);

	/* Advancing by 2^32 is a wrap, and should be reflected in the
	 * returned deadline
	 */
	now += rollover31;
	expected += rollover32;
	zassert_equal(net_timeout_deadline(&nto, now),
		      expected,
		      NULL);

	zassert_equal(net_timeout_deadline(&nto, now + 52),
		      expected,
		      NULL);
}

static void test_remaining(void)
{
	struct net_timeout nto;
	uint32_t now = 4;
	uint32_t lifetime = 0U;

	/* Zero is a special case. */
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, 0, now);
	zassert_equal(net_timeout_remaining(&nto, now), 0U,
		      NULL);

	/* Without wrap is straightforward. */
	lifetime = NTO_MAX_S / 2;
	memset(&nto, 0xa5, sizeof(nto));
	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.wrap_counter, 0, NULL);
	zassert_equal(net_timeout_remaining(&nto, now), lifetime,
		      NULL);

	/* Estimate rounds down (legacy behavior). */
	zassert_equal(net_timeout_remaining(&nto, now + 1U),
		      lifetime - 1U,
		      NULL);
	zassert_equal(net_timeout_remaining(&nto, now + MSEC_PER_SEC - 1U),
		      lifetime - 1U,
		      NULL);
	zassert_equal(net_timeout_remaining(&nto, now + MSEC_PER_SEC),
		      lifetime - 1U,
		      NULL);
	zassert_equal(net_timeout_remaining(&nto, now + MSEC_PER_SEC + 1U),
		      lifetime - 2U,
		      NULL);

	/* Works when wrap is involved */
	lifetime = 4 * FULLMAX_S;
	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.wrap_counter, 7, NULL);
	zassert_equal(net_timeout_remaining(&nto, now), lifetime,
		      NULL);
}

static void test_evaluate_basic(void)
{
	struct net_timeout nto;
	uint64_t now = 0;
	uint32_t half_max = NET_TIMEOUT_MAX_VALUE / 2U;
	uint32_t lifetime = FULLMAX_S + HALFMAX_S;
	uint32_t remainder;
	uint32_t delay;
	uint64_t deadline;

	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.timer_start, now,
		      NULL);
	zassert_equal(nto.wrap_counter, 2,
		      NULL);
	remainder = 2147482706;
	zassert_equal(nto.timer_timeout, remainder,
		      NULL);
	deadline = net_timeout_deadline(&nto, now);

	/* Evaluation with wrap and no advance returns max value
	 * without changing anything. */
	delay = net_timeout_evaluate(&nto, now);
	zassert_equal(delay, NET_TIMEOUT_MAX_VALUE,
		       NULL);
	zassert_equal(nto.timer_start, now,
		      NULL);
	zassert_equal(nto.wrap_counter, 2,
		      NULL);
	zassert_equal(nto.timer_timeout, remainder,
		      NULL);
	zassert_equal(net_timeout_deadline(&nto, now), deadline,
		     NULL);

	/* Advance now by half the delay should return the remainder,
	 * again without advancing anything.
	 */
	delay = net_timeout_evaluate(&nto, now + half_max);
	zassert_equal(delay, NET_TIMEOUT_MAX_VALUE - half_max,
		       NULL);
	zassert_equal(nto.timer_start, now,
		      NULL);
	zassert_equal(nto.wrap_counter, 2,
		      NULL);
	zassert_equal(nto.timer_timeout, remainder,
		      NULL);
	zassert_equal(net_timeout_deadline(&nto, now), deadline,
		     NULL);

	/* Advance now by just below delay still doesn't change
	 * anything.
	 */
	delay = net_timeout_evaluate(&nto, now + NET_TIMEOUT_MAX_VALUE - 1U);
	zassert_equal(delay, 1U,
		       NULL);
	zassert_equal(nto.timer_start, now,
		      NULL);
	zassert_equal(nto.wrap_counter, 2,
		      NULL);
	zassert_equal(nto.timer_timeout, remainder,
		      NULL);
	zassert_equal(net_timeout_deadline(&nto, now), deadline,
		     NULL);

	/* Advancing by the delay consumes the value of the delay. The
	 * deadline is unchanged.
	 */
	now += NET_TIMEOUT_MAX_VALUE;
	delay = net_timeout_evaluate(&nto, now);
	zassert_equal(delay, NET_TIMEOUT_MAX_VALUE,
		      NULL);
	zassert_equal(nto.timer_start, now,
		      NULL);
	zassert_equal(nto.wrap_counter, 1,
		      NULL);
	zassert_equal(nto.timer_timeout, remainder,
		      "remainder %u", nto.timer_timeout);
	zassert_equal(net_timeout_deadline(&nto, now), deadline,
		     NULL);

	/* Advancing by more than the delay consumes the value of the delay,
	 * with the excess reducing the remainder.  The deadline is
	 * unchanged.
	 */
	now += NET_TIMEOUT_MAX_VALUE + 1234;
	remainder -= 1234;
	delay = net_timeout_evaluate(&nto, now);
	zassert_equal(delay, remainder,
		      NULL);
	zassert_equal(nto.timer_start, (uint32_t)now,
		      NULL);
	zassert_equal(nto.wrap_counter, 0,
		      NULL);
	zassert_equal(nto.timer_timeout, remainder,
		      NULL);
	zassert_equal(net_timeout_deadline(&nto, now), deadline,
		     NULL);

	/* Final advance completes the timeout precisely */
	now += delay;
	delay = net_timeout_evaluate(&nto, now);
	zassert_equal(delay, 0,
		      NULL);
	zassert_equal(net_timeout_deadline(&nto, now), deadline,
		     NULL);
}

static void test_evaluate_whitebox(void)
{
	/* This explicitly tests the path where subtracting the excess elapsed
	 * from the fractional timeout requires reducing the wrap count a
	 * second time.
	 */
	struct net_timeout nto;
	uint64_t now = 0;
	uint32_t lifetime = 3 * HALFMAX_S + 2;

	net_timeout_set(&nto, lifetime, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, 3, NULL);
	zassert_equal(nto.timer_timeout, 59, NULL);

	/* Preserve the deadline for validation */
	uint64_t deadline = net_timeout_deadline(&nto, now);

	uint32_t delay = net_timeout_evaluate(&nto, now);
	zassert_equal(delay, NET_TIMEOUT_MAX_VALUE, NULL);
	zassert_equal(net_timeout_deadline(&nto, now),
		      deadline, NULL);

	/* Simulate a late evaluation, far enough late that the counter gets
	 * wiped out.
	 */
	now += delay + 100U;
	delay = net_timeout_evaluate(&nto, now);
	zassert_equal(nto.timer_start, now, NULL);
	zassert_equal(nto.wrap_counter, 1, NULL);
	zassert_equal(nto.timer_timeout, 2147483606, NULL);
	zassert_equal(net_timeout_deadline(&nto, now),
		      deadline, NULL);
	zassert_equal(delay, NET_TIMEOUT_MAX_VALUE, NULL);

	/* Another late evaluation finishes the wrap leaving some extra.
	 */
	now += delay + 123U;
	delay = net_timeout_evaluate(&nto, now);
	zassert_equal(nto.timer_start, (uint32_t)now, NULL);
	zassert_equal(nto.wrap_counter, 0, NULL);
	zassert_equal(nto.timer_timeout, 2147483483, NULL);
	zassert_equal(net_timeout_deadline(&nto, now),
		      deadline, NULL);
	zassert_equal(delay, nto.timer_timeout, NULL);

	/* Complete the timeout.  This does *not* adjust the internal
	 * state.
	 */
	now += delay + 234U;
	delay = net_timeout_evaluate(&nto, now);
	zassert_equal(delay, 0, NULL);
	zassert_equal(net_timeout_deadline(&nto, now),
		      deadline, NULL);
}

static void test_nop(void)
{
}

/*test case main entry*/
void test_main(void)
{

	ztest_test_suite(test_net_timeout,
			 ztest_unit_test(test_basics),
			 ztest_unit_test(test_set),
			 ztest_unit_test(test_deadline),
			 ztest_unit_test(test_remaining),
			 ztest_unit_test(test_evaluate_basic),
			 ztest_unit_test(test_evaluate_whitebox),
			 ztest_unit_test(test_nop)
			 );
	ztest_run_test_suite(test_net_timeout);
}
