blob: b598e381bf447fb62245d91c1a4a34911ad43adf [file] [log] [blame]
/*
* Copyright (c) 2026 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/ztest.h>
#ifdef CONFIG_TIMEOUT_64BIT
/**
* Verify that absolute timeout sums are handled correctly
*/
ZTEST(timeout, test_timeout_sum_absolute)
{
k_timeout_t abs_timeout = K_TIMEOUT_ABS_TICKS(1000);
k_timeout_t result;
/* Two absolute timeouts should result in K_FOREVER */
result = K_TIMEOUT_SUM(abs_timeout, abs_timeout);
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
/* Absolute with K_FOREVER should result in K_FOREVER */
result = K_TIMEOUT_SUM(abs_timeout, K_FOREVER);
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_FOREVER, abs_timeout);
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
/* Absolute with K_NO_WAIT should return the absolute */
result = K_TIMEOUT_SUM(abs_timeout, K_NO_WAIT);
zassert_true(K_TIMEOUT_EQ(result, abs_timeout),
"Expected K_TIMEOUT_ABS_TICKS(1000)");
result = K_TIMEOUT_SUM(K_NO_WAIT, abs_timeout);
zassert_true(K_TIMEOUT_EQ(result, abs_timeout),
"Expected K_TIMEOUT_ABS_TICKS(1000)");
/* Absolute + relative (no underflow) should return a new absolute */
result = K_TIMEOUT_SUM(abs_timeout, K_TICKS(100));
zassert_true(K_TIMEOUT_EQ(result, K_TIMEOUT_ABS_TICKS(1100)),
"Expected K_TIMEOUT_ABS_TICKS(1100)");
result = K_TIMEOUT_SUM(K_TICKS(100), abs_timeout);
zassert_true(K_TIMEOUT_EQ(result, K_TIMEOUT_ABS_TICKS(1100)),
"Expected K_TIMEOUT_ABS_TICKS(1100)");
/* Limit testing: small absolute + large relative -- absolute 1st */
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(5), K_TICKS(INT64_MAX - 4));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(5), K_TICKS(INT64_MAX - 5));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(5), K_TICKS(INT64_MAX - 6));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN)),
"Expected INT64_MIN ticks");
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(5), K_TICKS(INT64_MAX - 7));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN + 1)),
"Expected INT64_MIN + 1 ticks");
/* Limit testing: small absolute + large relative -- relative 1st */
result = K_TIMEOUT_SUM(K_TICKS(INT64_MAX - 4), K_TIMEOUT_ABS_TICKS(5));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TICKS(INT64_MAX - 5), K_TIMEOUT_ABS_TICKS(5));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TICKS(INT64_MAX - 6), K_TIMEOUT_ABS_TICKS(5));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN)),
"Expected INT64_MIN ticks");
result = K_TIMEOUT_SUM(K_TICKS(INT64_MAX - 7), K_TIMEOUT_ABS_TICKS(5));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN + 1)),
"Expected INT64_MIN + 1 ticks");
/* Limit testing large absolute + small relative -- absolute 1st */
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(INT64_MAX - 5), K_TICKS(6));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(INT64_MAX - 6), K_TICKS(6));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(INT64_MAX - 7), K_TICKS(6));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN)),
"Expected INT64_MIN ticks");
result = K_TIMEOUT_SUM(K_TIMEOUT_ABS_TICKS(INT64_MAX - 8), K_TICKS(6));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN + 1)),
"Expected INT64_MIN + 1 ticks");
/* Limit testing large absolute + small relative -- relative 1st */
result = K_TIMEOUT_SUM(K_TICKS(6), K_TIMEOUT_ABS_TICKS(INT64_MAX - 5));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TICKS(6), K_TIMEOUT_ABS_TICKS(INT64_MAX - 6));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TICKS(6), K_TIMEOUT_ABS_TICKS(INT64_MAX - 7));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN)),
"Expected INT64_MIN ticks");
result = K_TIMEOUT_SUM(K_TICKS(6), K_TIMEOUT_ABS_TICKS(INT64_MAX - 8));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(INT64_MIN + 1)),
"Expected INT64_MIN + 1 ticks");
}
#endif
/**
* Verify that relative timeout sums are handled correctly
*/
ZTEST(timeout, test_timeout_sum_relative)
{
k_timeout_t result;
/* Verify that normal sums work as expected */
result = K_TIMEOUT_SUM(K_TICKS(1), K_TICKS(2));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(3)), "Expected 3 ticks");
/* K_NO_WAIT + X should return X */
result = K_TIMEOUT_SUM(K_NO_WAIT, K_TICKS(1));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(1)), "Expected 1 tick");
result = K_TIMEOUT_SUM(K_TICKS(1), K_NO_WAIT);
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(1)), "Expected 1 tick");
result = K_TIMEOUT_SUM(K_NO_WAIT, K_NO_WAIT);
zassert_true(K_TIMEOUT_EQ(result, K_NO_WAIT), "Expected K_NO_WAIT");
/* K_FOREVER + anything should return K_FOREVER */
result = K_TIMEOUT_SUM(K_TICKS(1), K_FOREVER);
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_FOREVER, K_TICKS(1));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_FOREVER, K_NO_WAIT);
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_NO_WAIT, K_FOREVER);
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_FOREVER, K_FOREVER);
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
/* Behavior at limits */
result = K_TIMEOUT_SUM(K_TICKS(K_TICK_MAX - 1), K_TICKS(1));
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(K_TICK_MAX)), "Expected K_TICK_MAX ticks");
result = K_TIMEOUT_SUM(K_TICKS(K_TICK_MAX - 1), K_TICKS(2));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
result = K_TIMEOUT_SUM(K_TICKS(K_TICK_MAX), K_NO_WAIT);
zassert_true(K_TIMEOUT_EQ(result, K_TICKS(K_TICK_MAX)), "Expected K_TICK_MAX ticks");
result = K_TIMEOUT_SUM(K_TICKS(K_TICK_MAX), K_TICKS(1));
zassert_true(K_TIMEOUT_EQ(result, K_FOREVER), "Expected K_FOREVER");
}
ZTEST_SUITE(timeout, NULL, NULL, NULL, NULL, NULL);