package org.infinispan.server.eventlogger;
import static org.infinispan.test.TestingUtil.blockUntilViewReceived;
import static org.infinispan.test.TestingUtil.withCacheManager;
import static org.infinispan.test.TestingUtil.withCacheManagers;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.io.File;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfiguration;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.AbstractInfinispanTest;
import org.infinispan.test.CacheManagerCallable;
import org.infinispan.test.MultiCacheManagerCallable;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.util.logging.events.EventLog;
import org.infinispan.util.logging.events.EventLogCategory;
import org.infinispan.util.logging.events.EventLogLevel;
import org.infinispan.util.logging.events.EventLogManager;
import org.infinispan.util.logging.events.EventLogger;
import org.testng.annotations.Test;
/**
* ServerEventLoggerTest.
*
* @author Tristan Tarrant
* @since 8.2
*/
@Test(testName = "server.eventlogger.ServerEventLoggerTest", groups = "functional")
public class ServerEventLoggerTest extends AbstractInfinispanTest {
public void testLocalServerEventLogging() {
withCacheManager(new CacheManagerCallable(TestCacheManagerFactory.createCacheManager()) {
@Override
public void call() throws Exception {
cm.getCache();
EventLogger eventLogger = EventLogManager.getEventLogger(cm);
assertTrue(eventLogger.getClass().getName(), eventLogger instanceof ServerEventLogger);
eventLogger.info(EventLogCategory.CLUSTER, "message #1");
eventLogger.info(EventLogCategory.TASKS, "message #2");
eventLogger.warn(EventLogCategory.CLUSTER, "message #3");
eventLogger.warn(EventLogCategory.TASKS, "message #4");
List<EventLog> events = eventLogger.getEvents(Instant.now(), 10, Optional.of(EventLogCategory.CLUSTER), Optional.empty());
assertEquals(2, events.size());
assertEquals("message #3", events.get(0).getMessage());
assertEquals(EventLogLevel.WARN, events.get(0).getLevel());
assertEquals("message #1", events.get(1).getMessage());
assertEquals(EventLogLevel.INFO, events.get(1).getLevel());
events = eventLogger.getEvents(Instant.now(), 10, Optional.empty(), Optional.of(EventLogLevel.INFO));
assertEquals(2, events.size());
assertEquals("message #2", events.get(0).getMessage());
assertEquals(EventLogCategory.TASKS, events.get(0).getCategory());
assertEquals("message #1", events.get(1).getMessage());
assertEquals(EventLogCategory.CLUSTER, events.get(1).getCategory());
}
});
}
public void testClusteredServerEventLogging() {
withCacheManagers(new MultiCacheManagerCallable(
TestCacheManagerFactory.createCacheManager(CacheMode.DIST_SYNC, false),
TestCacheManagerFactory.createCacheManager(CacheMode.DIST_SYNC, false),
TestCacheManagerFactory.createCacheManager(CacheMode.DIST_SYNC, false)) {
@Override
public void call() throws Exception {
int msg = 1;
blockUntilViewReceived(cms[0].getCache(), 3);
// Fill all nodes with logs
for (int i = 0; i < cms.length; i++) {
EventLogger eventLogger = EventLogManager.getEventLogger(cms[i]);
assertTrue(eventLogger.getClass().getName(), eventLogger instanceof ServerEventLogger);
eventLogger.info(EventLogCategory.SECURITY, "message #" + Integer.toString(msg++));
eventLogger.warn(EventLogCategory.SECURITY, "message #" + Integer.toString(msg++));
eventLogger.info(EventLogCategory.TASKS, "message #" + Integer.toString(msg++));
eventLogger.warn(EventLogCategory.TASKS, "message #" + Integer.toString(msg++));
}
// query all nodes
for (int i = 0; i < cms.length; i++) {
EventLogger eventLogger = EventLogManager.getEventLogger(cms[i]);
List<EventLog> events = eventLogger.getEvents(Instant.now(), 10, Optional.of(EventLogCategory.TASKS), Optional.empty());
assertEquals("Result count discrepancy on node " + i, 2 * cms.length, events.size());
for(EventLog event : events) {
assertEquals(EventLogCategory.TASKS, event.getCategory());
}
events = eventLogger.getEvents(Instant.now(), 10, Optional.empty(), Optional.of(EventLogLevel.INFO));
for(EventLog event : events) {
assertEquals(EventLogLevel.INFO, event.getLevel());
}
}
}
});
}
public void testLocalServerEventLoggingPreloading() {
deleteGlobalPersistentState();
EmbeddedCacheManager cm = startCacheManager();
EventLogger eventLogger = EventLogManager.getEventLogger(cm);
eventLogger.info(EventLogCategory.CLUSTER, "message #1");
TestingUtil.killCacheManagers(cm);
cm = startCacheManager();
eventLogger = EventLogManager.getEventLogger(cm);
eventLogger.info(EventLogCategory.CLUSTER, "message #5");
}
public EmbeddedCacheManager startCacheManager() {
GlobalConfigurationBuilder globaCfg = new GlobalConfigurationBuilder();
globaCfg.globalState().enable();
EmbeddedCacheManager cm = TestCacheManagerFactory.createCacheManager(
globaCfg, new ConfigurationBuilder());
cm.getCache();
return cm;
}
private static void deleteGlobalPersistentState() {
GlobalConfiguration globalCfg = new GlobalConfigurationBuilder().build();
new File(globalCfg.globalState().persistentLocation() + "/___event_log_cache.dat").delete();
}
}