Repository: commons-rng Updated Branches: refs/heads/master 249b34b5b -> 313923203
RNG-22: Prevent "save/restore" functionality. Project: http://git-wip-us.apache.org/repos/asf/commons-rng/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-rng/commit/a2ece1ba Tree: http://git-wip-us.apache.org/repos/asf/commons-rng/tree/a2ece1ba Diff: http://git-wip-us.apache.org/repos/asf/commons-rng/diff/a2ece1ba Branch: refs/heads/master Commit: a2ece1babf41ae34cffd1e42063ae21d76958072 Parents: 249b34b Author: Gilles <[email protected]> Authored: Wed Oct 19 16:19:54 2016 +0200 Committer: Gilles <[email protected]> Committed: Wed Oct 19 16:19:54 2016 +0200 ---------------------------------------------------------------------- .../org/apache/commons/rng/RandomSource.java | 67 ++++++++++++++++++++ .../rng/ProvidersCommonParametricTest.java | 20 ++++++ 2 files changed, 87 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-rng/blob/a2ece1ba/src/main/java/org/apache/commons/rng/RandomSource.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/rng/RandomSource.java b/src/main/java/org/apache/commons/rng/RandomSource.java index 6078c83..bab6224 100644 --- a/src/main/java/org/apache/commons/rng/RandomSource.java +++ b/src/main/java/org/apache/commons/rng/RandomSource.java @@ -469,4 +469,71 @@ public enum RandomSource { public static long[] createLongArray(int n) { return SeedFactory.createLongArray(n); } + + /** + * Wraps the given {@code delegate} generator in a new instance that + * does not allow access to the "save/restore" functionality. + * + * @param delegate Generator to which calls will be delegated. + * @return a new instance whose state cannot be saved or restored. + */ + public static UniformRandomProvider unrestorable(final UniformRandomProvider delegate) { + return new UniformRandomProvider() { + /** {@inheritDoc} */ + @Override + public void nextBytes(byte[] bytes) { + delegate.nextBytes(bytes); + } + + /** {@inheritDoc} */ + @Override + public void nextBytes(byte[] bytes, + int start, + int len) { + delegate.nextBytes(bytes, start, len); + } + + /** {@inheritDoc} */ + @Override + public int nextInt() { + return delegate.nextInt(); + } + + /** {@inheritDoc} */ + @Override + public int nextInt(int n) { + return delegate.nextInt(n); + } + + /** {@inheritDoc} */ + @Override + public long nextLong() { + return delegate.nextLong(); + } + + /** {@inheritDoc} */ + @Override + public long nextLong(long n) { + return delegate.nextLong(n); + } + + /** {@inheritDoc} */ + @Override + public boolean nextBoolean() { + return delegate.nextBoolean(); + } + + /** {@inheritDoc} */ + @Override + public float nextFloat() { + return delegate.nextFloat(); + } + + /** {@inheritDoc} */ + @Override + public double nextDouble() { + return delegate.nextDouble(); + } + }; + } } http://git-wip-us.apache.org/repos/asf/commons-rng/blob/a2ece1ba/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java b/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java index e8b6183..b997e34 100644 --- a/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java +++ b/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java @@ -335,6 +335,26 @@ public class ProvidersCommonParametricTest { } @Test + public void testUnrestorable() { + // Create two generators of the same type as the one being tested. + final UniformRandomProvider rng1 = RandomSource.create(originalSource, originalSeed, originalArgs); + final UniformRandomProvider rng2 = RandomSource.unrestorable(RandomSource.create(originalSource, originalSeed, originalArgs)); + + // Ensure that they generate the same values. + RandomAssert.assertProduceSameSequence(rng1, rng2); + + // Cast must work. + final RestorableUniformRandomProvider restorable = (RestorableUniformRandomProvider) rng1; + // Cast must fail. + try { + final RestorableUniformRandomProvider dummy = (RestorableUniformRandomProvider) rng2; + Assert.fail("Cast should have failed"); + } catch (ClassCastException e) { + // Expected. + } + } + + @Test public void testSerializingState() throws IOException, ClassNotFoundException {
