From 802ef3eb3f6dbfe0cfa8e1f560cfff379ad72c3e Mon Sep 17 00:00:00 2001 From: Anton Persson Date: Mon, 3 Sep 2018 13:43:12 +0200 Subject: [PATCH] Neo4jPackV2Test use Randoms when creating random Values This fixes a problem where Durations breaking Duration limit where created. --- .../bolt/v2/messaging/Neo4jPackV2Test.java | 94 +++++++------------ .../src/test/java/org/neo4j/test/Randoms.java | 13 ++- .../java/org/neo4j/test/rule/RandomRule.java | 12 +++ 3 files changed, 57 insertions(+), 62 deletions(-) diff --git a/community/bolt/src/test/java/org/neo4j/bolt/v2/messaging/Neo4jPackV2Test.java b/community/bolt/src/test/java/org/neo4j/bolt/v2/messaging/Neo4jPackV2Test.java index 2e8a3120da36..779673bfec64 100644 --- a/community/bolt/src/test/java/org/neo4j/bolt/v2/messaging/Neo4jPackV2Test.java +++ b/community/bolt/src/test/java/org/neo4j/bolt/v2/messaging/Neo4jPackV2Test.java @@ -19,6 +19,7 @@ */ package org.neo4j.bolt.v2.messaging; +import org.junit.Rule; import org.junit.Test; import java.io.IOException; @@ -28,9 +29,6 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; -import java.time.temporal.ChronoField; -import java.time.temporal.ValueRange; -import java.util.concurrent.ThreadLocalRandom; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.IntStream; @@ -38,6 +36,7 @@ import org.neo4j.bolt.v1.messaging.Neo4jPack; import org.neo4j.bolt.v1.packstream.PackedInputArray; import org.neo4j.bolt.v1.packstream.PackedOutputArray; +import org.neo4j.test.rule.RandomRule; import org.neo4j.values.AnyValue; import org.neo4j.values.storable.CoordinateReferenceSystem; import org.neo4j.values.storable.DateTimeValue; @@ -52,15 +51,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.time.ZoneOffset.UTC; -import static java.time.temporal.ChronoField.DAY_OF_MONTH; -import static java.time.temporal.ChronoField.EPOCH_DAY; -import static java.time.temporal.ChronoField.HOUR_OF_DAY; -import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; -import static java.time.temporal.ChronoField.MONTH_OF_YEAR; -import static java.time.temporal.ChronoField.NANO_OF_DAY; -import static java.time.temporal.ChronoField.NANO_OF_SECOND; -import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; -import static java.time.temporal.ChronoField.YEAR; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.neo4j.bolt.v1.packstream.PackStream.INT_16; @@ -70,11 +60,10 @@ import static org.neo4j.values.storable.CoordinateReferenceSystem.WGS84; import static org.neo4j.values.storable.CoordinateReferenceSystem.WGS84_3D; import static org.neo4j.values.storable.DateTimeValue.datetime; -import static org.neo4j.values.storable.DateValue.epochDate; +import static org.neo4j.values.storable.DateValue.date; import static org.neo4j.values.storable.DurationValue.duration; import static org.neo4j.values.storable.LocalDateTimeValue.localDateTime; import static org.neo4j.values.storable.LocalTimeValue.localTime; -import static org.neo4j.values.storable.TimeValue.time; import static org.neo4j.values.storable.Values.doubleValue; import static org.neo4j.values.storable.Values.intValue; import static org.neo4j.values.storable.Values.unsafePointValue; @@ -91,6 +80,9 @@ public class Neo4jPackV2Test private static final int RANDOM_LISTS_TO_TEST = 1_000; private static final int RANDOM_LIST_MAX_SIZE = 500; + @Rule + public RandomRule random = new RandomRule(); + @Test public void shouldFailToPackPointWithIllegalDimensions() { @@ -173,6 +165,12 @@ public void shouldPackAndUnpackDuration() testPackingAndUnpacking( this::randomDuration ); } + @Test + public void shouldPackAndUnpackPeriod() + { + testPackingAndUnpacking( this::randomPeriod ); + } + @Test public void shouldPackAndUnpackListsOfDuration() { @@ -306,7 +304,7 @@ private static void testPackingAndUnpacking( Function T unpack( PackedOutputArray output ) } } - private static ListValue randomList( Supplier randomValueGenerator ) + private ListValue randomList( Supplier randomValueGenerator ) { return randomList( index -> randomValueGenerator.get() ); } - private static ListValue randomList( Function randomValueGenerator ) + private ListValue randomList( Function randomValueGenerator ) { - AnyValue[] values = random().ints( RANDOM_LISTS_TO_TEST, 1, RANDOM_LIST_MAX_SIZE ) - .mapToObj( index -> randomValueGenerator.apply( index ) ) + AnyValue[] values = random.ints( RANDOM_LISTS_TO_TEST, 1, RANDOM_LIST_MAX_SIZE ) + .mapToObj( randomValueGenerator::apply ) .toArray( AnyValue[]::new ); return list( values ); @@ -381,7 +379,7 @@ private PointValue randomPoint3D( int index ) return randomPoint( index, 3 ); } - private static PointValue randomPoint( int index, int dimension ) + private PointValue randomPoint( int index, int dimension ) { CoordinateReferenceSystem crs; if ( index % 2 == 0 ) @@ -393,77 +391,57 @@ private static PointValue randomPoint( int index, int dimension ) crs = dimension == 2 ? Cartesian : Cartesian_3D; } - return unsafePointValue( crs, random().doubles( dimension, Double.MIN_VALUE, Double.MAX_VALUE ).toArray() ); + return unsafePointValue( crs, random.doubles( dimension, Double.MIN_VALUE, Double.MAX_VALUE ).toArray() ); } - private DurationValue randomDuration( int index ) + private DurationValue randomDuration() { - return duration( randomLong( index ), randomLong( index ), randomLong( index ), randomLong( index ) ); + return duration( random.randoms().randomDuration() ); + } + + private DurationValue randomPeriod() + { + return duration( random.randoms().randomPeriod() ); } private DateValue randomDate() { - return epochDate( random( EPOCH_DAY ) ); + return date( random.randoms().randomDate() ); } private LocalTimeValue randomLocalTime() { - return localTime( random( NANO_OF_DAY ) ); + return localTime( random.randoms().randomLocalTime() ); } private TimeValue randomTime() { - return time( random( NANO_OF_DAY ), randomZoneOffset() ); + return TimeValue.time( random.randoms().randomTime() ); } private LocalDateTimeValue randomLocalDateTime() { - return localDateTime( random( YEAR ), random( MONTH_OF_YEAR ), random( DAY_OF_MONTH ), random( HOUR_OF_DAY ), - random( MINUTE_OF_HOUR ), random( SECOND_OF_MINUTE ), random( NANO_OF_SECOND ) ); + return localDateTime( random.randoms().randomLocalDateTime() ); } private DateTimeValue randomDateTimeWithTimeZoneName() { - return datetime( random( YEAR ), random( MONTH_OF_YEAR ), random( DAY_OF_MONTH ), random( HOUR_OF_DAY ), - random( MINUTE_OF_HOUR ), random( SECOND_OF_MINUTE ), random( NANO_OF_SECOND ), randomZoneIdWithName() ); + return datetime( random.randoms().randomDateTime( randomZoneIdWithName() ) ); } private DateTimeValue randomDateTimeWithTimeZoneOffset() { - return datetime( random( YEAR ), random( MONTH_OF_YEAR ), random( DAY_OF_MONTH ), random( HOUR_OF_DAY ), - random( MINUTE_OF_HOUR ), random( SECOND_OF_MINUTE ), random( NANO_OF_SECOND ), randomZoneOffset() ); - } - - private static long randomLong( long origin ) - { - return random().nextLong( origin, Long.MAX_VALUE ); - } - - private static int random( ChronoField chronoField ) - { - ValueRange range = chronoField.range(); - int min = (int) range.getMinimum(); - int max = (int) range.getSmallestMaximum(); - if ( max != range.getSmallestMaximum() ) - { - max = Integer.MAX_VALUE; - } - return random().nextInt( min, max ); + return datetime( random.randoms().randomDateTime( randomZoneOffset() ) ); } - private static ZoneOffset randomZoneOffset() + private ZoneOffset randomZoneOffset() { - return ZoneOffset.ofTotalSeconds( random().nextInt( ZoneOffset.MIN.getTotalSeconds(), ZoneOffset.MAX.getTotalSeconds() + 1 ) ); + return ZoneOffset.ofTotalSeconds( random.nextInt( ZoneOffset.MIN.getTotalSeconds(), ZoneOffset.MAX.getTotalSeconds() ) ); } - private static ZoneId randomZoneIdWithName() + private ZoneId randomZoneIdWithName() { - String timeZoneName = TIME_ZONE_NAMES[random().nextInt( TIME_ZONE_NAMES.length )]; + String timeZoneName = TIME_ZONE_NAMES[ random.nextInt( TIME_ZONE_NAMES.length )]; return ZoneId.of( timeZoneName ); } - - private static ThreadLocalRandom random() - { - return ThreadLocalRandom.current(); - } } diff --git a/community/common/src/test/java/org/neo4j/test/Randoms.java b/community/common/src/test/java/org/neo4j/test/Randoms.java index caa9acce5b0c..3ef6ab06d729 100644 --- a/community/common/src/test/java/org/neo4j/test/Randoms.java +++ b/community/common/src/test/java/org/neo4j/test/Randoms.java @@ -27,9 +27,9 @@ import java.time.LocalTime; import java.time.OffsetTime; import java.time.Period; +import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; -import java.time.temporal.TemporalAmount; import java.util.List; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; @@ -349,16 +349,21 @@ private Instant randomInstant() public ZonedDateTime randomDateTime() { - return ZonedDateTime.ofInstant( randomInstant(), UTC ); + return randomDateTime( UTC ); } - public TemporalAmount randomPeriod() + public ZonedDateTime randomDateTime( ZoneId zoneId ) + { + return ZonedDateTime.ofInstant( randomInstant(), zoneId ); + } + + public Period randomPeriod() { // Based on Java period (years, months and days) return Period.of( random.nextInt(), random.nextInt( 12 ), random.nextInt( 28 ) ); } - public TemporalAmount randomDuration() + public Duration randomDuration() { // Based on java duration (seconds) return Duration.of( nextLong( DAYS.getDuration().getSeconds() ), ChronoUnit.SECONDS ); diff --git a/community/common/src/test/java/org/neo4j/test/rule/RandomRule.java b/community/common/src/test/java/org/neo4j/test/rule/RandomRule.java index f49468c6bc8d..57957a1373f1 100644 --- a/community/common/src/test/java/org/neo4j/test/rule/RandomRule.java +++ b/community/common/src/test/java/org/neo4j/test/rule/RandomRule.java @@ -31,6 +31,8 @@ import java.util.List; import java.util.Random; import java.util.function.Consumer; +import java.util.stream.DoubleStream; +import java.util.stream.IntStream; import org.neo4j.helpers.Exceptions; import org.neo4j.test.Randoms; @@ -134,6 +136,11 @@ public double nextDouble() return random.nextDouble(); } + public DoubleStream doubles( int dimension, double minValue, double maxValue ) + { + return random.doubles( dimension, minValue, maxValue ); + } + public float nextFloat() { return random.nextFloat(); @@ -154,6 +161,11 @@ public int nextInt( int origin, int bound ) return random.nextInt( (bound - origin) + 1 ) + origin; } + public IntStream ints( long streamSize, int randomNumberOrigin, int randomNumberBound ) + { + return random.ints( streamSize, randomNumberOrigin, randomNumberBound ); + } + public double nextGaussian() { return random.nextGaussian();