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 {

Reply via email to