blob: 1118438d7a936bda9dab32746ec7203b7e495394 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <zircon/time.h>
#include <zxtest/zxtest.h>
namespace {
TEST(TimeTest, TimeAddDuration) {
EXPECT_EQ(0, zx_time_add_duration(0, 0));
EXPECT_EQ(918741562, zx_time_add_duration(918729180, 12382));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_add_duration(ZX_TIME_INFINITE_PAST, 0));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_add_duration(ZX_TIME_INFINITE_PAST, -1));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_add_duration(ZX_TIME_INFINITE_PAST, -3298901));
EXPECT_EQ(ZX_TIME_INFINITE_PAST,
zx_time_add_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, 0));
EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, 1));
EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, 3298901));
EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
}
TEST(TimeTest, TimeSubDuration) {
EXPECT_EQ(-1, zx_time_sub_duration(1, 2));
EXPECT_EQ(-1, zx_time_sub_duration(0, 1));
EXPECT_EQ(0, zx_time_sub_duration(0, 0));
EXPECT_EQ(0, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
EXPECT_EQ(0, zx_time_sub_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, 0));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, 1));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(INT64_MIN, INT64_MAX));
EXPECT_EQ((ZX_TIME_INFINITE - 1), zx_time_sub_duration(ZX_TIME_INFINITE, 1));
EXPECT_EQ(918716798, zx_time_sub_duration(918729180, 12382));
}
TEST(TimeTest, TimeSubTime) {
EXPECT_EQ(-1, zx_time_sub_time(1, 2));
EXPECT_EQ(-1, zx_time_sub_time(0, 1));
EXPECT_EQ(0, zx_time_sub_time(0, 0));
EXPECT_EQ(0, zx_time_sub_time(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
EXPECT_EQ(0, zx_time_sub_time(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(ZX_TIME_INFINITE_PAST, 0));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(ZX_TIME_INFINITE_PAST, 1));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(INT64_MIN, INT64_MAX));
EXPECT_EQ((ZX_TIME_INFINITE - 1), zx_time_sub_time(ZX_TIME_INFINITE, 1));
EXPECT_EQ(918716798, zx_time_sub_time(918729180, 12382));
}
TEST(TimeTest, TimeFrom) {
// overflow saturates to ZX_TIME_INFINITE
EXPECT_EQ(zx_time_from_timespec({9223372036, 1}), 9223372036000000001);
EXPECT_EQ(zx_time_from_timespec({9223372036, 900000000}), ZX_TIME_INFINITE);
// underflow saturates to ZX_TIME_INFINITE_PAST
EXPECT_EQ(zx_time_from_timespec({9223372036, 1}), 9223372036000000001);
EXPECT_EQ(zx_time_from_timespec({-9223372036, -900000000}), ZX_TIME_INFINITE_PAST);
// Verify that when the argument is a constexpr the function can evaluated at compile time.
static_assert(zx_time_from_timespec({123, 456}) == 123000000456);
}
TEST(TimeTest, DurationAddDuration) {
EXPECT_EQ(0, zx_duration_add_duration(0, 0));
EXPECT_EQ(918741562, zx_duration_add_duration(918729180, 12382));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_add_duration(ZX_TIME_INFINITE_PAST, 0));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_add_duration(ZX_TIME_INFINITE_PAST, -1));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_add_duration(ZX_TIME_INFINITE_PAST, -3298901));
EXPECT_EQ(ZX_TIME_INFINITE_PAST,
zx_duration_add_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, 0));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, 1));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, 3298901));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, INT64_MAX));
}
TEST(TimeTest, DurationSubDuration) {
EXPECT_EQ(918716798, zx_duration_sub_duration(918729180, 12382));
EXPECT_EQ(-1, zx_duration_sub_duration(1, 2));
EXPECT_EQ(-1, zx_duration_sub_duration(0, 1));
EXPECT_EQ(0, zx_duration_sub_duration(0, 0));
EXPECT_EQ(0, zx_duration_sub_duration(3980, 3980));
EXPECT_EQ(0, zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
EXPECT_EQ(0, zx_duration_sub_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, 0));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, 1));
EXPECT_EQ(ZX_TIME_INFINITE_PAST,
zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_sub_duration(INT64_MIN, INT64_MAX));
EXPECT_EQ((ZX_TIME_INFINITE - 1), zx_duration_sub_duration(ZX_TIME_INFINITE, 1));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_sub_duration(0, ZX_TIME_INFINITE_PAST));
}
TEST(TimeTest, DurationMulInt64) {
EXPECT_EQ(0, zx_duration_mul_int64(0, 0));
EXPECT_EQ(39284291, zx_duration_mul_int64(39284291, 1));
EXPECT_EQ(220499082795, zx_duration_mul_int64(23451, 9402545));
EXPECT_EQ(-39284291, zx_duration_mul_int64(39284291, -1));
EXPECT_EQ(-220499082795, zx_duration_mul_int64(23451, -9402545));
EXPECT_EQ(220499082795, zx_duration_mul_int64(-23451, -9402545));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_mul_int64(ZX_TIME_INFINITE, 2));
EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_mul_int64(ZX_TIME_INFINITE_PAST, -2));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_mul_int64(ZX_TIME_INFINITE_PAST, 2));
}
TEST(TimeTest, DurationFrom) {
// overflow saturates to ZX_TIME_INFINITE
EXPECT_EQ(zx_duration_from_nsec(INT64_MAX), ZX_TIME_INFINITE);
EXPECT_EQ(zx_duration_from_usec(9223372036854775), 9223372036854775000);
EXPECT_EQ(zx_duration_from_usec(9223372036854776), ZX_TIME_INFINITE);
EXPECT_EQ(zx_duration_from_msec(9223372036854), 9223372036854000000);
EXPECT_EQ(zx_duration_from_msec(9223372036855), ZX_TIME_INFINITE);
EXPECT_EQ(zx_duration_from_sec(9223372036), 9223372036000000000);
EXPECT_EQ(zx_duration_from_sec(9223372037), ZX_TIME_INFINITE);
EXPECT_EQ(zx_duration_from_min(153722867), 9223372020000000000);
EXPECT_EQ(zx_duration_from_min(153722868), ZX_TIME_INFINITE);
EXPECT_EQ(zx_duration_from_hour(2562047), 9223369200000000000);
EXPECT_EQ(zx_duration_from_hour(2562048), ZX_TIME_INFINITE);
EXPECT_EQ(zx_duration_from_timespec({9223372036, 1}), 9223372036000000001);
EXPECT_EQ(zx_duration_from_timespec({9223372036, 900000000}), ZX_TIME_INFINITE);
// underflow saturates to ZX_TIME_INFINITE_PAST
EXPECT_EQ(zx_duration_from_nsec(INT64_MIN), ZX_TIME_INFINITE_PAST);
EXPECT_EQ(zx_duration_from_usec(-9223372036854775), -9223372036854775000);
EXPECT_EQ(zx_duration_from_usec(-9223372036854776), ZX_TIME_INFINITE_PAST);
EXPECT_EQ(zx_duration_from_msec(-9223372036854), -9223372036854000000);
EXPECT_EQ(zx_duration_from_msec(-9223372036855), ZX_TIME_INFINITE_PAST);
EXPECT_EQ(zx_duration_from_sec(-9223372036), -9223372036000000000);
EXPECT_EQ(zx_duration_from_sec(-9223372037), ZX_TIME_INFINITE_PAST);
EXPECT_EQ(zx_duration_from_min(-153722867), -9223372020000000000);
EXPECT_EQ(zx_duration_from_min(-153722868), ZX_TIME_INFINITE_PAST);
EXPECT_EQ(zx_duration_from_hour(-2562047), -9223369200000000000);
EXPECT_EQ(zx_duration_from_hour(-2562048), ZX_TIME_INFINITE_PAST);
EXPECT_EQ(zx_duration_from_timespec({9223372036, 1}), 9223372036000000001);
EXPECT_EQ(zx_duration_from_timespec({-9223372036, -900000000}), ZX_TIME_INFINITE_PAST);
// Verify that when the argument is a constexpr the function can evaluated at compile time.
static_assert(zx_duration_from_nsec(1) == 1);
static_assert(zx_duration_from_usec(1) == 1000);
static_assert(zx_duration_from_msec(1) == 1000000);
static_assert(zx_duration_from_sec(1) == 1000000000);
static_assert(zx_duration_from_min(1) == 60000000000);
static_assert(zx_duration_from_hour(1) == 3600000000000);
static_assert(zx_duration_from_timespec({123, 456}) == 123000000456);
}
TEST(TimeTest, TicksAddTicks) {
EXPECT_EQ(0, zx_ticks_add_ticks(0, 0));
EXPECT_EQ(918741562, zx_ticks_add_ticks(918729180, 12382));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_add_ticks(ZX_TIME_INFINITE_PAST, 0));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_add_ticks(ZX_TIME_INFINITE_PAST, -1));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_add_ticks(ZX_TIME_INFINITE_PAST, -3298901));
EXPECT_EQ(ZX_TIME_INFINITE_PAST,
zx_ticks_add_ticks(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_add_ticks(ZX_TIME_INFINITE, 0));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_add_ticks(ZX_TIME_INFINITE, 1));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_add_ticks(ZX_TIME_INFINITE, 3298901));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_add_ticks(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_add_ticks(ZX_TIME_INFINITE, INT64_MAX));
}
TEST(TimeTest, TicksSubTicks) {
EXPECT_EQ(918716798, zx_ticks_sub_ticks(918729180, 12382));
EXPECT_EQ(-1, zx_ticks_sub_ticks(1, 2));
EXPECT_EQ(-1, zx_ticks_sub_ticks(0, 1));
EXPECT_EQ(0, zx_ticks_sub_ticks(0, 0));
EXPECT_EQ(0, zx_ticks_sub_ticks(3980, 3980));
EXPECT_EQ(0, zx_ticks_sub_ticks(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
EXPECT_EQ(0, zx_ticks_sub_ticks(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_sub_ticks(ZX_TIME_INFINITE_PAST, 0));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_sub_ticks(ZX_TIME_INFINITE_PAST, 1));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_sub_ticks(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_sub_ticks(INT64_MIN, INT64_MAX));
EXPECT_EQ((ZX_TIME_INFINITE - 1), zx_ticks_sub_ticks(ZX_TIME_INFINITE, 1));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_sub_ticks(0, ZX_TIME_INFINITE_PAST));
}
TEST(TimeTest, TicksMulInt64) {
EXPECT_EQ(0, zx_ticks_mul_int64(0, 0));
EXPECT_EQ(39284291, zx_ticks_mul_int64(39284291, 1));
EXPECT_EQ(220499082795, zx_ticks_mul_int64(23451, 9402545));
EXPECT_EQ(-39284291, zx_ticks_mul_int64(39284291, -1));
EXPECT_EQ(-220499082795, zx_ticks_mul_int64(23451, -9402545));
EXPECT_EQ(220499082795, zx_ticks_mul_int64(-23451, -9402545));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_mul_int64(ZX_TIME_INFINITE, 2));
EXPECT_EQ(ZX_TIME_INFINITE, zx_ticks_mul_int64(ZX_TIME_INFINITE_PAST, -2));
EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_ticks_mul_int64(ZX_TIME_INFINITE_PAST, 2));
}
// See that we can use the conversion macros as constexpr initializers.
static constexpr const zx_duration_t durations[] = {
ZX_NSEC(1), ZX_USEC(1), ZX_MSEC(1), ZX_SEC(1), ZX_MIN(1), ZX_HOUR(1),
};
// Equality operator to make tests more legible.
constexpr bool operator==(const timespec& a, const timespec& b) {
return a.tv_sec == b.tv_sec && a.tv_nsec == b.tv_nsec;
}
TEST(TimeTest, TimeSpecFrom) {
EXPECT_EQ(zx_timespec_from_time(ZX_SEC(123) + ZX_NSEC(456)), (timespec{123, 456}));
EXPECT_EQ(zx_timespec_from_duration(ZX_SEC(123) + ZX_NSEC(456)), (timespec{123, 456}));
// ZX_TIME_INFINITE converts to max timespec.
const timespec kInfiniteTimeSpec{INT64_MAX / 1000000000, INT64_MAX % 1000000000};
EXPECT_EQ(zx_timespec_from_time(ZX_TIME_INFINITE), kInfiniteTimeSpec);
EXPECT_EQ(zx_timespec_from_duration(ZX_TIME_INFINITE), kInfiniteTimeSpec);
// ZX_TIME_INFINITE_PAST converts to min timespec.
const timespec kInfinitePastTimeSpec{INT64_MIN / 1000000000, INT64_MIN % 1000000000};
EXPECT_EQ(zx_timespec_from_time(ZX_TIME_INFINITE_PAST), kInfinitePastTimeSpec);
EXPECT_EQ(zx_timespec_from_duration(ZX_TIME_INFINITE_PAST), kInfinitePastTimeSpec);
// Verify that when the argument is a constexpr the function can evaluated at compile time.
static_assert(zx_timespec_from_time(ZX_SEC(123) + ZX_NSEC(456)) == timespec{123, 456});
static_assert(zx_timespec_from_duration(ZX_SEC(123) + ZX_NSEC(456)) == timespec{123, 456});
}
TEST(TimeTest, MacroConversion) {
// Verify a few values just shy of overflow.
EXPECT_EQ(ZX_NSEC(INT64_MAX), ZX_TIME_INFINITE);
EXPECT_EQ(ZX_USEC(9223372036854775), 9223372036854775000);
EXPECT_EQ(ZX_MSEC(9223372036854), 9223372036854000000);
EXPECT_EQ(ZX_SEC(9223372036), 9223372036000000000);
EXPECT_EQ(ZX_MIN(153722867), 9223372020000000000);
EXPECT_EQ(ZX_HOUR(2562047), 9223369200000000000);
EXPECT_EQ(ZX_NSEC(INT64_MIN), ZX_TIME_INFINITE_PAST);
EXPECT_EQ(ZX_USEC(-9223372036854775), -9223372036854775000);
EXPECT_EQ(ZX_MSEC(-9223372036854), -9223372036854000000);
EXPECT_EQ(ZX_SEC(-9223372036), -9223372036000000000);
EXPECT_EQ(ZX_MIN(-153722867), -9223372020000000000);
EXPECT_EQ(ZX_HOUR(-2562047), -9223369200000000000);
// Verify that the macro can be evaluated at compile time when the argument is a literal.
static_assert(ZX_NSEC(1) == 1);
static_assert(ZX_USEC(1) == 1000);
static_assert(ZX_MSEC(1) == 1000000);
static_assert(ZX_SEC(1) == 1000000000);
static_assert(ZX_MIN(1) == 60000000000);
static_assert(ZX_HOUR(1) == 3600000000000);
// Verify that the macro argument is evaluated only once.
zx_duration_t d = 0;
EXPECT_EQ(ZX_NSEC(++d), 1LL);
EXPECT_EQ(d, 1);
EXPECT_EQ(ZX_USEC(++d), 2LL * 1000);
EXPECT_EQ(d, 2);
EXPECT_EQ(ZX_MSEC(++d), 3LL * 1000000);
EXPECT_EQ(d, 3);
EXPECT_EQ(ZX_SEC(++d), 4LL * 1000000000);
EXPECT_EQ(d, 4);
EXPECT_EQ(ZX_MIN(++d), 5LL * 60 * 1000000000);
EXPECT_EQ(d, 5);
EXPECT_EQ(ZX_HOUR(++d), 6LL * 60 * 60 * 1000000000);
EXPECT_EQ(d, 6);
// Refer to durations to make sure the compiler knows it's used.
EXPECT_EQ(durations[0], ZX_NSEC(1));
EXPECT_EQ(durations[1], ZX_USEC(1));
EXPECT_EQ(durations[2], ZX_MSEC(1));
EXPECT_EQ(durations[3], ZX_SEC(1));
EXPECT_EQ(durations[4], ZX_MIN(1));
EXPECT_EQ(durations[5], ZX_HOUR(1));
}
} // namespace