configure.ac | 1 +
osaf/libs/core/common/Makefile.am | 2 +-
osaf/libs/core/common/tests/Makefile.am | 51 +
osaf/libs/core/common/tests/mock_clock_gettime.cc | 45 +
osaf/libs/core/common/tests/mock_clock_gettime.h | 33 +
osaf/libs/core/common/tests/mock_clock_nanosleep.cc | 66 ++
osaf/libs/core/common/tests/mock_clock_nanosleep.h | 33 +
osaf/libs/core/common/tests/mock_syslog.cc | 23 +
osaf/libs/core/common/tests/mock_syslog.h | 23 +
osaf/libs/core/common/tests/osaf_clock_gettime_test.cc | 73 ++
osaf/libs/core/common/tests/osaf_nanosleep_test.cc | 81 ++
osaf/libs/core/common/tests/osaf_normalize_timespec_test.cc | 81 ++
osaf/libs/core/common/tests/osaf_time_test.cc | 390 ++++++++++++
osaf/libs/core/common/tests/osaf_timespec_add_test.cc | 62 +
osaf/libs/core/common/tests/osaf_timespec_compare_test.cc | 75 ++
osaf/libs/core/common/tests/osaf_timespec_convert_test.cc | 100 +++
osaf/libs/core/common/tests/osaf_timespec_subtract_test.cc | 62 +
17 files changed, 1200 insertions(+), 1 deletions(-)
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -705,6 +705,7 @@ AC_CONFIG_FILES([
osaf/libs/core/include/Makefile
osaf/libs/core/common/Makefile
osaf/libs/core/common/include/Makefile
+ osaf/libs/core/common/tests/Makefile
osaf/libs/core/leap/Makefile
osaf/libs/core/leap/include/Makefile
osaf/libs/core/mbcsv/Makefile
diff --git a/osaf/libs/core/common/Makefile.am
b/osaf/libs/core/common/Makefile.am
--- a/osaf/libs/core/common/Makefile.am
+++ b/osaf/libs/core/common/Makefile.am
@@ -18,7 +18,7 @@ include $(top_srcdir)/Makefile.common
MAINTAINERCLEANFILES = Makefile.in
-SUBDIRS = include
+SUBDIRS = include tests
noinst_LTLIBRARIES = libopensaf_common.la
diff --git a/osaf/libs/core/common/tests/Makefile.am
b/osaf/libs/core/common/tests/Makefile.am
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/Makefile.am
@@ -0,0 +1,51 @@
+# -*- OpenSAF -*-
+#
+# (C) Copyright 2015 The OpenSAF Foundation
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+# under the GNU Lesser General Public License Version 2.1, February 1999.
+# The complete license can be accessed from the following location:
+# http://opensource.org/licenses/lgpl-license.php
+# See the Copying file included with the OpenSAF distribution for full
+# licensing terms.
+#
+# Author(s): Ericsson AB
+#
+
+include $(top_srcdir)/Makefile.common
+
+MAINTAINERCLEANFILES = Makefile.in
+
+TESTS = core_common_test
+
+check_PROGRAMS = $(TESTS)
+
+core_common_test_CXXFLAGS =$(AM_CXXFLAGS)
+
+core_common_test_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir)/osaf/libs/core/common/include \
+ -I$(GTEST_DIR)/include
+
+core_common_test_LDFLAGS = \
+ -pthread -lrt \
+ $(top_builddir)/osaf/libs/core/common/libopensaf_common_la-osaf_time.o \
+
$(top_builddir)/osaf/libs/core/common/libopensaf_common_la-osaf_utility.o
+
+core_common_test_SOURCES = \
+ osaf_clock_gettime_test.cc \
+ osaf_nanosleep_test.cc \
+ osaf_normalize_timespec_test.cc \
+ osaf_timespec_add_test.cc \
+ osaf_timespec_compare_test.cc \
+ osaf_timespec_convert_test.cc \
+ osaf_timespec_subtract_test.cc \
+ mock_clock_gettime.cc \
+ mock_clock_nanosleep.cc \
+ mock_syslog.cc
+
+core_common_test_LDADD = \
+ $(GTEST_DIR)/lib/libgtest.la \
+ $(GTEST_DIR)/lib/libgtest_main.la
diff --git a/osaf/libs/core/common/tests/mock_clock_gettime.cc
b/osaf/libs/core/common/tests/mock_clock_gettime.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/mock_clock_gettime.cc
@@ -0,0 +1,45 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "mock_clock_gettime.h"
+#include <cerrno>
+#include "osaf_time.h"
+
+timespec realtime_clock;
+timespec monotonic_clock;
+MockClockGettime mock_clock_gettime;
+
+int clock_gettime(clockid_t clock_id, struct timespec* tp) {
+ struct timespec* clock_source = nullptr;
+ if (clock_id == CLOCK_REALTIME) {
+ clock_source = &realtime_clock;
+ } else if (clock_id == CLOCK_MONOTONIC) {
+ clock_source = &monotonic_clock;
+ } else {
+ errno = EINVAL;
+ return -1;
+ }
+ if (tp == nullptr) {
+ errno = EFAULT;
+ return -1;
+ }
+ if (tp != nullptr && clock_source != nullptr) *tp = *clock_source;
+ osaf_timespec_add(&realtime_clock, &mock_clock_gettime.execution_time,
&realtime_clock);
+ osaf_timespec_add(&monotonic_clock, &mock_clock_gettime.execution_time,
&monotonic_clock);
+ if (mock_clock_gettime.return_value < 0) errno =
mock_clock_gettime.errno_value;
+ return mock_clock_gettime.return_value;
+}
diff --git a/osaf/libs/core/common/tests/mock_clock_gettime.h
b/osaf/libs/core/common/tests/mock_clock_gettime.h
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/mock_clock_gettime.h
@@ -0,0 +1,33 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#ifndef OPENSAF_BASE_TESTS_MOCK_CLOCK_GETTIME_H_
+#define OPENSAF_BASE_TESTS_MOCK_CLOCK_GETTIME_H_
+
+#include <time.h>
+
+struct MockClockGettime {
+ struct timespec execution_time;
+ int return_value;
+ int errno_value;
+};
+
+extern timespec realtime_clock;
+extern timespec monotonic_clock;
+extern MockClockGettime mock_clock_gettime;
+
+#endif
diff --git a/osaf/libs/core/common/tests/mock_clock_nanosleep.cc
b/osaf/libs/core/common/tests/mock_clock_nanosleep.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/mock_clock_nanosleep.cc
@@ -0,0 +1,66 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "mock_clock_nanosleep.h"
+#include <cerrno>
+#include "osaf_time.h"
+#include "mock_clock_gettime.h"
+
+int current_nanosleep_index = 0;
+int number_of_nanosleep_instances = 1;
+MockClockNanosleep mock_clock_nanosleep[kMockClockNanosleepInstances];
+
+int clock_nanosleep(clockid_t clock_id, int flags,
+ const struct timespec *request,
+ struct timespec *remain) {
+ MockClockNanosleep& mock_instance =
mock_clock_nanosleep[current_nanosleep_index++];
+ if (current_nanosleep_index >= number_of_nanosleep_instances)
current_nanosleep_index = 0;
+ struct timespec* clock_source = nullptr;
+ if (clock_id == CLOCK_REALTIME) {
+ clock_source = &realtime_clock;
+ } else if (clock_id == CLOCK_MONOTONIC) {
+ clock_source = &monotonic_clock;
+ } else {
+ errno = EINVAL;
+ return -1;
+ }
+ if (request->tv_sec < 0 || request->tv_nsec < 0 || request->tv_nsec >=
kNanosPerSec) {
+ errno = EINVAL;
+ return -1;
+ }
+ struct timespec sleep_duration = kZeroSeconds;
+ if (flags == 0) {
+ sleep_duration = *request;
+ } else if (flags == TIMER_ABSTIME) {
+ if (osaf_timespec_compare(request, clock_source) >= 0) {
+ osaf_timespec_subtract(request, clock_source, &sleep_duration);
+ }
+ } else {
+ errno = EINVAL;
+ return -1;
+ }
+ if (mock_instance.return_value < 0 && mock_instance.errno_value == EINTR) {
+ osaf_nanos_to_timespec(osaf_timespec_to_nanos(&sleep_duration) / 2,
&sleep_duration);
+ }
+ if (flags == 0 && remain != nullptr) {
+ osaf_timespec_subtract(request, &sleep_duration, remain);
+ }
+ osaf_timespec_add(&realtime_clock, &sleep_duration, &realtime_clock);
+ osaf_timespec_add(&monotonic_clock, &sleep_duration, &monotonic_clock);
+ if (mock_instance.return_value < 0) errno = mock_instance.errno_value;
+ return mock_instance.return_value;
+}
diff --git a/osaf/libs/core/common/tests/mock_clock_nanosleep.h
b/osaf/libs/core/common/tests/mock_clock_nanosleep.h
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/mock_clock_nanosleep.h
@@ -0,0 +1,33 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#ifndef OPENSAF_BASE_TESTS_MOCK_CLOCK_NANOSLEEP_H_
+#define OPENSAF_BASE_TESTS_MOCK_CLOCK_NANOSLEEP_H_
+
+#include <time.h>
+
+struct MockClockNanosleep {
+ int return_value;
+ int errno_value;
+};
+
+static const int kMockClockNanosleepInstances = 3;
+extern int current_nanosleep_index;
+extern int number_of_nanosleep_instances;
+extern MockClockNanosleep mock_clock_nanosleep[kMockClockNanosleepInstances];
+
+#endif
diff --git a/osaf/libs/core/common/tests/mock_syslog.cc
b/osaf/libs/core/common/tests/mock_syslog.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/mock_syslog.cc
@@ -0,0 +1,23 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "mock_syslog.h"
+
+void syslog(int priority, const char *format, ...) {
+ (void) priority;
+ (void) format;
+}
diff --git a/osaf/libs/core/common/tests/mock_syslog.h
b/osaf/libs/core/common/tests/mock_syslog.h
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/mock_syslog.h
@@ -0,0 +1,23 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#ifndef OPENSAF_BASE_TESTS_MOCK_SYSLOG_H_
+#define OPENSAF_BASE_TESTS_MOCK_SYSLOG_H_
+
+#include <syslog.h>
+
+#endif
diff --git a/osaf/libs/core/common/tests/osaf_clock_gettime_test.cc
b/osaf/libs/core/common/tests/osaf_clock_gettime_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_clock_gettime_test.cc
@@ -0,0 +1,73 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include <cerrno>
+#include "osaf_time.h"
+#include "osaf_utility.h"
+#include "mock_clock_gettime.h"
+#include "gtest/gtest.h"
+
+TEST(OsafClockGettime, ReadRealtimeClock) {
+ time_t sec = 123456789;
+ long nsec = 987654321;
+ realtime_clock = { sec, nsec };
+ monotonic_clock = { 0, 0 };
+ mock_clock_gettime.return_value = 0;
+
+ struct timespec ts = { 0, 0 };
+ osaf_clock_gettime(CLOCK_REALTIME, &ts);
+
+ EXPECT_EQ(ts.tv_sec, sec);
+ EXPECT_EQ(ts.tv_nsec, nsec);
+}
+
+TEST(OsafClockGettime, ReadMonotonicClock) {
+ time_t sec = 212121212;
+ long nsec = 565656565;
+ realtime_clock = { 0, 0 };
+ monotonic_clock = { sec, nsec };
+ mock_clock_gettime.return_value = 0;
+
+ struct timespec ts = { 0, 0 };
+ osaf_clock_gettime(CLOCK_MONOTONIC, &ts);
+
+ EXPECT_EQ(ts.tv_sec, sec);
+ EXPECT_EQ(ts.tv_nsec, nsec);
+}
+
+TEST(OsafClockGettime, FailWithEFAULT) {
+ mock_clock_gettime.return_value = -1;
+ mock_clock_gettime.errno_value = EFAULT;
+
+ ASSERT_EXIT(osaf_clock_gettime(CLOCK_REALTIME, NULL),
::testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(OsafClockGettime, FailWithEINVAL) {
+ mock_clock_gettime.return_value = -1;
+ mock_clock_gettime.errno_value = EINVAL;
+
+ struct timespec ts;
+ ASSERT_EXIT(osaf_clock_gettime(CLOCK_REALTIME, &ts),
::testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(OsafClockGettime, FailWithEPERM) {
+ mock_clock_gettime.return_value = -1;
+ mock_clock_gettime.errno_value = EPERM;
+
+ struct timespec ts;
+ ASSERT_EXIT(osaf_clock_gettime(CLOCK_REALTIME, &ts),
::testing::KilledBySignal(SIGABRT), "");
+}
diff --git a/osaf/libs/core/common/tests/osaf_nanosleep_test.cc
b/osaf/libs/core/common/tests/osaf_nanosleep_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_nanosleep_test.cc
@@ -0,0 +1,81 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include <cerrno>
+#include "osaf_time.h"
+#include "osaf_utility.h"
+#include "mock_clock_gettime.h"
+#include "mock_clock_nanosleep.h"
+#include "gtest/gtest.h"
+
+TEST(OsafNanosleep, SleepTenMilliseconds) {
+ time_t start_sec = 1234;
+ long start_nsec = 5678;
+ monotonic_clock = { start_sec, start_nsec };
+ mock_clock_gettime.execution_time = kZeroSeconds;
+ mock_clock_gettime.return_value = 0;
+ current_nanosleep_index = 0;
+ number_of_nanosleep_instances = 2;
+ mock_clock_nanosleep[0].return_value = 0;
+
+ timespec sleep_duration = kTenMilliseconds;
+ osaf_nanosleep(&sleep_duration);
+
+ EXPECT_EQ(monotonic_clock.tv_sec, start_sec);
+ EXPECT_EQ(monotonic_clock.tv_nsec, start_nsec + 10000000);
+ EXPECT_EQ(current_nanosleep_index, 1);
+}
+
+TEST(OsafNanosleep, SleepOneHourWithInterrupt) {
+ monotonic_clock = kZeroSeconds;
+ mock_clock_gettime.execution_time = kZeroSeconds;
+ mock_clock_gettime.return_value = 0;
+ current_nanosleep_index = 0;
+ number_of_nanosleep_instances = 3;
+ mock_clock_nanosleep[0].return_value = -1;
+ mock_clock_nanosleep[0].errno_value = EINTR;
+ mock_clock_nanosleep[1].return_value = 0;
+
+ timespec sleep_duration = kOneHour;
+ osaf_nanosleep(&sleep_duration);
+
+ EXPECT_EQ(monotonic_clock.tv_sec, 60 * 60);
+ EXPECT_EQ(monotonic_clock.tv_nsec, 0);
+ EXPECT_EQ(current_nanosleep_index, 2);
+}
+
+TEST(OsafNanosleep, FailWithEFAULT) {
+ mock_clock_gettime.return_value = 0;
+ current_nanosleep_index = 0;
+ number_of_nanosleep_instances = 1;
+ mock_clock_nanosleep[0].return_value = -1;
+ mock_clock_nanosleep[0].errno_value = EFAULT;
+
+ timespec sleep_duration = kOneSecond;
+ ASSERT_EXIT(osaf_nanosleep(&sleep_duration),
::testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(OsafNanosleep, FailWithEINVAL) {
+ mock_clock_gettime.return_value = 0;
+ current_nanosleep_index = 0;
+ number_of_nanosleep_instances = 1;
+ mock_clock_nanosleep[0].return_value = -1;
+ mock_clock_nanosleep[0].errno_value = EINVAL;
+
+ timespec sleep_duration = kOneSecond;
+ ASSERT_EXIT(osaf_nanosleep(&sleep_duration),
::testing::KilledBySignal(SIGABRT), "");
+}
diff --git a/osaf/libs/core/common/tests/osaf_normalize_timespec_test.cc
b/osaf/libs/core/common/tests/osaf_normalize_timespec_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_normalize_timespec_test.cc
@@ -0,0 +1,81 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "osaf_time.h"
+#include "gtest/gtest.h"
+
+TEST(OsafNormalizeTimespec, Zero) {
+ const timespec zero_seconds = kZeroSeconds;
+ timespec result;
+ osaf_normalize_timespec(&zero_seconds, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kZeroSeconds), 0);
+}
+
+TEST(OsafNormalizeTimespec, AlreadyNormalized) {
+ const timespec already_normalized = { 123456789, 987654321 };
+ timespec result;
+ osaf_normalize_timespec(&already_normalized, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &already_normalized), 0);
+}
+
+TEST(OsafNormalizeTimespec, NanoseconsdGreaterThanOneBillion) {
+ const timespec not_normalized = { 123456789, 1987654321 };
+ const timespec normalized = { 123456790, 987654321 };
+ timespec result;
+ osaf_normalize_timespec(¬_normalized, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &normalized), 0);
+}
+
+TEST(OsafNormalizeTimespec, NanoseconsdLessThanZero) {
+ const timespec not_normalized = { 123456789, -100 };
+ const timespec normalized = { 123456788, 1000000000 - 100 };
+ timespec result;
+ osaf_normalize_timespec(¬_normalized, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &normalized), 0);
+}
+
+TEST(OsafNormalizeTimespec, NanoseconsGreaterThan2Billions) {
+ const timespec not_normalized = { 123456789, 2101234567 };
+ const timespec normalized = { 123456789 + 2, 101234567 };
+ timespec result;
+ osaf_normalize_timespec(¬_normalized, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &normalized), 0);
+}
+
+TEST(OsafNormalizeTimespec, NanoseconsLessThanMinus2Billions) {
+ const timespec not_normalized = { 123456789, -2000000567 };
+ const timespec normalized = { 123456789 - 2 - 1, 1000000000 - 567 };
+ timespec result;
+ osaf_normalize_timespec(¬_normalized, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &normalized), 0);
+}
+
+TEST(OsafNormalizeTimespec, BothParametersAtSameAddress) {
+ const timespec not_normalized = { 123456789, -2000000567 };
+ const timespec normalized = { 123456789 - 2 - 1, 1000000000 - 567 };
+ timespec result = not_normalized;
+ osaf_normalize_timespec(&result, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &normalized), 0);
+}
+
+TEST(OsafNormalizeTimespec, NegativeSecondsAndNanoseconds) {
+ const timespec not_normalized = { -123, -1 };
+ const timespec normalized = { -124, 999999999 };
+ timespec result;
+ osaf_normalize_timespec(¬_normalized, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &normalized), 0);
+}
diff --git a/osaf/libs/core/common/tests/osaf_time_test.cc
b/osaf/libs/core/common/tests/osaf_time_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_time_test.cc
@@ -0,0 +1,390 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: [email protected] (Zhanyong Wan)
+
+
+// This sample shows how to write a simple unit test for a function,
+// using Google C++ testing framework.
+//
+// Writing a unit test using Google C++ testing framework is easy as 1-2-3:
+
+
+// Step 1. Include necessary header files such that the stuff your
+// test logic needs is declared.
+//
+// Don't forget gtest.h, which declares the testing framework.
+
+#include <limits.h>
+#include "osaf_time.h"
+#include "osaf_utility.h"
+#include "gtest/gtest.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/time.h>
+
+static long counter;
+
+void osaf_abort(long i_cause) {
+ fprintf(stderr, "osaf_abort(%ld) called\n", i_cause);
+ abort();
+}
+
+void alarm_handler(int sig) {
+ ++counter;
+}
+
+// Step 2. Use the TEST macro to define your tests.
+//
+// TEST has two parameters: the test case name and the test name.
+// After using the macro, you should define your test logic between a
+// pair of braces. You can use a bunch of macros to indicate the
+// success or failure of a test. EXPECT_TRUE and EXPECT_EQ are
+// examples of such macros. For a complete list, see gtest.h.
+//
+// <TechnicalDetails>
+//
+// In Google Test, tests are grouped into test cases. This is how we
+// keep test code organized. You should put logically related tests
+// into the same test case.
+//
+// The test case name and the test name should both be valid C++
+// identifiers. And you should not use underscore (_) in the names.
+//
+// Google Test guarantees that each test you define is run exactly
+// once, but it makes no guarantee on the order the tests are
+// executed. Therefore, you should write your tests in such a way
+// that their results don't depend on their order.
+//
+// </TechnicalDetails>
+
+
+// Tests Factorial().
+
+// Tests factorial of negative numbers.
+TEST(osaf_time_test, osaf_clock_gettime) {
+ struct timespec ts1 = { 10, 10 };
+ struct timespec ts2 = { 9, 9 };
+ struct timespec ts3 = { 11, 11 };
+ const struct timespec ts_9ms = { 0, 9000000 };
+ const struct timespec ts_10ms = { 0, 10000000 };
+ const struct timespec ts_900ms = { 0, 900000000 };
+
+ osaf_clock_gettime(CLOCK_MONOTONIC, &ts1);
+ usleep(10000);
+ osaf_clock_gettime(CLOCK_MONOTONIC, &ts2);
+
+ osaf_timespec_subtract(&ts2, &ts1, &ts3);
+
+ EXPECT_GE(osaf_timespec_compare(&ts2, &ts1), 0);
+ EXPECT_EQ(osaf_timespec_compare(&ts3, &ts_9ms), 1);
+ EXPECT_GE(osaf_timespec_compare(&ts3, &ts_10ms), 0);
+ EXPECT_EQ(osaf_timespec_compare(&ts3, &ts_900ms), -1);
+}
+
+// Tests factorial of negative numbers.
+TEST(osaf_time_test, osaf_nanosleep) {
+ struct timespec ts1 = { 10, 10 };
+ struct timespec ts2 = { 9, 9 };
+ struct timespec ts3 = { 11, 11 };
+ const struct timespec ts_1_233ms = { 1, 233000000 };
+ const struct timespec ts_1_234ms = { 1, 234000000 };
+ const struct timespec ts_1_567ms = { 1, 567000000 };
+
+ counter = 0;
+ signal(SIGALRM, alarm_handler);
+ struct itimerval itv = {
+ {0, 379},
+ {0, 379}
+ };
+ setitimer(ITIMER_REAL, &itv, NULL);
+
+ osaf_clock_gettime(CLOCK_MONOTONIC, &ts1);
+ osaf_nanosleep(&ts_1_234ms);
+ osaf_clock_gettime(CLOCK_MONOTONIC, &ts2);
+
+ osaf_timespec_subtract(&ts2, &ts1, &ts3);
+
+ printf("counter: %ld\n", counter);
+
+ EXPECT_EQ(osaf_timespec_compare(&ts3, &ts_1_233ms), 1);
+ EXPECT_GE(osaf_timespec_compare(&ts3, &ts_1_234ms), 0);
+ EXPECT_EQ(osaf_timespec_compare(&ts3, &ts_1_567ms), -1);
+ // EXPECT_LE(counter, 1234000 / 379);
+ // EXPECT_GT(counter, 1000);
+
+ signal(SIGALRM, SIG_IGN);
+ struct itimerval itv2 = {
+ {0, 0},
+ {0, 0}
+ };
+ setitimer(ITIMER_REAL, &itv2, NULL);
+}
+
+TEST(osaf_time_test, osaf_normalize_timespec) {
+ struct timespec ts = { 1, 1 };
+
+ const struct timespec ts0 = { 0, 0 }; // should be same after normalization
+ osaf_normalize_timespec(&ts0, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts0), 0);
+
+ const struct timespec ts1 = { 123456789, 987654321 }; // should be same
after normalization
+ osaf_normalize_timespec(&ts1, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts1), 0);
+
+ // Positive tv_nsec. tv_sec needs to stepped exactly than one second
+ const struct timespec ts2 = { 123456789, 1987654321 };
+ const struct timespec ts2_nrm = { 123456790, 987654321 }; // ts2 normalized
+ osaf_normalize_timespec(&ts2, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts2_nrm), 0);
+
+ // Negative tv_nsec. tv_sec needs to stepped exactly than one second
+ const struct timespec ts3 = { 123456789, -100 };
+ const struct timespec ts3_nrm = { 123456788, 1000000000 - 100 }; // ts3
normalized
+ osaf_normalize_timespec(&ts3, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts3_nrm), 0);
+
+ // Positive tv_nsec. tv_sec needs to stepped with more than one second
+ const struct timespec ts4 = { 123456789, 123987654321 };
+ const struct timespec ts4_nrm = { 123456789 + 123, 987654321 }; // ts4
normalized
+ osaf_normalize_timespec(&ts4, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts4_nrm), 0);
+
+ // Negative tv_nsec. tv_sec needs to stepped with more than one second
+ const struct timespec ts5 = { 123456789, -456000000567 };
+ const struct timespec ts5_nrm = { 123456789 - 456 - 1, 1000000000 - 567 };
// ts5 normalized
+ osaf_normalize_timespec(&ts5, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts5_nrm), 0);
+
+ // Check that normalization works if both both parameters refer to the same
memory location
+ ts = ts5;
+ osaf_normalize_timespec(&ts, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts5_nrm), 0);
+
+ // Negative tv_sec and tv_nsec.
+ const struct timespec ts6 = { -123, -1 };
+ const struct timespec ts6_nrm = { -124, 999999999 }; // ts6 normalized
+ osaf_normalize_timespec(&ts6, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts6_nrm), 0);
+}
+
+// Tests factorial of negative numbers.
+TEST(osaf_time_test, osaf_timespec_add) {
+ struct timespec ts;
+ const struct timespec ts_0_0s = { 0, 0 };
+ const struct timespec ts_0_1s = { 0, 100000000 };
+ const struct timespec ts_2_4s = { 2, 400000000 };
+ const struct timespec ts_4_8s = { 4, 800000000 };
+ const struct timespec ts_9_6s = { 9, 600000000 };
+ const struct timespec ts_9_7s = { 9, 700000000 };
+ const struct timespec ts_19_3s = { 19, 300000000 };
+ const struct timespec ts1 = { 3715800020576315623, 358743382 };
+ const struct timespec ts2 = { 3637143377279394477, 719128783 };
+ const struct timespec ts3 = { 7352943397855710101, 77872165 }; // sum of
ts1 + ts2
+
+ ts = ts_0_0s;
+
+ osaf_timespec_add(&ts, &ts_0_0s, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_0_0s), 0);
+
+ osaf_timespec_add(&ts, &ts, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_0_0s), 0);
+
+ osaf_timespec_add(&ts, &ts_2_4s, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_2_4s), 0);
+
+ osaf_timespec_add(&ts, &ts, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_4_8s), 0);
+
+ osaf_timespec_add(&ts, &ts, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_9_6s), 0);
+
+ osaf_timespec_add(&ts_0_0s, &ts, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_9_6s), 0);
+
+ osaf_timespec_add(&ts_0_1s, &ts, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_9_7s), 0);
+
+ osaf_timespec_add(&ts, &ts_9_6s, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_19_3s), 0);
+
+ osaf_timespec_add(&ts1, &ts2, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts3), 0);
+
+}
+
+// Tests factorial of negative numbers.
+TEST(osaf_time_test, osaf_timespec_subtract) {
+ struct timespec ts;
+ const struct timespec ts_0_0s = { 0, 0 };
+ const struct timespec ts_0_9s = { 0, 900000000 };
+ const struct timespec ts_1_0s = { 1, 0 };
+ const struct timespec ts_0_1s = { 0, 100000000 };
+ const struct timespec ts_0_2s = { 0, 200000000 };
+ const struct timespec ts_1_1s = { 1, 100000000 };
+ const struct timespec ts1 = { 3715800020576315623, 358743382 };
+ const struct timespec ts2 = { 3637143377279394477, 639614599 };
+ const struct timespec ts3 = { 78656643296921145, 719128783 }; //
difference of ts1 - ts2
+
+ ts = ts1;
+
+ osaf_timespec_subtract(&ts, &ts, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_0_0s), 0);
+
+ osaf_timespec_subtract(&ts_1_1s, &ts_0_1s, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_1_0s), 0);
+
+ osaf_timespec_subtract(&ts_1_1s, &ts_1_0s, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_0_1s), 0);
+
+ osaf_timespec_subtract(&ts_1_1s, &ts_0_2s, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_0_9s), 0);
+
+ osaf_timespec_subtract(&ts1, &ts2, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts3), 0);
+
+ osaf_timespec_subtract(&ts, &ts_0_0s, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts3), 0);
+}
+
+// Tests factorial of negative numbers.
+TEST(osaf_time_test, osaf_timespec_compare) {
+ const struct timespec ts_0_0s = { 0, 0 };
+ const struct timespec ts_0_1s = { 0, 100000000 };
+ const struct timespec ts_0_9s = { 0, 900000000 };
+ const struct timespec ts_1_0s = { 1, 0 };
+ const struct timespec ts_1_1s = { 1, 100000000 };
+
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_0s, &ts_0_0s), 0);
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_0s, &ts_0_1s), -1);
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_1s, &ts_0_0s), 1);
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_0s, &ts_1_0s), -1);
+ EXPECT_EQ(osaf_timespec_compare(&ts_1_0s, &ts_0_0s), 1);
+
+ EXPECT_EQ(osaf_timespec_compare(&ts_1_0s, &ts_1_0s), 0);
+ EXPECT_EQ(osaf_timespec_compare(&ts_1_0s, &ts_1_1s), -1);
+ EXPECT_EQ(osaf_timespec_compare(&ts_1_1s, &ts_1_0s), 1);
+
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_9s, &ts_0_9s), 0);
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_9s, &ts_1_1s), -1);
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_9s, &ts_0_1s), 1);
+ EXPECT_EQ(osaf_timespec_compare(&ts_1_1s, &ts_0_9s), 1);
+ EXPECT_EQ(osaf_timespec_compare(&ts_0_1s, &ts_0_9s), -1);
+}
+
+// Tests factorial of negative numbers.
+TEST(osaf_time_test, osaf_timespec_to_timeval) {
+ const struct timespec ts = { 3715800020576315623, 358743382 };
+ const struct timeval tv_expected = { 3715800020576315623, 358743 };
+ struct timeval tv = { 0, 0 };
+
+ osaf_timespec_to_timeval(&ts, &tv);
+ EXPECT_EQ(tv.tv_sec, tv_expected.tv_sec);
+ EXPECT_EQ(tv.tv_usec, tv_expected.tv_usec);
+}
+
+TEST(osaf_time_test, osaf_timeval_to_timespec) {
+ const struct timeval tv = { 3715800020576315623, 358743 };
+ const struct timespec ts_expected = { 3715800020576315623, 358743000 };
+ struct timespec ts = { 0, 0};
+
+ osaf_timeval_to_timespec(&tv, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_expected), 0);
+}
+
+TEST(osaf_time_test, osaf_millis_to_timespec) {
+ const struct timespec ts_expected = { 13725125428499100, 961000000 };
+ struct timespec ts = { 0, 0};
+
+ osaf_millis_to_timespec(13725125428499100961ull, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_expected), 0);
+}
+
+TEST(osaf_time_test, osaf_micros_to_timespec) {
+ const struct timespec ts_expected = { 13725125428499, 100961000 };
+ struct timespec ts = { 0, 0};
+
+ osaf_micros_to_timespec(13725125428499100961ull, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_expected), 0);
+}
+
+TEST(osaf_time_test, osaf_nanos_to_timespec) {
+ const struct timespec ts_expected = { 13725125428, 499100961 };
+ struct timespec ts = { 0, 0};
+
+ osaf_nanos_to_timespec(13725125428499100961ull, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_expected), 0);
+}
+
+TEST(osaf_time_test, osaf_double_to_timespec) {
+ const struct timespec ts_expected = { 15714713, 125433700 };
+ const struct timespec ts_expected2 = { -15714714, 874566300 };
+ struct timespec ts = { 0, 0};
+
+ osaf_double_to_timespec(15714713.1254337, &ts);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_expected), 0);
+ osaf_double_to_timespec(-15714713.1254337, &ts);
+ // printf("%lld %lld\n", (long long) ts.tv_sec, (long long) ts.tv_nsec);
+ EXPECT_EQ(osaf_timespec_compare(&ts, &ts_expected2), 0);
+}
+
+TEST(osaf_time_test, osaf_timespec_to_millis) {
+ const struct timespec ts = { 13725125428499100, 961923266 };
+
+ uint64_t result = osaf_timespec_to_millis(&ts);
+ EXPECT_EQ(result, 13725125428499100961ull);
+}
+
+TEST(osaf_time_test, osaf_timespec_to_micros) {
+ const struct timespec ts = { 13725125428499, 100961923 };
+
+ uint64_t result = osaf_timespec_to_micros(&ts);
+ EXPECT_EQ(result, 13725125428499100961ull);
+}
+
+TEST(osaf_time_test, osaf_timespec_to_nanos) {
+ const struct timespec ts = { 13725125428, 499100961 };
+
+ uint64_t result = osaf_timespec_to_nanos(&ts);
+ EXPECT_EQ(result, 13725125428499100961ull);
+}
+
+TEST(osaf_time_test, osaf_timespec_to_double) {
+ const struct timespec ts = { 15714713, 125433700 };
+ const struct timespec ts2 = { -15714714, 874566300 };
+
+ double result1 = osaf_timespec_to_double(&ts);
+ double result2 = osaf_timespec_to_double(&ts2);
+ EXPECT_EQ(result1, 15714713.1254337);
+ EXPECT_EQ(result2, -15714713.1254337);
+}
diff --git a/osaf/libs/core/common/tests/osaf_timespec_add_test.cc
b/osaf/libs/core/common/tests/osaf_timespec_add_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_timespec_add_test.cc
@@ -0,0 +1,62 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "osaf_time.h"
+#include "gtest/gtest.h"
+
+static const timespec kTwoDotFourSeconds = { 2, 400000000 };
+static const timespec kFourDotEightSeconds = { 4, 800000000 };
+static const timespec kNineDotSixSeconds = { 9, 600000000 };
+static const timespec number1 = { 576315623, 358743382 };
+static const timespec number2 = { 1279394477, 719128783 };
+static const timespec sum = { 1855710101, 77872165 };
+
+TEST(OsafTimespecAdd, ZeroPlusZero) {
+ timespec result;
+ osaf_timespec_add(&kZeroSeconds, &kZeroSeconds, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kZeroSeconds), 0);
+}
+
+TEST(OsafTimespecAdd, TwoDotFourAddedWithItself) {
+ timespec result = kTwoDotFourSeconds;
+ osaf_timespec_add(&result, &result, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kFourDotEightSeconds), 0);
+}
+
+TEST(OsafTimespecAdd, FourDotEightAddedWithItself) {
+ timespec result = kFourDotEightSeconds;
+ osaf_timespec_add(&result, &result, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kNineDotSixSeconds), 0);
+}
+
+TEST(OsafTimespecAdd, AddRandomNumbers) {
+ timespec result;
+ osaf_timespec_add(&number1, &number2, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &sum), 0);
+}
+
+TEST(OsafTimespecAdd, FirstParameterAndResultAtSameAddress) {
+ timespec result = number1;
+ osaf_timespec_add(&result, &number2, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &sum), 0);
+}
+
+TEST(OsafTimespecAdd, SecondParameterAndResultAtSameAddress) {
+ timespec result = number2;
+ osaf_timespec_add(&number1, &result, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &sum), 0);
+}
diff --git a/osaf/libs/core/common/tests/osaf_timespec_compare_test.cc
b/osaf/libs/core/common/tests/osaf_timespec_compare_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_timespec_compare_test.cc
@@ -0,0 +1,75 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "osaf_time.h"
+#include "gtest/gtest.h"
+
+static const timespec kZeroDotOneSeconds = { 0, 100000000 };
+static const timespec kZeroDotNineSeconds = { 0, 900000000 };
+static const timespec kOneDotOneSeconds = { 1, 100000000 };
+
+TEST(OsafTimespecCompare, ZeroWithZero) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroSeconds, &kZeroSeconds), 0);
+}
+
+TEST(OsafTimespecCompare, ZeroWithZeroDotOne) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroSeconds, &kZeroDotOneSeconds), -1);
+}
+
+TEST(OsafTimespecCompare, ZeroDotOneWithZero) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroDotOneSeconds, &kZeroSeconds), 1);
+}
+
+TEST(OsafTimespecCompare, ZeroWithOne) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroSeconds, &kOneSecond), -1);
+}
+
+TEST(OsafTimespecCompare, OneWithZero) {
+ EXPECT_EQ(osaf_timespec_compare(&kOneSecond, &kZeroSeconds), 1);
+}
+
+TEST(OsafTimespecCompare, OneWithOne) {
+ EXPECT_EQ(osaf_timespec_compare(&kOneSecond, &kOneSecond), 0);
+}
+
+TEST(OsafTimespecCompare, OneWithOneDotOne) {
+ EXPECT_EQ(osaf_timespec_compare(&kOneSecond, &kOneDotOneSeconds), -1);
+}
+
+TEST(OsafTimespecCompare, OneDotOneWithOne) {
+ EXPECT_EQ(osaf_timespec_compare(&kOneDotOneSeconds, &kOneSecond), 1);
+}
+
+TEST(OsafTimespecCompare, ZeroDotNineWithZeroDotNine) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroDotNineSeconds, &kZeroDotNineSeconds),
0);
+}
+
+TEST(OsafTimespecCompare, ZeroDotNineWithOneDotOne) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroDotNineSeconds, &kOneDotOneSeconds),
-1);
+}
+
+TEST(OsafTimespecCompare, ZeroDotNineWithZeroDotOne) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroDotNineSeconds, &kZeroDotOneSeconds),
1);
+}
+
+TEST(OsafTimespecCompare, OneDotOneWithZeroDotNine) {
+ EXPECT_EQ(osaf_timespec_compare(&kOneDotOneSeconds, &kZeroDotNineSeconds),
1);
+}
+
+TEST(OsafTimespecCompare, ZeroDotOneWithZeroDotNine) {
+ EXPECT_EQ(osaf_timespec_compare(&kZeroDotOneSeconds, &kZeroDotNineSeconds),
-1);
+}
diff --git a/osaf/libs/core/common/tests/osaf_timespec_convert_test.cc
b/osaf/libs/core/common/tests/osaf_timespec_convert_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_timespec_convert_test.cc
@@ -0,0 +1,100 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "osaf_time.h"
+#include "gtest/gtest.h"
+
+static const timespec kTimespec = { 1576315623, 358743382 };
+static const timeval kTimeval = { 1576315623, 358743 };
+static const timespec kTruncatedTimespec = { 1576315623, 358743000 };
+
+TEST(OsafTimespecConvert, TimespecToTimeval) {
+ timeval result = { 0, 0 };
+ osaf_timespec_to_timeval(&kTimespec, &result);
+ EXPECT_EQ(result.tv_sec, kTimeval.tv_sec);
+ EXPECT_EQ(result.tv_usec, kTimeval.tv_usec);
+}
+
+TEST(OsafTimespecConvert, TimevalToTimespec) {
+ timespec result = { 0, 0 };
+ osaf_timeval_to_timespec(&kTimeval, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kTruncatedTimespec), 0);
+}
+
+TEST(OsafTimespecConvert, MillisToTimespec) {
+ const timespec expected_result = { 1428499100, 961000000 };
+ timespec result = { 0, 0 };
+ osaf_millis_to_timespec(1428499100961ull, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &expected_result), 0);
+}
+
+TEST(OsafTimespecConvert, MicrosToTimespec) {
+ const timespec expected_result = { 2125428499, 100961000 };
+ timespec result = { 0, 0 };
+ osaf_micros_to_timespec(2125428499100961ull, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &expected_result), 0);
+}
+
+TEST(OsafTimespecConvert, NanosToTimespec) {
+ const struct timespec expected_result = { 1725125428, 499100961 };
+ timespec result = { 0, 0 };
+
+ osaf_nanos_to_timespec(1725125428499100961ull, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &expected_result), 0);
+}
+
+TEST(OsafTimespecConvert, DoubleToTimespec) {
+ const struct timespec expected_result = { 15714713, 125433700 };
+ const struct timespec expected_result2 = { -15714714, 874566300 };
+ timespec result = { 0, 0 };
+
+ osaf_double_to_timespec(15714713.1254337, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &expected_result), 0);
+ osaf_double_to_timespec(-15714713.1254337, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &expected_result2), 0);
+}
+
+TEST(OsafTimespecConvert, TimespecToMillis) {
+ const struct timespec ts = { 1428499100, 961923266 };
+
+ uint64_t result = osaf_timespec_to_millis(&ts);
+ EXPECT_EQ(result, 1428499100961ull);
+}
+
+TEST(OsafTimespecConvert, TimespecToMicros) {
+ const struct timespec ts = { 1125428499, 100961923 };
+
+ uint64_t result = osaf_timespec_to_micros(&ts);
+ EXPECT_EQ(result, 1125428499100961ull);
+}
+
+TEST(OsafTimespecConvert, TimespecToNanos) {
+ const struct timespec ts = { 1725125428, 499100961 };
+
+ uint64_t result = osaf_timespec_to_nanos(&ts);
+ EXPECT_EQ(result, 1725125428499100961ull);
+}
+
+TEST(OsafTimespecConvert, TimespecToDouble) {
+ const struct timespec ts = { 15714713, 125433700 };
+ const struct timespec ts2 = { -15714714, 874566300 };
+
+ double result1 = osaf_timespec_to_double(&ts);
+ double result2 = osaf_timespec_to_double(&ts2);
+ EXPECT_EQ(result1, 15714713.1254337);
+ EXPECT_EQ(result2, -15714713.1254337);
+}
diff --git a/osaf/libs/core/common/tests/osaf_timespec_subtract_test.cc
b/osaf/libs/core/common/tests/osaf_timespec_subtract_test.cc
new file mode 100644
--- /dev/null
+++ b/osaf/libs/core/common/tests/osaf_timespec_subtract_test.cc
@@ -0,0 +1,62 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2015 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "osaf_time.h"
+#include "gtest/gtest.h"
+
+static const timespec kOneDotOneSeconds = { 1, 100000000 };
+static const timespec kZeroDotTwoSeconds = { 0, 200000000 };
+static const timespec kZeroDotNineSeconds = { 0, 900000000 };
+static const timespec number1 = { 1576315623, 358743382 };
+static const timespec number2 = { 279394477, 639614599 };
+static const timespec difference = { 1296921145, 719128783 };
+
+TEST(OsafTimespecSubtract, ZeroMinusZero) {
+ timespec result;
+ osaf_timespec_subtract(&kZeroSeconds, &kZeroSeconds, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kZeroSeconds), 0);
+}
+
+TEST(OsafTimespecSubtract, FifteenMinusFive) {
+ timespec result = kFifteenSeconds;
+ osaf_timespec_subtract(&result, &kFiveSeconds, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kTenSeconds), 0);
+}
+
+TEST(OsafTimespecSubtract, OneDotOneMinusZeroDotTwo) {
+ timespec result;
+ osaf_timespec_subtract(&kOneDotOneSeconds, &kZeroDotTwoSeconds, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &kZeroDotNineSeconds), 0);
+}
+
+TEST(OsafTimespecSubtract, SubtractRandomNumbers) {
+ timespec result;
+ osaf_timespec_subtract(&number1, &number2, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &difference), 0);
+}
+
+TEST(OsafTimespecSubtract, FirstParameterAndResultAtSameAddress) {
+ timespec result = number1;
+ osaf_timespec_subtract(&result, &number2, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &difference), 0);
+}
+
+TEST(OsafTimespecSubtract, SecondParameterAndResultAtSameAddress) {
+ timespec result = number2;
+ osaf_timespec_subtract(&number1, &result, &result);
+ EXPECT_EQ(osaf_timespec_compare(&result, &difference), 0);
+}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel