Update UlidFactory.java

This commit is contained in:
Fabio Lima 2023-12-17 16:33:30 -03:00
parent bc4d66bac1
commit 280822cc38
2 changed files with 12 additions and 122 deletions

View File

@ -25,7 +25,6 @@
package com.github.f4b6a3.ulid; package com.github.f4b6a3.ulid;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.time.Clock;
import java.util.Objects; import java.util.Objects;
import java.util.Random; import java.util.Random;
import java.util.function.IntFunction; import java.util.function.IntFunction;
@ -170,52 +169,6 @@ public final class UlidFactory {
return new UlidFactory(new MonotonicFunction(randomFunction)); return new UlidFactory(new MonotonicFunction(randomFunction));
} }
/**
* Returns a new monotonic factory.
*
* @param random a {@link Random} generator
* @param clock a clock instance that provides the current time in
* milliseconds, measured from the UNIX epoch of 1970-01-01T00:00Z
* (UTC)
* @return {@link UlidFactory}
*/
static UlidFactory newMonotonicInstance(Random random, Clock clock) {
Objects.requireNonNull(clock, "Clock instant must not be null");
return new UlidFactory(new MonotonicFunction(random), clock::millis);
}
/**
* Returns a new monotonic factory.
* <p>
* The given random function must return a long value.
*
* @param randomFunction a random function that returns a long value
* @param clock a clock instance that provides the current time in
* milliseconds, measured from the UNIX epoch of
* 1970-01-01T00:00Z (UTC)
* @return {@link UlidFactory}
*/
static UlidFactory newMonotonicInstance(LongSupplier randomFunction, Clock clock) {
Objects.requireNonNull(clock, "Clock instant must not be null");
return new UlidFactory(new MonotonicFunction(randomFunction), clock::millis);
}
/**
* Returns a new monotonic factory.
* <p>
* The given random function must return a byte array.
*
* @param randomFunction a random function that returns a byte array
* @param clock a clock instance that provides the current time in
* milliseconds, measured from the UNIX epoch of
* 1970-01-01T00:00Z (UTC)
* @return {@link UlidFactory}
*/
static UlidFactory newMonotonicInstance(IntFunction<byte[]> randomFunction, Clock clock) {
Objects.requireNonNull(clock, "Clock instant must not be null");
return new UlidFactory(new MonotonicFunction(randomFunction), clock::millis);
}
/** /**
* Returns a new monotonic factory. * Returns a new monotonic factory.
* *

View File

@ -6,11 +6,11 @@ import static org.junit.Assert.*;
import java.time.Clock; import java.time.Clock;
import java.time.Instant; import java.time.Instant;
import java.time.ZoneId;
import java.util.Arrays; import java.util.Arrays;
import java.util.Random; import java.util.Random;
import java.util.SplittableRandom; import java.util.SplittableRandom;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntFunction; import java.util.function.IntFunction;
import java.util.function.LongSupplier; import java.util.function.LongSupplier;
@ -41,32 +41,11 @@ public class UlidFactoryMonotonicTest extends UlidFactoryTest {
long time = Instant.parse("2021-12-31T23:59:59.000Z").toEpochMilli(); long time = Instant.parse("2021-12-31T23:59:59.000Z").toEpochMilli();
long times[] = { time + 0, time + 1, time + 2, time + 3, time + 4 - diff, time + 5 - diff, time + 6 - diff }; long times[] = { time + 0, time + 1, time + 2, time + 3, time + 4 - diff, time + 5 - diff, time + 6 - diff };
Clock clock = new Clock() { AtomicInteger i = new AtomicInteger();
private int i; LongSupplier timeFunction = () -> times[i.getAndIncrement() % times.length];
@Override
public long millis() {
return times[i++ % times.length];
}
@Override
public ZoneId getZone() {
return null;
}
@Override
public Clock withZone(ZoneId zone) {
return null;
}
@Override
public Instant instant() {
return null;
}
};
LongSupplier randomFunction = () -> 0; LongSupplier randomFunction = () -> 0;
UlidFactory factory = UlidFactory.newMonotonicInstance(randomFunction, clock); UlidFactory factory = UlidFactory.newMonotonicInstance(randomFunction, timeFunction);
Ulid ulid1 = factory.create(); Ulid ulid1 = factory.create();
Ulid ulid2 = factory.create(); Ulid ulid2 = factory.create();
@ -119,32 +98,11 @@ public class UlidFactoryMonotonicTest extends UlidFactoryTest {
long leap = time - 1000; // moving the clock hands 1 second backwards long leap = time - 1000; // moving the clock hands 1 second backwards
long times[] = { time, leap }; long times[] = { time, leap };
Clock clock = new Clock() { AtomicInteger i = new AtomicInteger();
private int i; LongSupplier timeFunction = () -> times[i.getAndIncrement() % times.length];
@Override
public long millis() {
return times[i++ % times.length];
}
@Override
public ZoneId getZone() {
return null;
}
@Override
public Clock withZone(ZoneId zone) {
return null;
}
@Override
public Instant instant() {
return null;
}
};
LongSupplier randomFunction = () -> 0; LongSupplier randomFunction = () -> 0;
UlidFactory factory = UlidFactory.newMonotonicInstance(randomFunction, clock); UlidFactory factory = UlidFactory.newMonotonicInstance(randomFunction, timeFunction);
// the clock moved normally // the clock moved normally
Ulid ulid1 = factory.create(); Ulid ulid1 = factory.create();
@ -167,32 +125,11 @@ public class UlidFactoryMonotonicTest extends UlidFactoryTest {
long time = Instant.parse("2021-12-31T23:59:59.999Z").toEpochMilli(); long time = Instant.parse("2021-12-31T23:59:59.999Z").toEpochMilli();
long times[] = { time + 1, time + 2, time + 3, time, time, time }; long times[] = { time + 1, time + 2, time + 3, time, time, time };
Clock clock = new Clock() { AtomicInteger i = new AtomicInteger();
private int i; LongSupplier timeFunction = () -> times[i.getAndIncrement() % times.length];
@Override
public long millis() {
return times[i++ % times.length];
}
@Override
public ZoneId getZone() {
return null;
}
@Override
public Clock withZone(ZoneId zone) {
return null;
}
@Override
public Instant instant() {
return null;
}
};
LongSupplier randomSupplier = () -> 0xffffffffffffffffL; LongSupplier randomSupplier = () -> 0xffffffffffffffffL;
UlidFactory factory = UlidFactory.newMonotonicInstance(randomSupplier, clock); UlidFactory factory = UlidFactory.newMonotonicInstance(randomSupplier, timeFunction);
Ulid ulid1 = factory.create(); Ulid ulid1 = factory.create();
Ulid ulid2 = factory.create(); Ulid ulid2 = factory.create();
@ -287,7 +224,7 @@ public class UlidFactoryMonotonicTest extends UlidFactoryTest {
{ {
SplittableRandom random = new SplittableRandom(); SplittableRandom random = new SplittableRandom();
LongSupplier function = () -> random.nextLong(); LongSupplier function = () -> random.nextLong();
UlidFactory factory = UlidFactory.newMonotonicInstance(function, Clock.systemDefaultZone()); UlidFactory factory = UlidFactory.newMonotonicInstance(function, () -> Clock.systemUTC().millis());
assertNotNull(factory.create()); assertNotNull(factory.create());
} }
{ {
@ -305,7 +242,7 @@ public class UlidFactoryMonotonicTest extends UlidFactoryTest {
ThreadLocalRandom.current().nextBytes(bytes); ThreadLocalRandom.current().nextBytes(bytes);
return bytes; return bytes;
}; };
UlidFactory factory = UlidFactory.newMonotonicInstance(function, Clock.systemDefaultZone()); UlidFactory factory = UlidFactory.newMonotonicInstance(function, () -> Clock.systemUTC().millis());
assertNotNull(factory.create()); assertNotNull(factory.create());
} }
} }