From fca258467781ac60913d253aa6c6355aabb46ca3 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 7 Oct 2024 11:45:24 +0000 Subject: [PATCH 01/27] grpc-core: combined epoch seconds and nanos changes in TimeProvider --- core/src/main/java/io/grpc/internal/TimeProvider.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index b0ea147ada1..41fdf87d185 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -16,6 +16,7 @@ package io.grpc.internal; +import java.time.Instant; import java.util.concurrent.TimeUnit; /** @@ -29,7 +30,10 @@ public interface TimeProvider { TimeProvider SYSTEM_TIME_PROVIDER = new TimeProvider() { @Override public long currentTimeNanos() { - return TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); + Instant instant = Instant.now(); + int nanos = instant.getNano(); + long epochSeconds = instant.getEpochSecond(); + return nanos + epochSeconds; } }; } From 12b9b1ac32b8843c45cb0fc47c2797ea883e6afe Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Tue, 8 Oct 2024 08:25:08 +0000 Subject: [PATCH 02/27] grpc-core: combined epoch seconds and nanos changes in TimeProvider --- core/src/main/java/io/grpc/internal/TimeProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index 41fdf87d185..d48d58cacba 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -33,7 +33,7 @@ public long currentTimeNanos() { Instant instant = Instant.now(); int nanos = instant.getNano(); long epochSeconds = instant.getEpochSecond(); - return nanos + epochSeconds; + return Long.parseLong("" + epochSeconds + nanos); } }; } From 3d538d8c11c282af68617583be6fb358ca0ac954 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Tue, 8 Oct 2024 09:22:28 +0000 Subject: [PATCH 03/27] grpc-core: Fixed checkstyle issue --- core/src/main/java/io/grpc/internal/TimeProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index d48d58cacba..ad7de2401be 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -17,7 +17,6 @@ package io.grpc.internal; import java.time.Instant; -import java.util.concurrent.TimeUnit; /** * Time source representing the current system time in nanos. Used to inject a fake clock From 9d04a747e72c0ddae4bf02ff47ffc82516026fd2 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Tue, 8 Oct 2024 09:58:32 +0000 Subject: [PATCH 04/27] grpc-core: added the comment --- core/src/main/java/io/grpc/internal/TimeProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index ad7de2401be..a618f384841 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -32,6 +32,7 @@ public long currentTimeNanos() { Instant instant = Instant.now(); int nanos = instant.getNano(); long epochSeconds = instant.getEpochSecond(); + // combining seconds and nanos part and returning the timestamp in nanoseconds return Long.parseLong("" + epochSeconds + nanos); } }; From 9c564dc382576e1dee18f476048fbb7965d54e3c Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Tue, 8 Oct 2024 11:24:37 +0000 Subject: [PATCH 05/27] grpc-core: removed the comment --- core/src/main/java/io/grpc/internal/TimeProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index a618f384841..ad7de2401be 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -32,7 +32,6 @@ public long currentTimeNanos() { Instant instant = Instant.now(); int nanos = instant.getNano(); long epochSeconds = instant.getEpochSecond(); - // combining seconds and nanos part and returning the timestamp in nanoseconds return Long.parseLong("" + epochSeconds + nanos); } }; From a64afccf051b58830a98b4de5a177ec662517252 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Wed, 9 Oct 2024 10:47:20 +0000 Subject: [PATCH 06/27] grpc-core: Fixed Review points along with junits --- .../java/io/grpc/internal/TimeProvider.java | 2 +- .../io/grpc/internal/TimeProviderTest.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/io/grpc/internal/TimeProviderTest.java diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index ad7de2401be..efc22a63777 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -32,7 +32,7 @@ public long currentTimeNanos() { Instant instant = Instant.now(); int nanos = instant.getNano(); long epochSeconds = instant.getEpochSecond(); - return Long.parseLong("" + epochSeconds + nanos); + return epochSeconds * 1_000_000_000L + nanos; } }; } diff --git a/core/src/test/java/io/grpc/internal/TimeProviderTest.java b/core/src/test/java/io/grpc/internal/TimeProviderTest.java new file mode 100644 index 00000000000..239379f0dcb --- /dev/null +++ b/core/src/test/java/io/grpc/internal/TimeProviderTest.java @@ -0,0 +1,43 @@ +/* + * Copyright 2017 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. + */ + +package io.grpc.internal; + +import static org.junit.Assert.assertTrue; + +import java.time.Instant; +import org.junit.Test; + +/** + * Unit tests for {@link TimeProvider}. + */ +public class TimeProviderTest { + @Test + public void testCurrentTimeNanos() { + + // Get the current time from the TimeProvider + long actualTimeNanos = TimeProvider.SYSTEM_TIME_PROVIDER.currentTimeNanos(); + + // Get the current time from Instant for comparison + Instant instantNow = Instant.now(); + long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); + + // Validate the time returned is close to the expected value within a tolerance. + long toleranceOfTwoMilliSecond = 2_000_000L; // 2 millisecond tolerance in nanoseconds + assertTrue("The current time in nanoseconds should be close to the expected time.", + Math.abs(actualTimeNanos - expectedTimeNanos) < toleranceOfTwoMilliSecond); + } +} From 34d7c1dd39d6b795e9e89fbfefd764dce6425e7d Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Thu, 10 Oct 2024 08:07:00 +0000 Subject: [PATCH 07/27] grpc-core: Fixed Review points --- core/src/test/java/io/grpc/internal/TimeProviderTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/io/grpc/internal/TimeProviderTest.java b/core/src/test/java/io/grpc/internal/TimeProviderTest.java index 239379f0dcb..9363c9fa2db 100644 --- a/core/src/test/java/io/grpc/internal/TimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/TimeProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The gRPC Authors + * Copyright 2024 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. @@ -36,8 +36,8 @@ public void testCurrentTimeNanos() { long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); // Validate the time returned is close to the expected value within a tolerance. - long toleranceOfTwoMilliSecond = 2_000_000L; // 2 millisecond tolerance in nanoseconds + long toleranceOfTenMilliSecond = 10_000_000L; // 10 millisecond tolerance in nanoseconds assertTrue("The current time in nanoseconds should be close to the expected time.", - Math.abs(actualTimeNanos - expectedTimeNanos) < toleranceOfTwoMilliSecond); + Math.abs(actualTimeNanos - expectedTimeNanos) < toleranceOfTenMilliSecond); } } From 32cd4557f2e8b792f60befdae606e5015605d7f4 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Thu, 10 Oct 2024 09:09:07 +0000 Subject: [PATCH 08/27] grpc-core: Fixed Review points --- core/src/test/java/io/grpc/internal/TimeProviderTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/io/grpc/internal/TimeProviderTest.java b/core/src/test/java/io/grpc/internal/TimeProviderTest.java index 9363c9fa2db..d28b88f207e 100644 --- a/core/src/test/java/io/grpc/internal/TimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/TimeProviderTest.java @@ -35,9 +35,9 @@ public void testCurrentTimeNanos() { Instant instantNow = Instant.now(); long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); - // Validate the time returned is close to the expected value within a tolerance. - long toleranceOfTenMilliSecond = 10_000_000L; // 10 millisecond tolerance in nanoseconds + // Validate the time returned is close to the expected value within a tolerance + // (i,e 10 millisecond tolerance in nanoseconds). assertTrue("The current time in nanoseconds should be close to the expected time.", - Math.abs(actualTimeNanos - expectedTimeNanos) < toleranceOfTenMilliSecond); + Math.abs(actualTimeNanos - expectedTimeNanos) < 10_000_000L); } } From 71ce04041922b03e9d0db9eb1374e1f3442735a7 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Thu, 17 Oct 2024 10:39:03 +0000 Subject: [PATCH 09/27] grpc-core: Fixed Review points --- .../main/java/io/grpc/internal/TimeProvider.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index efc22a63777..2199be0f27b 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -16,7 +16,7 @@ package io.grpc.internal; -import java.time.Instant; +import java.util.concurrent.TimeUnit; /** * Time source representing the current system time in nanos. Used to inject a fake clock @@ -29,10 +29,15 @@ public interface TimeProvider { TimeProvider SYSTEM_TIME_PROVIDER = new TimeProvider() { @Override public long currentTimeNanos() { - Instant instant = Instant.now(); - int nanos = instant.getNano(); - long epochSeconds = instant.getEpochSecond(); - return epochSeconds * 1_000_000_000L + nanos; + try { + Class instantClass = Class.forName("java.time.Instant"); + Object instant = instantClass.getMethod("now").invoke(null); + int nanos = (int) instantClass.getMethod("getNano").invoke(instant); + long epochSeconds = (long) instantClass.getMethod("getEpochSecond").invoke(instant); + return epochSeconds * 1_000_000_000L + nanos; + } catch (Exception exception) { + return TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); + } } }; } From 58073d47f0127724e8fb7a684b7492276c707598 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Thu, 17 Oct 2024 11:26:20 +0000 Subject: [PATCH 10/27] grpc-core: Reverted back to previous changes --- .../main/java/io/grpc/internal/TimeProvider.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index 2199be0f27b..efc22a63777 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -16,7 +16,7 @@ package io.grpc.internal; -import java.util.concurrent.TimeUnit; +import java.time.Instant; /** * Time source representing the current system time in nanos. Used to inject a fake clock @@ -29,15 +29,10 @@ public interface TimeProvider { TimeProvider SYSTEM_TIME_PROVIDER = new TimeProvider() { @Override public long currentTimeNanos() { - try { - Class instantClass = Class.forName("java.time.Instant"); - Object instant = instantClass.getMethod("now").invoke(null); - int nanos = (int) instantClass.getMethod("getNano").invoke(instant); - long epochSeconds = (long) instantClass.getMethod("getEpochSecond").invoke(instant); - return epochSeconds * 1_000_000_000L + nanos; - } catch (Exception exception) { - return TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); - } + Instant instant = Instant.now(); + int nanos = instant.getNano(); + long epochSeconds = instant.getEpochSecond(); + return epochSeconds * 1_000_000_000L + nanos; } }; } From 808b587412d1811048063fd1a8f88d4aad3161cd Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Fri, 18 Oct 2024 12:29:42 +0000 Subject: [PATCH 11/27] core: Fixed the UT as per Review point --- core/src/test/java/io/grpc/internal/TimeProviderTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/io/grpc/internal/TimeProviderTest.java b/core/src/test/java/io/grpc/internal/TimeProviderTest.java index d28b88f207e..a88f490afab 100644 --- a/core/src/test/java/io/grpc/internal/TimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/TimeProviderTest.java @@ -16,7 +16,7 @@ package io.grpc.internal; -import static org.junit.Assert.assertTrue; +import static com.google.common.truth.Truth.assertThat; import java.time.Instant; import org.junit.Test; @@ -37,7 +37,6 @@ public void testCurrentTimeNanos() { // Validate the time returned is close to the expected value within a tolerance // (i,e 10 millisecond tolerance in nanoseconds). - assertTrue("The current time in nanoseconds should be close to the expected time.", - Math.abs(actualTimeNanos - expectedTimeNanos) < 10_000_000L); + assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); } } From 7eee75de7d1b2c503b7a270524a61ef3a1b80bab Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 21 Oct 2024 07:36:43 +0000 Subject: [PATCH 12/27] core: changed the implementation as per the review points --- .../grpc/internal/ConcurrentTimeProvider.java | 32 ++++++++++++++ .../io/grpc/internal/InstantTimeProvider.java | 42 +++++++++++++++++++ .../java/io/grpc/internal/TimeProvider.java | 12 +----- .../internal/TimeProviderResolverFactory.java | 42 +++++++++++++++++++ ...Test.java => InstantTimeProviderTest.java} | 5 ++- 5 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 core/src/main/java/io/grpc/internal/ConcurrentTimeProvider.java create mode 100644 core/src/main/java/io/grpc/internal/InstantTimeProvider.java create mode 100644 core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java rename core/src/test/java/io/grpc/internal/{TimeProviderTest.java => InstantTimeProviderTest.java} (94%) diff --git a/core/src/main/java/io/grpc/internal/ConcurrentTimeProvider.java b/core/src/main/java/io/grpc/internal/ConcurrentTimeProvider.java new file mode 100644 index 00000000000..c82a68222b4 --- /dev/null +++ b/core/src/main/java/io/grpc/internal/ConcurrentTimeProvider.java @@ -0,0 +1,32 @@ +/* + * Copyright 2024 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. + */ + +package io.grpc.internal; + +import java.util.concurrent.TimeUnit; + +/** + * {@link ConcurrentTimeProvider} resolves ConcurrentTimeProvider which implements + * {@link TimeProvider}. + */ + +final class ConcurrentTimeProvider implements TimeProvider { + + @Override + public long currentTimeNanos() { + return TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); + } +} diff --git a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java new file mode 100644 index 00000000000..12b9196a9a3 --- /dev/null +++ b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 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. + */ + +package io.grpc.internal; + +/** + * {@link InstantTimeProvider} resolves InstantTimeProvider which implements {@link TimeProvider}. + */ + +final class InstantTimeProvider implements TimeProvider { + + private Class instantClass; + + public InstantTimeProvider(Class instantClass) { + this.instantClass = instantClass; + } + + @Override + public long currentTimeNanos() { + try { + Object instant = instantClass.getMethod("now").invoke(null); + int nanos = (int) instantClass.getMethod("getNano").invoke(instant); + long epochSeconds = (long) instantClass.getMethod("getEpochSecond").invoke(instant); + return epochSeconds * 1_000_000_000L + nanos; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/core/src/main/java/io/grpc/internal/TimeProvider.java b/core/src/main/java/io/grpc/internal/TimeProvider.java index efc22a63777..3bd052ab3e0 100644 --- a/core/src/main/java/io/grpc/internal/TimeProvider.java +++ b/core/src/main/java/io/grpc/internal/TimeProvider.java @@ -16,8 +16,6 @@ package io.grpc.internal; -import java.time.Instant; - /** * Time source representing the current system time in nanos. Used to inject a fake clock * into unit tests. @@ -26,13 +24,5 @@ public interface TimeProvider { /** Returns the current nano time. */ long currentTimeNanos(); - TimeProvider SYSTEM_TIME_PROVIDER = new TimeProvider() { - @Override - public long currentTimeNanos() { - Instant instant = Instant.now(); - int nanos = instant.getNano(); - long epochSeconds = instant.getEpochSecond(); - return epochSeconds * 1_000_000_000L + nanos; - } - }; + TimeProvider SYSTEM_TIME_PROVIDER = TimeProviderResolverFactory.resolveTimeProvider(); } diff --git a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java new file mode 100644 index 00000000000..b2553a74e2c --- /dev/null +++ b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 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. + */ + +package io.grpc.internal; + +/** + * {@link TimeProviderResolverFactory} resolves Time providers. + */ + +final class TimeProviderResolverFactory { + + private static final Class INSTANT_CLASS = initInstant(); + + private static Class initInstant() { + try { + return Class.forName("java.time.Instant"); + } catch (Exception ex) { + return null; + } + } + + static TimeProvider resolveTimeProvider() { + if (INSTANT_CLASS == null) { + return new ConcurrentTimeProvider(); + } else { + return new InstantTimeProvider(INSTANT_CLASS); + } + } +} diff --git a/core/src/test/java/io/grpc/internal/TimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java similarity index 94% rename from core/src/test/java/io/grpc/internal/TimeProviderTest.java rename to core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index a88f490afab..66d76e75d1e 100644 --- a/core/src/test/java/io/grpc/internal/TimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -22,9 +22,10 @@ import org.junit.Test; /** - * Unit tests for {@link TimeProvider}. + * Unit tests for {@link TimeProvider}. */ -public class TimeProviderTest { +public class InstantTimeProviderTest { + @Test public void testCurrentTimeNanos() { From 6d59fa1c92b5b12fcaa48c055dec912ddc21a05b Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 21 Oct 2024 07:44:17 +0000 Subject: [PATCH 13/27] core: Fixed checkstyle issue --- .../main/java/io/grpc/internal/TimeProviderResolverFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java index b2553a74e2c..ba7d9e83ffc 100644 --- a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java +++ b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java @@ -22,7 +22,7 @@ final class TimeProviderResolverFactory { - private static final Class INSTANT_CLASS = initInstant(); + private static final Class INSTANT_CLASS = initInstant(); private static Class initInstant() { try { From a43e9fc6366be5b4e6f3b0f8757745628a7e8ea2 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 21 Oct 2024 07:49:05 +0000 Subject: [PATCH 14/27] core: Fixed checkstyle issue --- .../main/java/io/grpc/internal/TimeProviderResolverFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java index ba7d9e83ffc..7ca5a538723 100644 --- a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java +++ b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java @@ -22,7 +22,7 @@ final class TimeProviderResolverFactory { - private static final Class INSTANT_CLASS = initInstant(); + private static final Class INSTANT_CLASS = initInstant(); private static Class initInstant() { try { From 04f1c3d22bccf2690ba7d548d07b3d53a9e7da38 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 21 Oct 2024 08:16:44 +0000 Subject: [PATCH 15/27] core: Added junits for the changes --- .../internal/InstantTimeProviderTest.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 66d76e75d1e..84556186866 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -27,10 +27,33 @@ public class InstantTimeProviderTest { @Test - public void testCurrentTimeNanos() { + public void testInstantCurrentTimeNanos() { + try { + InstantTimeProvider instantTimeProvider = new InstantTimeProvider( + Class.forName("java.time.Instant")); + + // Get the current time from the TimeProvider + long actualTimeNanos = instantTimeProvider.currentTimeNanos(); + + // Get the current time from Instant for comparison + Instant instantNow = Instant.now(); + long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); + + // Validate the time returned is close to the expected value within a tolerance + // (i,e 10 millisecond tolerance in nanoseconds). + assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Test + public void testConcurrentCurrentTimeNanos() { + + ConcurrentTimeProvider concurrentTimeProvider = new ConcurrentTimeProvider(); // Get the current time from the TimeProvider - long actualTimeNanos = TimeProvider.SYSTEM_TIME_PROVIDER.currentTimeNanos(); + long actualTimeNanos = concurrentTimeProvider.currentTimeNanos(); // Get the current time from Instant for comparison Instant instantNow = Instant.now(); From 7d09147a2dbe534b5df24ac140c53e43a4c1263d Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 21 Oct 2024 08:51:13 +0000 Subject: [PATCH 16/27] core: Added annotation for junit class --- .../test/java/io/grpc/internal/InstantTimeProviderTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 84556186866..6b98b700a98 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -20,10 +20,13 @@ import java.time.Instant; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; /** - * Unit tests for {@link TimeProvider}. + * Unit tests for {@link InstantTimeProvider}. */ +@RunWith(JUnit4.class) public class InstantTimeProviderTest { @Test From 19a44f5bffb1c4ab5aed2a450bc45ab640e3b472 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 21 Oct 2024 10:11:09 +0000 Subject: [PATCH 17/27] okHttp: Code cleanup --- .../internal/InstantTimeProviderTest.java | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 6b98b700a98..594005333d9 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -30,8 +30,23 @@ public class InstantTimeProviderTest { @Test - public void testInstantCurrentTimeNanos() { + public void testConcurrentCurrentTimeNanos() { + ConcurrentTimeProvider concurrentTimeProvider = new ConcurrentTimeProvider(); + // Get the current time from the TimeProvider + long actualTimeNanos = concurrentTimeProvider.currentTimeNanos(); + + // Get the current time from Instant for comparison + Instant instantNow = Instant.now(); + long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); + + // Validate the time returned is close to the expected value within a tolerance + // (i,e 10 millisecond tolerance in nanoseconds). + assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); + } + + @Test + public void testInstantCurrentTimeNanos() { try { InstantTimeProvider instantTimeProvider = new InstantTimeProvider( Class.forName("java.time.Instant")); @@ -50,20 +65,4 @@ public void testInstantCurrentTimeNanos() { throw new RuntimeException(e); } } - - @Test - public void testConcurrentCurrentTimeNanos() { - - ConcurrentTimeProvider concurrentTimeProvider = new ConcurrentTimeProvider(); - // Get the current time from the TimeProvider - long actualTimeNanos = concurrentTimeProvider.currentTimeNanos(); - - // Get the current time from Instant for comparison - Instant instantNow = Instant.now(); - long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); - - // Validate the time returned is close to the expected value within a tolerance - // (i,e 10 millisecond tolerance in nanoseconds). - assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); - } } From 1757f995c62cffa7528f59e3b4a9d94b3856334b Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Wed, 23 Oct 2024 09:41:35 +0000 Subject: [PATCH 18/27] core: Fixed the review points --- .../io/grpc/internal/InstantTimeProvider.java | 25 +++++++++++++------ .../internal/InstantTimeProviderTest.java | 6 ++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java index 12b9196a9a3..6d76adae7b8 100644 --- a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java +++ b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java @@ -16,25 +16,34 @@ package io.grpc.internal; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; + /** * {@link InstantTimeProvider} resolves InstantTimeProvider which implements {@link TimeProvider}. */ - final class InstantTimeProvider implements TimeProvider { - - private Class instantClass; + private Method now; + private Method getNano; + private Method getEpochSecond; public InstantTimeProvider(Class instantClass) { - this.instantClass = instantClass; + try { + this.now = instantClass.getMethod("now"); + this.getNano = instantClass.getMethod("getNano"); + this.getEpochSecond = instantClass.getMethod("getEpochSecond"); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } } @Override public long currentTimeNanos() { try { - Object instant = instantClass.getMethod("now").invoke(null); - int nanos = (int) instantClass.getMethod("getNano").invoke(instant); - long epochSeconds = (long) instantClass.getMethod("getEpochSecond").invoke(instant); - return epochSeconds * 1_000_000_000L + nanos; + Object instant = this.now.invoke(null); + int nanos = (int) getNano.invoke(instant); + long epochSeconds = (long) getEpochSecond.invoke(instant); + return TimeUnit.SECONDS.toNanos(epochSeconds) + nanos; } catch (Exception ex) { throw new RuntimeException(ex); } diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 594005333d9..c60c68d1493 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import java.time.Instant; +import java.util.concurrent.TimeUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -28,7 +29,6 @@ */ @RunWith(JUnit4.class) public class InstantTimeProviderTest { - @Test public void testConcurrentCurrentTimeNanos() { @@ -38,7 +38,7 @@ public void testConcurrentCurrentTimeNanos() { // Get the current time from Instant for comparison Instant instantNow = Instant.now(); - long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); + long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + instantNow.getNano(); // Validate the time returned is close to the expected value within a tolerance // (i,e 10 millisecond tolerance in nanoseconds). @@ -56,7 +56,7 @@ public void testInstantCurrentTimeNanos() { // Get the current time from Instant for comparison Instant instantNow = Instant.now(); - long expectedTimeNanos = instantNow.getEpochSecond() * 1_000_000_000L + instantNow.getNano(); + long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + instantNow.getNano(); // Validate the time returned is close to the expected value within a tolerance // (i,e 10 millisecond tolerance in nanoseconds). From b6a91b9b793fd3f0c4cf3329ab8edab185c4001c Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Wed, 23 Oct 2024 09:55:24 +0000 Subject: [PATCH 19/27] core: Fixed checkstyle issue --- .../src/main/java/io/grpc/internal/InstantTimeProvider.java | 2 +- .../test/java/io/grpc/internal/InstantTimeProviderTest.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java index 6d76adae7b8..94fcde3477f 100644 --- a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java +++ b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java @@ -40,7 +40,7 @@ public InstantTimeProvider(Class instantClass) { @Override public long currentTimeNanos() { try { - Object instant = this.now.invoke(null); + Object instant = now.invoke(null); int nanos = (int) getNano.invoke(instant); long epochSeconds = (long) getEpochSecond.invoke(instant); return TimeUnit.SECONDS.toNanos(epochSeconds) + nanos; diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index c60c68d1493..6dce00b0635 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -38,7 +38,8 @@ public void testConcurrentCurrentTimeNanos() { // Get the current time from Instant for comparison Instant instantNow = Instant.now(); - long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + instantNow.getNano(); + long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + + instantNow.getNano(); // Validate the time returned is close to the expected value within a tolerance // (i,e 10 millisecond tolerance in nanoseconds). @@ -56,7 +57,8 @@ public void testInstantCurrentTimeNanos() { // Get the current time from Instant for comparison Instant instantNow = Instant.now(); - long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + instantNow.getNano(); + long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + + instantNow.getNano(); // Validate the time returned is close to the expected value within a tolerance // (i,e 10 millisecond tolerance in nanoseconds). From 5178e783377d53569d5094cd618e6bbc80a82738 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Wed, 23 Oct 2024 12:03:24 +0000 Subject: [PATCH 20/27] core: Added junit for exception flow --- .../grpc/internal/InstantTimeProviderTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 6dce00b0635..86a07f0ed56 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -67,4 +67,20 @@ public void testInstantCurrentTimeNanos() { throw new RuntimeException(e); } } + + // Test to verify exception is thrown when "now" method is missing + @Test(expected = RuntimeException.class) + public void testMissingNowMethodThrowsException() { + // Define a class without the "now" method + class InvalidInstant { + public int getNano() { + return 0; + } + public long getEpochSecond() { + return 0L; + } + } + // This should throw a RuntimeException because "now" method is missing + new InstantTimeProvider(InvalidInstant.class); + } } From 133988bcd83580b7e3024fcb6d7cf5d8282d6cb4 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Wed, 23 Oct 2024 13:22:46 +0000 Subject: [PATCH 21/27] core: Fixed checkstyle issues --- .../src/test/java/io/grpc/internal/InstantTimeProviderTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 86a07f0ed56..e3bac8c58c1 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -76,10 +76,12 @@ class InvalidInstant { public int getNano() { return 0; } + public long getEpochSecond() { return 0L; } } + // This should throw a RuntimeException because "now" method is missing new InstantTimeProvider(InvalidInstant.class); } From ee69565b2b236f23ce8a4cdf950e9e1719877168 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Thu, 24 Oct 2024 13:09:35 +0000 Subject: [PATCH 22/27] core: Fixed review points --- .../io/grpc/internal/InstantTimeProvider.java | 9 +++----- .../internal/TimeProviderResolverFactory.java | 18 ++++----------- .../internal/InstantTimeProviderTest.java | 22 ++----------------- 3 files changed, 9 insertions(+), 40 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java index 94fcde3477f..b78823d273f 100644 --- a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java +++ b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java @@ -16,6 +16,7 @@ package io.grpc.internal; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; @@ -27,14 +28,10 @@ final class InstantTimeProvider implements TimeProvider { private Method getNano; private Method getEpochSecond; - public InstantTimeProvider(Class instantClass) { - try { + public InstantTimeProvider(Class instantClass) throws NoSuchMethodException { this.now = instantClass.getMethod("now"); this.getNano = instantClass.getMethod("getNano"); this.getEpochSecond = instantClass.getMethod("getEpochSecond"); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } } @Override @@ -44,7 +41,7 @@ public long currentTimeNanos() { int nanos = (int) getNano.invoke(instant); long epochSeconds = (long) getEpochSecond.invoke(instant); return TimeUnit.SECONDS.toNanos(epochSeconds) + nanos; - } catch (Exception ex) { + } catch (IllegalAccessException | InvocationTargetException ex) { throw new RuntimeException(ex); } } diff --git a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java index 7ca5a538723..c7e50581292 100644 --- a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java +++ b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java @@ -21,22 +21,12 @@ */ final class TimeProviderResolverFactory { - - private static final Class INSTANT_CLASS = initInstant(); - - private static Class initInstant() { - try { - return Class.forName("java.time.Instant"); - } catch (Exception ex) { - return null; - } - } - static TimeProvider resolveTimeProvider() { - if (INSTANT_CLASS == null) { + try { + Class instantClass = Class.forName("java.time.Instant"); + return new InstantTimeProvider(instantClass); + } catch (ClassNotFoundException | NoSuchMethodException ex) { return new ConcurrentTimeProvider(); - } else { - return new InstantTimeProvider(INSTANT_CLASS); } } } diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index e3bac8c58c1..990ebe3e484 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -63,26 +63,8 @@ public void testInstantCurrentTimeNanos() { // Validate the time returned is close to the expected value within a tolerance // (i,e 10 millisecond tolerance in nanoseconds). assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + } catch (ClassNotFoundException | NoSuchMethodException e) { + throw new AssertionError(); } } - - // Test to verify exception is thrown when "now" method is missing - @Test(expected = RuntimeException.class) - public void testMissingNowMethodThrowsException() { - // Define a class without the "now" method - class InvalidInstant { - public int getNano() { - return 0; - } - - public long getEpochSecond() { - return 0L; - } - } - - // This should throw a RuntimeException because "now" method is missing - new InstantTimeProvider(InvalidInstant.class); - } } From 00fae975ec5f8ab3ab31fdaaeba04f8f7334823e Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Thu, 24 Oct 2024 13:20:54 +0000 Subject: [PATCH 23/27] core: Fixed review points --- .../src/main/java/io/grpc/internal/InstantTimeProvider.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java index b78823d273f..53c57892450 100644 --- a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java +++ b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java @@ -29,9 +29,9 @@ final class InstantTimeProvider implements TimeProvider { private Method getEpochSecond; public InstantTimeProvider(Class instantClass) throws NoSuchMethodException { - this.now = instantClass.getMethod("now"); - this.getNano = instantClass.getMethod("getNano"); - this.getEpochSecond = instantClass.getMethod("getEpochSecond"); + this.now = instantClass.getMethod("now"); + this.getNano = instantClass.getMethod("getNano"); + this.getEpochSecond = instantClass.getMethod("getEpochSecond"); } @Override From f4abffc6b2716cd782eb5806945f0103e8bf57f4 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Fri, 25 Oct 2024 06:51:40 +0000 Subject: [PATCH 24/27] core: Fixed review points --- .../internal/ConcurrentTimeProviderTest.java | 48 +++++++++++++++++++ .../internal/InstantTimeProviderTest.java | 28 ++--------- 2 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 core/src/test/java/io/grpc/internal/ConcurrentTimeProviderTest.java diff --git a/core/src/test/java/io/grpc/internal/ConcurrentTimeProviderTest.java b/core/src/test/java/io/grpc/internal/ConcurrentTimeProviderTest.java new file mode 100644 index 00000000000..a02cb6a6e42 --- /dev/null +++ b/core/src/test/java/io/grpc/internal/ConcurrentTimeProviderTest.java @@ -0,0 +1,48 @@ +/* + * Copyright 2024 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. + */ + +package io.grpc.internal; + +import static com.google.common.truth.Truth.assertThat; + +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Unit tests for {@link ConcurrentTimeProvider}. + */ +@RunWith(JUnit4.class) +public class ConcurrentTimeProviderTest { + @Test + public void testConcurrentCurrentTimeNanos() { + + ConcurrentTimeProvider concurrentTimeProvider = new ConcurrentTimeProvider(); + // Get the current time from the ConcurrentTimeProvider + long actualTimeNanos = concurrentTimeProvider.currentTimeNanos(); + + // Get the current time from Instant for comparison + Instant instantNow = Instant.now(); + long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + + instantNow.getNano(); + + // Validate the time returned is close to the expected value within a tolerance + // (i,e 10 millisecond tolerance in nanoseconds). + assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); + } +} diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 990ebe3e484..5675e6086b2 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -30,29 +30,12 @@ @RunWith(JUnit4.class) public class InstantTimeProviderTest { @Test - public void testConcurrentCurrentTimeNanos() { + public void testInstantCurrentTimeNanos() throws Exception { - ConcurrentTimeProvider concurrentTimeProvider = new ConcurrentTimeProvider(); - // Get the current time from the TimeProvider - long actualTimeNanos = concurrentTimeProvider.currentTimeNanos(); + InstantTimeProvider instantTimeProvider = new InstantTimeProvider( + Class.forName("java.time.Instant")); - // Get the current time from Instant for comparison - Instant instantNow = Instant.now(); - long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) - + instantNow.getNano(); - - // Validate the time returned is close to the expected value within a tolerance - // (i,e 10 millisecond tolerance in nanoseconds). - assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); - } - - @Test - public void testInstantCurrentTimeNanos() { - try { - InstantTimeProvider instantTimeProvider = new InstantTimeProvider( - Class.forName("java.time.Instant")); - - // Get the current time from the TimeProvider + // Get the current time from the InstantTimeProvider long actualTimeNanos = instantTimeProvider.currentTimeNanos(); // Get the current time from Instant for comparison @@ -63,8 +46,5 @@ public void testInstantCurrentTimeNanos() { // Validate the time returned is close to the expected value within a tolerance // (i,e 10 millisecond tolerance in nanoseconds). assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); - } catch (ClassNotFoundException | NoSuchMethodException e) { - throw new AssertionError(); - } } } From 09fb4742da779e581fd68ca3ffc972ee2aa1fc00 Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Fri, 25 Oct 2024 07:07:57 +0000 Subject: [PATCH 25/27] core: Fixed checkstyle issues --- .../grpc/internal/InstantTimeProviderTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java index 5675e6086b2..ef97d374b10 100644 --- a/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java +++ b/core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java @@ -35,16 +35,16 @@ public void testInstantCurrentTimeNanos() throws Exception { InstantTimeProvider instantTimeProvider = new InstantTimeProvider( Class.forName("java.time.Instant")); - // Get the current time from the InstantTimeProvider - long actualTimeNanos = instantTimeProvider.currentTimeNanos(); + // Get the current time from the InstantTimeProvider + long actualTimeNanos = instantTimeProvider.currentTimeNanos(); - // Get the current time from Instant for comparison - Instant instantNow = Instant.now(); - long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + // Get the current time from Instant for comparison + Instant instantNow = Instant.now(); + long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond()) + instantNow.getNano(); - // Validate the time returned is close to the expected value within a tolerance - // (i,e 10 millisecond tolerance in nanoseconds). - assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); + // Validate the time returned is close to the expected value within a tolerance + // (i,e 10 millisecond tolerance in nanoseconds). + assertThat(actualTimeNanos).isWithin(10_000_000L).of(expectedTimeNanos); } } From b24dd90b22825b66271e50b334eba176ddb0cd7a Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 28 Oct 2024 07:58:05 +0000 Subject: [PATCH 26/27] core: Fixed recent review points --- core/src/main/java/io/grpc/internal/InstantTimeProvider.java | 4 +++- .../java/io/grpc/internal/TimeProviderResolverFactory.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java index 53c57892450..3061d06ae3b 100644 --- a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java +++ b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java @@ -16,6 +16,8 @@ package io.grpc.internal; +import static com.google.common.math.LongMath.saturatedAdd; + import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; @@ -40,7 +42,7 @@ public long currentTimeNanos() { Object instant = now.invoke(null); int nanos = (int) getNano.invoke(instant); long epochSeconds = (long) getEpochSecond.invoke(instant); - return TimeUnit.SECONDS.toNanos(epochSeconds) + nanos; + return saturatedAdd(TimeUnit.SECONDS.toNanos(epochSeconds), nanos); } catch (IllegalAccessException | InvocationTargetException ex) { throw new RuntimeException(ex); } diff --git a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java index c7e50581292..da11bc07d04 100644 --- a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java +++ b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java @@ -25,8 +25,10 @@ static TimeProvider resolveTimeProvider() { try { Class instantClass = Class.forName("java.time.Instant"); return new InstantTimeProvider(instantClass); - } catch (ClassNotFoundException | NoSuchMethodException ex) { + } catch (ClassNotFoundException ex) { return new ConcurrentTimeProvider(); + } catch (NoSuchMethodException ex) { + throw new AssertionError(ex); } } } From d637a36f42452bc0ac5baf61255123e444206a0e Mon Sep 17 00:00:00 2001 From: vinodhabib Date: Mon, 28 Oct 2024 10:24:18 +0000 Subject: [PATCH 27/27] core: Fixed recent review points --- .../java/io/grpc/internal/InstantTimeProvider.java | 12 ++++++++---- .../grpc/internal/TimeProviderResolverFactory.java | 2 -- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java index 3061d06ae3b..38c840d2594 100644 --- a/core/src/main/java/io/grpc/internal/InstantTimeProvider.java +++ b/core/src/main/java/io/grpc/internal/InstantTimeProvider.java @@ -30,10 +30,14 @@ final class InstantTimeProvider implements TimeProvider { private Method getNano; private Method getEpochSecond; - public InstantTimeProvider(Class instantClass) throws NoSuchMethodException { - this.now = instantClass.getMethod("now"); - this.getNano = instantClass.getMethod("getNano"); - this.getEpochSecond = instantClass.getMethod("getEpochSecond"); + public InstantTimeProvider(Class instantClass) { + try { + this.now = instantClass.getMethod("now"); + this.getNano = instantClass.getMethod("getNano"); + this.getEpochSecond = instantClass.getMethod("getEpochSecond"); + } catch (NoSuchMethodException ex) { + throw new AssertionError(ex); + } } @Override diff --git a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java index da11bc07d04..d88d9bb9eb5 100644 --- a/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java +++ b/core/src/main/java/io/grpc/internal/TimeProviderResolverFactory.java @@ -27,8 +27,6 @@ static TimeProvider resolveTimeProvider() { return new InstantTimeProvider(instantClass); } catch (ClassNotFoundException ex) { return new ConcurrentTimeProvider(); - } catch (NoSuchMethodException ex) { - throw new AssertionError(ex); } } }