From 02a4f91d461cfede5626d1e5401c25d47b4a5d09 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Mon, 13 Feb 2023 10:06:50 +0100 Subject: [PATCH] Fix TenantIdTest when VM has nanosecond precision --- .../type/descriptor/java/ClockHelper.java | 40 +++++++++---------- .../orm/test/tenantid/TenantIdTest.java | 7 ++++ 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java index 70813da259..d199e61560 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClockHelper.java @@ -16,15 +16,16 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; */ public class ClockHelper { - private static final Duration TICK_8 = Duration.ofNanos( 10L ); - private static final Duration TICK_7 = Duration.ofNanos( 100L ); - private static final Duration TICK_6 = Duration.ofNanos( 1000L ); - private static final Duration TICK_5 = Duration.ofNanos( 10000L ); - private static final Duration TICK_4 = Duration.ofNanos( 100000L ); - private static final Duration TICK_3 = Duration.ofNanos( 1000000L ); - private static final Duration TICK_2 = Duration.ofNanos( 10000000L ); - private static final Duration TICK_1 = Duration.ofNanos( 100000000L ); - private static final Duration TICK_0 = Duration.ofNanos( 1000000000L ); + private static final Clock TICK_9 = Clock.systemDefaultZone(); + private static final Clock TICK_8 = Clock.tick( TICK_9, Duration.ofNanos( 10L ) ); + private static final Clock TICK_7 = Clock.tick( TICK_9, Duration.ofNanos( 100L ) ); + private static final Clock TICK_6 = Clock.tick( TICK_9, Duration.ofNanos( 1000L ) ); + private static final Clock TICK_5 = Clock.tick( TICK_9, Duration.ofNanos( 10000L ) ); + private static final Clock TICK_4 = Clock.tick( TICK_9, Duration.ofNanos( 100000L ) ); + private static final Clock TICK_3 = Clock.tick( TICK_9, Duration.ofNanos( 1000000L ) ); + private static final Clock TICK_2 = Clock.tick( TICK_9, Duration.ofNanos( 10000000L ) ); + private static final Clock TICK_1 = Clock.tick( TICK_9, Duration.ofNanos( 100000000L ) ); + private static final Clock TICK_0 = Clock.tick( TICK_9, Duration.ofNanos( 1000000000L ) ); public static Clock forPrecision(Integer precision, SharedSessionContractImplementor session) { final int resolvedPrecision; @@ -34,28 +35,27 @@ public class ClockHelper { else { resolvedPrecision = precision; } - final Clock clock = Clock.systemDefaultZone(); switch ( resolvedPrecision ) { case 0: - return Clock.tick( clock, TICK_0 ); + return TICK_0; case 1: - return Clock.tick( clock, TICK_1 ); + return TICK_1; case 2: - return Clock.tick( clock, TICK_2 ); + return TICK_2; case 3: - return Clock.tick( clock, TICK_3 ); + return TICK_3; case 4: - return Clock.tick( clock, TICK_4 ); + return TICK_4; case 5: - return Clock.tick( clock, TICK_5 ); + return TICK_5; case 6: - return Clock.tick( clock, TICK_6 ); + return TICK_6; case 7: - return Clock.tick( clock, TICK_7 ); + return TICK_7; case 8: - return Clock.tick( clock, TICK_8 ); + return TICK_8; case 9: - return clock; + return TICK_9; } throw new IllegalArgumentException( "Illegal precision: " + resolvedPrecision ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/tenantid/TenantIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/tenantid/TenantIdTest.java index a4e2ed40b9..832f4537f3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/tenantid/TenantIdTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/tenantid/TenantIdTest.java @@ -19,6 +19,8 @@ import org.hibernate.testing.orm.junit.SessionFactoryProducer; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.Setting; import org.hibernate.binder.internal.TenantIdBinder; +import org.hibernate.type.descriptor.DateTimeUtils; + import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -136,6 +138,11 @@ public class TenantIdTest implements SessionFactoryProducer { scope.inTransaction( s -> s.persist( record ) ); assertEquals( "mine", record.state.tenantId ); assertNotNull( record.state.updated ); + // Round the temporal to avoid issues when the VM produces nanosecond precision timestamps + record.state.updated = DateTimeUtils.roundToDefaultPrecision( + record.state.updated, + scope.getSessionFactory().getJdbcServices().getDialect() + ); scope.inTransaction( s -> { Record r = s.find( Record.class, record.id ); assertEquals( "mine", r.state.tenantId );