summaryrefslogtreecommitdiffstats
path: root/luni/src/test/java/tests/security/SecureRandomTest.java
diff options
context:
space:
mode:
authorBrian Carlstrom <bdc@google.com>2010-12-01 11:20:32 -0800
committerBrian Carlstrom <bdc@google.com>2010-12-01 11:24:41 -0800
commit7d71a13aa0cb794f14152b36b3873bf8ca595cdc (patch)
tree752f45f1adc81d31ee2a6a418121f9a3c462b651 /luni/src/test/java/tests/security/SecureRandomTest.java
parent3b5d436bb2345a0b8b9cb764a5b4fc6e6aa5711a (diff)
downloadlibcore-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.java55
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();
+ }
+ }
}