diff options
author | Brian Carlstrom <bdc@google.com> | 2010-12-01 11:20:32 -0800 |
---|---|---|
committer | Brian Carlstrom <bdc@google.com> | 2010-12-01 11:24:41 -0800 |
commit | 7d71a13aa0cb794f14152b36b3873bf8ca595cdc (patch) | |
tree | 752f45f1adc81d31ee2a6a418121f9a3c462b651 /luni/src/test/java/tests/security/SecureRandomTest.java | |
parent | 3b5d436bb2345a0b8b9cb764a5b4fc6e6aa5711a (diff) | |
download | libcore-7d71a13aa0cb794f14152b36b3873bf8ca595cdc.zip libcore-7d71a13aa0cb794f14152b36b3873bf8ca595cdc.tar.gz libcore-7d71a13aa0cb794f14152b36b3873bf8ca595cdc.tar.bz2 |
SecureRandom should be thread safe
Random is documented to be thread safe and our implementation appears
to be. However, the SecureRandom subclass implementation was not. This
was quite reproducible with the javax.net.ssl unit tests when run on a
multicore device, but not seen on a uniprocessor.
Details:
Actual bug fix by adding synchronized to engine* methods
luni/src/main/java/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java
New testSecureRandomThreadSafety based on generateSeed errors in javax.net.ssl tests.
luni/src/test/java/tests/security/SecureRandomTest.java
Removing dalvik.annotation.* from assorted SecureRandom tests.
luni/src/test/java/org/apache/harmony/security/tests/java/security/SecureRandom2Test.java
luni/src/test/java/org/apache/harmony/security/tests/java/security/SecureRandomSpiTest.java
luni/src/test/java/tests/java/security/SecureRandomTest.java
luni/src/test/java/tests/security/SecureRandomTest.java
Change-Id: I5e8ece4c0836b02277d7cac1b9b2f60b3c4a7755
Diffstat (limited to 'luni/src/test/java/tests/security/SecureRandomTest.java')
-rw-r--r-- | luni/src/test/java/tests/security/SecureRandomTest.java | 55 |
1 files changed, 28 insertions, 27 deletions
diff --git a/luni/src/test/java/tests/security/SecureRandomTest.java b/luni/src/test/java/tests/security/SecureRandomTest.java index cf9c6dc..bb038e1 100644 --- a/luni/src/test/java/tests/security/SecureRandomTest.java +++ b/luni/src/test/java/tests/security/SecureRandomTest.java @@ -15,19 +15,20 @@ */ package tests.security; -import dalvik.annotation.TestLevel; -import dalvik.annotation.TestTargetNew; -import dalvik.annotation.TestTargets; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import junit.framework.TestCase; -public abstract class SecureRandomTest extends TestCase { +public abstract class SecureRandomTest extends TestCase { private final String algorithmName; - private int counter=0; + private int counter = 0; protected SecureRandomTest(String name) { this.algorithmName = name; @@ -37,28 +38,6 @@ public abstract class SecureRandomTest extends TestCase { super.setUp(); } - @TestTargets({ - @TestTargetNew( - level=TestLevel.ADDITIONAL, - method="getInstance", - args={String.class} - ), - @TestTargetNew( - level=TestLevel.ADDITIONAL, - method="setSeed", - args={long.class} - ), - @TestTargetNew( - level=TestLevel.ADDITIONAL, - method="nextBytes", - args={byte[].class} - ), - @TestTargetNew( - level=TestLevel.COMPLETE, - method="method", - args={} - ) - }) public void testSecureRandom() { SecureRandom secureRandom1 = null; try { @@ -92,4 +71,26 @@ public abstract class SecureRandomTest extends TestCase { return randomData; } + + + public void testSecureRandomThreadSafety() throws Exception { + final SecureRandom secureRandom = SecureRandom.getInstance(algorithmName); + int threads = 2; + ExecutorService executor = Executors.newFixedThreadPool(threads); + ExecutorCompletionService ecs = new ExecutorCompletionService(executor); + for (int t = 0; t < threads; t++) { + ecs.submit(new Callable<Void>() { + public Void call () { + for (int i = 0; i < 1000; i++) { + secureRandom.generateSeed(1024); + } + return null; + } + }); + } + executor.shutdown(); + for (int i = 0; i < threads; i++) { + ecs.take().get(); + } + } } |