/* See LICENSE for licensing and NOTICE for copyright. */
package org.cryptacular.generator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.cryptacular.FailListener;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
/**
* Unit test for {@link RandomIdGenerator}.
*
* @author Middleware Services
*/
@Listeners(FailListener.class)
public class RandomIdGeneratorTest
{
@DataProvider(name = "generators")
public Object[][] getGenerators()
{
return
new Object[][] {
{
new RandomIdGenerator(10),
Pattern.compile("\\w{10}"),
},
{
new RandomIdGenerator(128),
Pattern.compile("\\w{128}"),
},
{
new RandomIdGenerator(20, "abcdefg"),
Pattern.compile("[abcdefg]{20}"),
},
};
}
@Test(dataProvider = "generators")
public void testGenerate(final RandomIdGenerator generator, final Pattern expected)
throws Exception
{
for (int i = 0; i < 100; i++) {
final Matcher m = expected.matcher(generator.generate());
assertTrue(m.matches());
}
}
@Test
public void testConcurrentGeneration()
throws Exception
{
final ExecutorService executor = Executors.newFixedThreadPool(20);
final RandomIdGenerator generator = new RandomIdGenerator(50);
final Collection<Callable<String>> tasks = new ArrayList<>();
for (int i = 0; i < 20; i++) {
tasks.add(() -> generator.generate());
}
final List<Future<String>> results = executor.invokeAll(tasks);
for (Future<String> result : results) {
assertNotNull(result.get(1, TimeUnit.SECONDS));
}
}
}