mirror of https://github.com/grpc/grpc.git
commit
7e0d08c520
20 changed files with 369 additions and 0 deletions
@ -0,0 +1,77 @@ |
||||
//
|
||||
// Copyright 2021 the gRPC authors.
|
||||
//
|
||||
// Licensed 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 <grpc/support/port_platform.h> |
||||
|
||||
#include <grpc/support/log.h> |
||||
|
||||
#include "src/core/lib/gprpp/time_util.h" |
||||
|
||||
namespace grpc_core { |
||||
|
||||
gpr_timespec ToGprTimeSpec(absl::Duration duration) { |
||||
if (duration == absl::InfiniteDuration()) { |
||||
return gpr_inf_future(GPR_TIMESPAN); |
||||
} else if (duration == -absl::InfiniteDuration()) { |
||||
return gpr_inf_past(GPR_TIMESPAN); |
||||
} else { |
||||
int64_t s = absl::IDivDuration(duration, absl::Seconds(1), &duration); |
||||
int64_t n = absl::IDivDuration(duration, absl::Nanoseconds(1), &duration); |
||||
return gpr_time_add(gpr_time_from_seconds(s, GPR_TIMESPAN), |
||||
gpr_time_from_nanos(n, GPR_TIMESPAN)); |
||||
} |
||||
} |
||||
|
||||
gpr_timespec ToGprTimeSpec(absl::Time time) { |
||||
if (time == absl::InfiniteFuture()) { |
||||
return gpr_inf_future(GPR_CLOCK_REALTIME); |
||||
} else if (time == absl::InfinitePast()) { |
||||
return gpr_inf_past(GPR_CLOCK_REALTIME); |
||||
} else { |
||||
timespec ts = absl::ToTimespec(time); |
||||
gpr_timespec out; |
||||
out.tv_sec = static_cast<decltype(out.tv_sec)>(ts.tv_sec); |
||||
out.tv_nsec = static_cast<decltype(out.tv_nsec)>(ts.tv_nsec); |
||||
out.clock_type = GPR_CLOCK_REALTIME; |
||||
return out; |
||||
} |
||||
} |
||||
|
||||
absl::Duration ToAbslDuration(gpr_timespec ts) { |
||||
GPR_ASSERT(ts.clock_type == GPR_TIMESPAN); |
||||
if (gpr_time_cmp(ts, gpr_inf_future(GPR_TIMESPAN)) == 0) { |
||||
return absl::InfiniteDuration(); |
||||
} else if (gpr_time_cmp(ts, gpr_inf_past(GPR_TIMESPAN)) == 0) { |
||||
return -absl::InfiniteDuration(); |
||||
} else { |
||||
return absl::Seconds(ts.tv_sec) + absl::Nanoseconds(ts.tv_nsec); |
||||
} |
||||
} |
||||
|
||||
absl::Time ToAbslTime(gpr_timespec ts) { |
||||
GPR_ASSERT(ts.clock_type != GPR_TIMESPAN); |
||||
gpr_timespec rts = gpr_convert_clock_type(ts, GPR_CLOCK_REALTIME); |
||||
if (gpr_time_cmp(rts, gpr_inf_future(GPR_CLOCK_REALTIME)) == 0) { |
||||
return absl::InfiniteFuture(); |
||||
} else if (gpr_time_cmp(rts, gpr_inf_past(GPR_CLOCK_REALTIME)) == 0) { |
||||
return absl::InfinitePast(); |
||||
} else { |
||||
return absl::UnixEpoch() + absl::Seconds(rts.tv_sec) + |
||||
absl::Nanoseconds(rts.tv_nsec); |
||||
} |
||||
} |
||||
|
||||
} // namespace grpc_core
|
@ -0,0 +1,42 @@ |
||||
//
|
||||
// Copyright 2021 the gRPC authors.
|
||||
//
|
||||
// Licensed 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.
|
||||
//
|
||||
|
||||
#ifndef GRPC_CORE_LIB_GPRPP_TIME_UTIL_H |
||||
#define GRPC_CORE_LIB_GPRPP_TIME_UTIL_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <grpc/support/time.h> |
||||
|
||||
#include "absl/time/time.h" |
||||
|
||||
namespace grpc_core { |
||||
|
||||
// Converts absl::Duration to gpr_timespec(GPR_TIMESPAN)
|
||||
gpr_timespec ToGprTimeSpec(absl::Duration duration); |
||||
|
||||
// Converts absl::Time to gpr_timespec(GPR_CLOCK_REALTIME)
|
||||
gpr_timespec ToGprTimeSpec(absl::Time time); |
||||
|
||||
// Converts gpr_timespec(GPR_TIMESPAN) to absl::Duration
|
||||
absl::Duration ToAbslDuration(gpr_timespec ts); |
||||
|
||||
// Converts gpr_timespec(GPR_CLOCK_[MONOTONIC|REALTIME|PRECISE]) to absl::Time
|
||||
absl::Time ToAbslTime(gpr_timespec ts); |
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif // GRPC_CORE_LIB_GPRPP_TIME_UTIL_H
|
@ -0,0 +1,134 @@ |
||||
//
|
||||
// Copyright 2021 the gRPC authors.
|
||||
//
|
||||
// Licensed 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 <stdio.h> |
||||
#include <string.h> |
||||
|
||||
#include <gtest/gtest.h> |
||||
|
||||
#include <grpc/support/time.h> |
||||
|
||||
#include "absl/time/time.h" |
||||
|
||||
#include "src/core/lib/gprpp/time_util.h" |
||||
|
||||
TEST(TimeUtilTest, ToGprTimeSpecFromAbslDurationWithRegularValues) { |
||||
std::vector<int> times = {-10, -1, 0, 1, 10}; |
||||
for (int t : times) { |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_nanos(t, GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(absl::Nanoseconds(t)))); |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_micros(t, GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(absl::Microseconds(t)))); |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_millis(t, GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(absl::Milliseconds(t)))); |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_seconds(t, GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(absl::Seconds(t)))); |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_minutes(t, GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(absl::Minutes(t)))); |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_hours(t, GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(absl::Hours(t)))); |
||||
} |
||||
} |
||||
|
||||
TEST(TimeUtilTest, ToGprTimeSpecFromAbslDurationWithInfinites) { |
||||
EXPECT_EQ(0, |
||||
gpr_time_cmp(gpr_inf_past(GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(-absl::InfiniteDuration()))); |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_time_0(GPR_TIMESPAN), |
||||
grpc_core::ToGprTimeSpec(absl::ZeroDuration()))); |
||||
} |
||||
|
||||
TEST(TimeUtilTest, ToGprTimeSpecFromAbslTimeWithRegularValues) { |
||||
std::vector<int> times = {0, 10, 100000000}; |
||||
for (int t : times) { |
||||
EXPECT_EQ(0, |
||||
gpr_time_cmp(gpr_time_from_nanos(t, GPR_CLOCK_REALTIME), |
||||
grpc_core::ToGprTimeSpec(absl::FromUnixNanos(t)))); |
||||
EXPECT_EQ(0, |
||||
gpr_time_cmp(gpr_time_from_micros(t, GPR_CLOCK_REALTIME), |
||||
grpc_core::ToGprTimeSpec(absl::FromUnixMicros(t)))); |
||||
EXPECT_EQ(0, |
||||
gpr_time_cmp(gpr_time_from_millis(t, GPR_CLOCK_REALTIME), |
||||
grpc_core::ToGprTimeSpec(absl::FromUnixMillis(t)))); |
||||
EXPECT_EQ(0, |
||||
gpr_time_cmp(gpr_time_from_seconds(t, GPR_CLOCK_REALTIME), |
||||
grpc_core::ToGprTimeSpec(absl::FromUnixSeconds(t)))); |
||||
} |
||||
} |
||||
|
||||
TEST(TimeUtilTest, ToGprTimeSpecFromAbslTimeWithInfinites) { |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_inf_future(GPR_CLOCK_REALTIME), |
||||
grpc_core::ToGprTimeSpec(absl::InfiniteFuture()))); |
||||
EXPECT_EQ(0, gpr_time_cmp(gpr_inf_past(GPR_CLOCK_REALTIME), |
||||
grpc_core::ToGprTimeSpec(absl::InfinitePast()))); |
||||
} |
||||
|
||||
TEST(TimeUtilTest, ToAbslDurationWithRegularValues) { |
||||
std::vector<int> times = {-10, -1, 0, 1, 10}; |
||||
for (int t : times) { |
||||
EXPECT_EQ(absl::Nanoseconds(t), |
||||
grpc_core::ToAbslDuration(gpr_time_from_nanos(t, GPR_TIMESPAN))); |
||||
EXPECT_EQ(absl::Microseconds(t), |
||||
grpc_core::ToAbslDuration(gpr_time_from_micros(t, GPR_TIMESPAN))); |
||||
EXPECT_EQ(absl::Milliseconds(t), |
||||
grpc_core::ToAbslDuration(gpr_time_from_millis(t, GPR_TIMESPAN))); |
||||
EXPECT_EQ(absl::Seconds(t), grpc_core::ToAbslDuration( |
||||
gpr_time_from_seconds(t, GPR_TIMESPAN))); |
||||
EXPECT_EQ(absl::Minutes(t), grpc_core::ToAbslDuration( |
||||
gpr_time_from_minutes(t, GPR_TIMESPAN))); |
||||
EXPECT_EQ(absl::Hours(t), |
||||
grpc_core::ToAbslDuration(gpr_time_from_hours(t, GPR_TIMESPAN))); |
||||
} |
||||
} |
||||
|
||||
TEST(TimeUtilTest, ToAbslDurationWithInfinites) { |
||||
EXPECT_EQ(absl::InfiniteDuration(), |
||||
grpc_core::ToAbslDuration(gpr_inf_future(GPR_TIMESPAN))); |
||||
EXPECT_EQ(-absl::InfiniteDuration(), |
||||
grpc_core::ToAbslDuration(gpr_inf_past(GPR_TIMESPAN))); |
||||
} |
||||
|
||||
TEST(TimeUtilTest, ToAbslTimeWithRegularValues) { |
||||
std::vector<int> times = {0, 10, 100000000}; |
||||
for (int t : times) { |
||||
EXPECT_EQ(absl::FromUnixNanos(t), grpc_core::ToAbslTime(gpr_time_from_nanos( |
||||
t, GPR_CLOCK_REALTIME))); |
||||
EXPECT_EQ( |
||||
absl::FromUnixMicros(t), |
||||
grpc_core::ToAbslTime(gpr_time_from_micros(t, GPR_CLOCK_REALTIME))); |
||||
EXPECT_EQ( |
||||
absl::FromUnixMillis(t), |
||||
grpc_core::ToAbslTime(gpr_time_from_millis(t, GPR_CLOCK_REALTIME))); |
||||
EXPECT_EQ( |
||||
absl::FromUnixSeconds(t), |
||||
grpc_core::ToAbslTime(gpr_time_from_seconds(t, GPR_CLOCK_REALTIME))); |
||||
} |
||||
} |
||||
|
||||
TEST(TimeUtilTest, ToAbslTimeWithInfinites) { |
||||
EXPECT_EQ(absl::InfiniteFuture(), |
||||
grpc_core::ToAbslTime(gpr_inf_future(GPR_CLOCK_REALTIME))); |
||||
EXPECT_EQ(absl::InfinitePast(), |
||||
grpc_core::ToAbslTime(gpr_inf_past(GPR_CLOCK_REALTIME))); |
||||
EXPECT_EQ(absl::UnixEpoch(), |
||||
grpc_core::ToAbslTime(gpr_time_0(GPR_CLOCK_REALTIME))); |
||||
} |
||||
|
||||
int main(int argc, char** argv) { |
||||
::testing::InitGoogleTest(&argc, argv); |
||||
int ret = RUN_ALL_TESTS(); |
||||
return ret; |
||||
} |
Loading…
Reference in new issue