/*
* Copyright (c) 2011-2012 ICM Uniwersytet Warszawski All rights reserved.
* See LICENCE.txt file for licensing information.
*/
package eu.emi.security.authn.x509.impl;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.io.FileInputStream;
import java.security.cert.X509Certificate;
import java.util.Random;
import org.junit.Assert;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import eu.emi.security.authn.x509.NamespaceCheckingMode;
import eu.emi.security.authn.x509.RiskyIntegrationTests;
import eu.emi.security.authn.x509.impl.CertificateUtils.Encoding;
public class OpensslValidatorStressTest
{
@Test
@Category(RiskyIntegrationTests.class)
public void testSpeedup() throws Exception
{
new OpensslCertChainValidator(
"src/test/resources/glite-utiljava/grid-security/certificates", false,
NamespaceCheckingMode.EUGRIDPMA_GLOBUS, 100000,
new ValidatorParamsExt(), false);
new OpensslCertChainValidator(
"src/test/resources/glite-utiljava/grid-security/certificates", false,
NamespaceCheckingMode.EUGRIDPMA_GLOBUS, 100000,
new ValidatorParamsExt(), true);
long start = System.currentTimeMillis();
for (int i=0; i<500; i++)
{
OpensslCertChainValidator validator1 = new OpensslCertChainValidator(
"src/test/resources/glite-utiljava/grid-security/certificates", false,
NamespaceCheckingMode.EUGRIDPMA_GLOBUS, 1000,
new ValidatorParamsExt(), false);
validator1.dispose();
}
long t1 = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
for (int i=0; i<500; i++)
{
OpensslCertChainValidator validator1 = new OpensslCertChainValidator(
"src/test/resources/glite-utiljava/grid-security/certificates", false,
NamespaceCheckingMode.EUGRIDPMA_GLOBUS, 1000,
new ValidatorParamsExt(), true);
validator1.dispose();
}
long t2 = System.currentTimeMillis() - start;
double speedup = (double)t1/t2;
System.out.println("Loading: greedy: " + t1 + "ms lazy: " + t2 + "ms; speedup: " + speedup);
Assert.assertTrue("Speedup of lazy truststore loading is not sufficient", speedup > 50.0);
}
@Test
@Category(RiskyIntegrationTests.class)
public void opensslValidationShouldBeParallel() throws Exception
{
final OpensslCertChainValidator validator = new OpensslCertChainValidator(
"src/test/resources/glite-utiljava/grid-security/certificates", false,
NamespaceCheckingMode.EUGRIDPMA_GLOBUS, 100000,
new ValidatorParamsExt(), false);
final X509Certificate[] toCheck = CertificateUtils.loadCertificateChain(new FileInputStream(
"src/test/resources/glite-utiljava/trusted-certs/trusted_client.cert"),
Encoding.PEM);
final int THREADS = 4;
final int OPERATIONS = 2000;
long linearDuration = runValidation(1, OPERATIONS, validator, toCheck);
long parallelDuration = runValidation(THREADS, OPERATIONS/THREADS, validator, toCheck);
System.out.println("Linear duration: " + linearDuration + "ms, " +
OPERATIONS*1000.0/linearDuration + "ops");
System.out.println("Parallel duration: " + parallelDuration + "ms, " +
OPERATIONS*1000.0/parallelDuration + "ops");
assertThat(1.4*parallelDuration < linearDuration, is(true));
}
private long runValidation(int threadsNum, final int loop, final OpensslCertChainValidator validator,
final X509Certificate[] toCheck) throws InterruptedException
{
Thread []threads = new Thread[threadsNum];
long start = System.currentTimeMillis();
for (int i=0; i<threadsNum; i++)
{
threads[i] = new Thread(new Runnable(){
@Override
public void run()
{
for (int j=0; j<loop; j++)
assertThat(validator.validate(toCheck).isValid(), is(true));
}
});
threads[i].start();
}
for (int i=0; i<threadsNum; i++)
threads[i].join();
return System.currentTimeMillis() - start;
}
@Test
@Category(RiskyIntegrationTests.class)
public void testMemoryOOMValidator() throws Exception
{
Random rand = new Random();
Runtime r = Runtime.getRuntime();
r.gc();
long usedMem1 = r.totalMemory() - r.freeMemory();
for (int i=0; i<2000; i++)
{
new OpensslCertChainValidator(
"src/test/resources/glite-utiljava/grid-security/certificates",
false,
NamespaceCheckingMode.EUGRIDPMA_GLOBUS, rand.nextInt(3),
new ValidatorParamsExt(), false);
if (i%100 == 0)
{
r.gc();
long usedMem2 = r.totalMemory() - r.freeMemory();
System.out.println("Used memory: " + usedMem2/1024 + "kB\t\tChange: " +
(usedMem2-usedMem1)/1024 + "kB");
}
}
r.gc();
long usedMem2 = r.totalMemory() - r.freeMemory();
if (usedMem2-usedMem1 > 20000000)
Assert.fail("Memory leak? Usage stats are: " + usedMem1 + " " + usedMem2 + " "
+ (usedMem2-usedMem1));
else
System.out.println("Memory usage stats are: " + usedMem1 + " " + usedMem2 + " "
+ (usedMem2-usedMem1));
}
}