Skip to content

Commit

Permalink
Fixed addDelayToAbsTimeSpec for the case when
Browse files Browse the repository at this point in the history
when delayInNanoseconds >= NANOSECONDS_IN_SECOND
  • Loading branch information
SergeyKleyman committed May 8, 2023
1 parent fdce626 commit f1811be
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/ext/time_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,16 @@ void addDelayToAbsTimeSpec( /* in, out */ TimeSpec* absTimeSpec, long delayInNan
}
else
{
absTimeSpec->tv_nsec += delayInNanoseconds;
if ( absTimeSpec->tv_nsec + delayInNanoseconds < ELASTIC_APM_NUMBER_OF_NANOSECONDS_IN_SECOND )
{
absTimeSpec->tv_nsec += delayInNanoseconds;
}
else
{
long nanosecondsSum = absTimeSpec->tv_nsec + delayInNanoseconds;
absTimeSpec->tv_sec += nanosecondsSum / ELASTIC_APM_NUMBER_OF_NANOSECONDS_IN_SECOND;
absTimeSpec->tv_nsec = nanosecondsSum % ELASTIC_APM_NUMBER_OF_NANOSECONDS_IN_SECOND;
}
}
}

Expand Down
56 changes: 56 additions & 0 deletions src/ext/unit_tests/time_util_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,14 +152,70 @@ void test_durationToMilliseconds( void** testFixtureState )
}
}

static
void impl_test_addDelayToAbsTimeSpec( TimeSpec base, long delayInNanoseconds, TimeSpec expectedResult )
{
TimeSpec actualResult = base;
addDelayToAbsTimeSpec( /* in, out */ &actualResult, delayInNanoseconds );
ELASTIC_APM_CMOCKA_ASSERT_INT_EQUAL( actualResult.tv_sec, expectedResult.tv_sec );
ELASTIC_APM_CMOCKA_ASSERT_INT_EQUAL( actualResult.tv_nsec, expectedResult.tv_nsec );
}

static
bool time_t_max()
{
ELASTIC_APM_STATIC_ASSERT( sizeof( time_t ) == 4 || sizeof( time_t ) == 8 );
return sizeof( time_t ) == 4 ? INT32_MAX : INT64_MAX;
}

static
TimeSpec buildTimeSpec( time_t seconds, long nanoseconds )
{
return (TimeSpec){ .tv_sec = seconds, .tv_nsec = nanoseconds };
}

#pragma clang diagnostic push
#pragma ide diagnostic ignored "UnusedParameter"
static
void test_addDelayToAbsTimeSpec( void** testFixtureState )
{
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, 0 ), 0, buildTimeSpec( 0, 0 ) );
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"
long nanosecondsInSecond = ELASTIC_APM_NUMBER_OF_NANOSECONDS_IN_SECOND;
#pragma clang diagnostic pop
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, nanosecondsInSecond - 1 ), 0, buildTimeSpec( 0, nanosecondsInSecond - 1 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( time_t_max(), nanosecondsInSecond - 1 ), 0, buildTimeSpec( time_t_max(), nanosecondsInSecond - 1 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, nanosecondsInSecond - 1 ), 1, buildTimeSpec( 1, 0 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( time_t_max() - 1, nanosecondsInSecond - 1 ), 1, buildTimeSpec( time_t_max(), 0 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, 1 ), nanosecondsInSecond - 1, buildTimeSpec( 1, 0 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( time_t_max() - 1, 1 ), nanosecondsInSecond - 1, buildTimeSpec( time_t_max(), 0 ) );

impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, nanosecondsInSecond - 1 ), nanosecondsInSecond - 1, buildTimeSpec( 1, nanosecondsInSecond - 2 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( time_t_max() - 1, nanosecondsInSecond - 1 ), nanosecondsInSecond - 1, buildTimeSpec( time_t_max(), nanosecondsInSecond - 2 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, nanosecondsInSecond - 1 ), nanosecondsInSecond, buildTimeSpec( 1, nanosecondsInSecond - 1 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( time_t_max() - 1, nanosecondsInSecond - 1 ), nanosecondsInSecond, buildTimeSpec( time_t_max(), nanosecondsInSecond - 1 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, nanosecondsInSecond/2 ), nanosecondsInSecond/2, buildTimeSpec( 1, 0 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( time_t_max() - 1, nanosecondsInSecond/2 ), nanosecondsInSecond/2, buildTimeSpec( time_t_max(), 0 ) );

impl_test_addDelayToAbsTimeSpec( buildTimeSpec( 0, 123 ), 4*nanosecondsInSecond - 567, buildTimeSpec( 3, 123 + nanosecondsInSecond - 567 ) );
impl_test_addDelayToAbsTimeSpec( buildTimeSpec( time_t_max() - 3, 123 ), 4*nanosecondsInSecond - 567, buildTimeSpec( time_t_max(), 123 + nanosecondsInSecond - 567 ) );
}
#pragma clang diagnostic pop

#pragma clang diagnostic push
#pragma ide diagnostic ignored "UnusedParameter"
#pragma ide diagnostic ignored "OCUnusedGlobalDeclarationInspection"
int run_time_util_tests( int argc, const char* argv[] )
{
const struct CMUnitTest tests [] =
{
ELASTIC_APM_CMOCKA_UNIT_TEST( test_calcEndTimeVal ),
ELASTIC_APM_CMOCKA_UNIT_TEST( test_calcTimeValDiff ),
ELASTIC_APM_CMOCKA_UNIT_TEST( test_durationToMilliseconds ),
ELASTIC_APM_CMOCKA_UNIT_TEST( test_addDelayToAbsTimeSpec ),
};

return cmocka_run_group_tests( tests, NULL, NULL );
}
#pragma clang diagnostic pop

0 comments on commit f1811be

Please sign in to comment.