/******************************************************************************* * (c) Copyright 2016 Hewlett-Packard Development Company, L.P. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License v2.0 which accompany this distribution. * * The Apache License is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ package io.cloudslang.lang.logging; import org.apache.commons.lang3.concurrent.ConcurrentUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.log4j.Level; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doAnswer; @RunWith(MockitoJUnitRunner.class) public class LoggingServiceImplTest { private static final String SINGLE_THREAD_EXECUTOR = "singleThreadExecutor"; private static final String LATEST_TASK = "latestTask"; @InjectMocks @Spy private LoggingServiceImpl loggingService; @Mock private ThreadPoolExecutor singleThreadExecutor; @Test public void testInitialize() throws Exception { LoggingServiceImpl localLoggingService = new LoggingServiceImpl(); // Tested call localLoggingService.initialize(); Class<? extends LoggingServiceImpl> loggingServiceClass = localLoggingService.getClass(); Field loggingServiceClassDeclaredField = loggingServiceClass.getDeclaredField(SINGLE_THREAD_EXECUTOR); loggingServiceClassDeclaredField.setAccessible(true); Object singleThreadExecutor = loggingServiceClassDeclaredField.get(localLoggingService); assertTrue(singleThreadExecutor instanceof ThreadPoolExecutor); assertEquals(1, ((ThreadPoolExecutor) singleThreadExecutor).getMaximumPoolSize()); } @Test public void testDestroy() throws Exception { LoggingServiceImpl localLoggingService = new LoggingServiceImpl(); localLoggingService.initialize(); Class<? extends LoggingServiceImpl> loggingServiceClass = localLoggingService.getClass(); Field loggingServiceClassDeclaredField = loggingServiceClass.getDeclaredField(SINGLE_THREAD_EXECUTOR); loggingServiceClassDeclaredField.setAccessible(true); Object singleThreadExecutor = loggingServiceClassDeclaredField.get(localLoggingService); assertNotNull(singleThreadExecutor); // Tested call localLoggingService.destroy(); singleThreadExecutor = loggingServiceClassDeclaredField.get(localLoggingService); assertNull(singleThreadExecutor); } @Test public void testLogEventWithTwoParams() { final List<Runnable> runnableList = new ArrayList<>(); final MutableInt mutableInt = new MutableInt(0); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocationOnMock) throws Throwable { mutableInt.increment(); Object[] arguments = invocationOnMock.getArguments(); runnableList.add((Runnable) arguments[0]); if (mutableInt.getValue() == 1) { return ConcurrentUtils.constantFuture("aaa"); } else if (mutableInt.getValue() == 2) { return ConcurrentUtils.constantFuture("bbb"); } else { return null; } } }).when(singleThreadExecutor).submit(Mockito.any(Runnable.class)); // Tested calls loggingService.logEvent(Level.INFO, "aaa"); loggingService.logEvent(Level.ERROR, "bbb"); assertEquals(2, runnableList.size()); assertTrue(runnableList.get(0) instanceof LoggingServiceImpl.LoggingDetailsRunnable); assertTrue(runnableList.get(1) instanceof LoggingServiceImpl.LoggingDetailsRunnable); assertEquals(new LoggingServiceImpl.LoggingDetailsRunnable(Level.INFO, "aaa"), runnableList.get(0)); assertEquals(new LoggingServiceImpl.LoggingDetailsRunnable(Level.ERROR, "bbb"), runnableList.get(1)); } @Test public void testLogEventWithThreeParams() { final List<Runnable> runnableList = new ArrayList<>(); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocationOnMock) throws Throwable { Object[] arguments = invocationOnMock.getArguments(); runnableList.add((Runnable) arguments[0]); return null; } }).when(singleThreadExecutor).submit(Mockito.any(Runnable.class)); final RuntimeException ex1 = new RuntimeException("some exception 1"); final IllegalArgumentException ex2 = new IllegalArgumentException("some value does not respect its contract"); final IllegalStateException ex3 = new IllegalStateException("state is illegal"); final IllegalAccessException ex4 = new IllegalAccessException("Access denied"); final String message1 = "message1"; final String message2 = "message2"; final String message3 = "message3"; final String message4 = "message4"; // Tested calls loggingService.logEvent(Level.DEBUG, message1, ex1); loggingService.logEvent(Level.TRACE, message2, ex2); loggingService.logEvent(Level.ERROR, message3, ex3); loggingService.logEvent(Level.FATAL, message4, ex4); assertEquals(4, runnableList.size()); assertTrue(runnableList.get(0) instanceof LoggingServiceImpl.LoggingDetailsRunnable); assertTrue(runnableList.get(1) instanceof LoggingServiceImpl.LoggingDetailsRunnable); assertTrue(runnableList.get(2) instanceof LoggingServiceImpl.LoggingDetailsRunnable); assertTrue(runnableList.get(3) instanceof LoggingServiceImpl.LoggingDetailsRunnable); assertEquals(new LoggingServiceImpl.LoggingDetailsRunnable(Level.DEBUG, message1, ex1), runnableList.get(0)); assertEquals(new LoggingServiceImpl.LoggingDetailsRunnable(Level.TRACE, message2, ex2), runnableList.get(1)); assertEquals(new LoggingServiceImpl.LoggingDetailsRunnable(Level.ERROR, message3, ex3), runnableList.get(2)); assertEquals(new LoggingServiceImpl.LoggingDetailsRunnable(Level.FATAL, message4, ex4), runnableList.get(3)); } }