blob: d175d7d624e48aa5d4c3130b9cb49e9d6daea9fc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <gtest/gtest.h>
#include <thread>
#include <chrono>
#include "celix_utils.h"
class TimeUtilsTestSuite : public ::testing::Test {};
TEST_F(TimeUtilsTestSuite, GetTimeTest) {
timespec t1;
timespec t3;
clock_gettime(CLOCK_MONOTONIC, &t1);
std::this_thread::sleep_for(std::chrono::seconds {1} );
auto t2 = celix_gettime(CLOCK_MONOTONIC);
std::this_thread::sleep_for(std::chrono::seconds {1} );
clock_gettime(CLOCK_MONOTONIC, &t3);
EXPECT_GT(t2.tv_sec, t1.tv_sec);
EXPECT_GT(t3.tv_sec, t2.tv_sec);
}
TEST_F(TimeUtilsTestSuite, DiffTimeTest) {
auto t1 = celix_gettime(CLOCK_MONOTONIC);
std::this_thread::sleep_for(std::chrono::microseconds {10} );
auto t2 = celix_gettime(CLOCK_MONOTONIC);
auto diff = celix_difftime(&t1, &t2);
EXPECT_GE(diff, 0.00001 /*10 us*/);
EXPECT_LT(diff, 0.01 /*1 ms*/);
}
TEST_F(TimeUtilsTestSuite, ElapsedTimeTest) {
auto t1 = celix_gettime(CLOCK_MONOTONIC);
std::this_thread::sleep_for(std::chrono::microseconds {10} );
auto diff = celix_elapsedtime(CLOCK_MONOTONIC, t1);
EXPECT_GE(diff, 0.00001 /*10 us*/);
EXPECT_LT(diff, 0.1 /*1/10 s, note do want to rely on accuracy of sleep_for*/);
}
TEST_F(TimeUtilsTestSuite, DelayedTimespecTest) {
//Test with NULL time and delayInSeconds = 0
struct timespec delayedTime = celix_delayedTimespec(NULL, 0);
ASSERT_EQ(delayedTime.tv_sec, 0);
ASSERT_EQ(delayedTime.tv_nsec, 0);
//Test with NULL time and delayInSeconds = 1.5
delayedTime = celix_delayedTimespec(NULL, 1.5);
struct timespec expectedTime = {1, 500000000};
ASSERT_EQ(delayedTime.tv_sec, expectedTime.tv_sec);
ASSERT_EQ(delayedTime.tv_nsec, expectedTime.tv_nsec);
//Test with time.tv_nsec + nanoseconds > CELIX_NS_IN_SEC
struct timespec time = {0, 500000000};
delayedTime = celix_delayedTimespec(&time, 0.6);
expectedTime = {1, 100000000};
ASSERT_EQ(delayedTime.tv_sec, expectedTime.tv_sec);
ASSERT_EQ(delayedTime.tv_nsec, expectedTime.tv_nsec);
//Test with time.tv_nsec + nanoseconds < 0
time = {1, 500000000};
delayedTime = celix_delayedTimespec(&time, -0.6);
expectedTime = {0, 900000000};
ASSERT_EQ(delayedTime.tv_sec, expectedTime.tv_sec);
ASSERT_EQ(delayedTime.tv_nsec, expectedTime.tv_nsec);
//Test with time.tv_nsec + nanoseconds = CELIX_NS_IN_SEC
time = {1, 500000000};
delayedTime = celix_delayedTimespec(&time, 0.5);
expectedTime = {2, 0};
ASSERT_EQ(delayedTime.tv_sec, expectedTime.tv_sec);
ASSERT_EQ(delayedTime.tv_nsec, expectedTime.tv_nsec);
//Test with time.tv_nsec + nanoseconds < CELIX_NS_IN_SEC
time = {1, 500000000};
delayedTime = celix_delayedTimespec(&time, 0.4);
expectedTime = {1, 900000000};
ASSERT_EQ(delayedTime.tv_sec, expectedTime.tv_sec);
ASSERT_EQ(delayedTime.tv_nsec, expectedTime.tv_nsec);
//Test if time becomes negative
time = {0, 500000000};
delayedTime = celix_delayedTimespec(&time, -1.5);
expectedTime = {-1, 0};
ASSERT_EQ(delayedTime.tv_sec, expectedTime.tv_sec);
ASSERT_EQ(delayedTime.tv_nsec, expectedTime.tv_nsec);
//Test delay <= -2 seconds
time = {3, 0};
delayedTime = celix_delayedTimespec(&time, -2.6);
expectedTime = {0, 400000000};
ASSERT_EQ(delayedTime.tv_sec, expectedTime.tv_sec);
ASSERT_EQ(delayedTime.tv_nsec, expectedTime.tv_nsec);
}
TEST_F(TimeUtilsTestSuite, CompareTimeTest) {
struct timespec time1 = {0, 500000000};
struct timespec time2 = {0, 500000000};
ASSERT_EQ(celix_compareTime(&time1, &time2), 0);
time1 = {0, 500000000};
time2 = {0, 600000000};
ASSERT_EQ(celix_compareTime(&time1, &time2), -1); //time1 is before time2
time1 = {0, 600000000};
time2 = {0, 500000000};
ASSERT_EQ(celix_compareTime(&time1, &time2), 1); //time1 is after time2
time1 = {1, 500000000};
time2 = {0, 500000000};
ASSERT_EQ(celix_compareTime(&time1, &time2), 1); //time1 is after time2
time1 = {0, 500000000};
time2 = {1, 500000000};
ASSERT_EQ(celix_compareTime(&time1, &time2), -1); //time1 is before time2
}