/**
* This file is part of the source code and related artifacts for eGym Application.
*
* Copyright © 2013 eGym GmbH
*/
package de.egym.logqueue;
import static org.testng.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.slf4j.Logger;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import de.egym.logqueue.slf4j.EgymLoggerFactory;
@Test
public class EgymLoggerFactoryTest {
private EgymLoggerFactory loggerFactory;
@BeforeMethod
public void init() {
loggerFactory = new EgymLoggerFactory();
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testGetLoggerNull() {
loggerFactory.getLogger(null);
}
@Test
public void testGetLogger() {
final Logger logger1 = loggerFactory.getLogger("foo");
assertNotNull(logger1);
assertEquals(logger1.getName(), "foo");
final Logger logger2 = loggerFactory.getLogger("foo");
assertTrue(logger1 == logger2);
}
@Test
public void testGetLoggerConcurrency() {
final int numThreads = 1000;
final int threadIterations = 100;
final List<String> names = Arrays.asList("foo", "bar", "fizz", "buzz");
final ConcurrentMap<String, Logger> loggers = new ConcurrentHashMap<String, Logger>();
final List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < numThreads; i++) {
threads.add(new Thread() {
@Override
public void run() {
for (int j = 0; j < threadIterations; j++) {
final String name = names.get(j % names.size());
final Logger logger = loggerFactory.getLogger(name);
if (loggers.containsKey(name)) {
if (loggers.get(name) != logger) {
throw new AssertionError();
}
} else {
loggers.putIfAbsent(name, logger);
}
}
}
});
}
for (Thread thread : threads) {
thread.start();
}
for (Thread thread : threads) {
while (thread.isAlive()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException("Stop interrupting me!", e);
}
}
}
}
}