/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.logging.log4j;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.*;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.message.ParameterizedMessageFactory;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.test.junit.categories.UnitTest;
/**
* Unit tests the FastLogger class which wraps and delegates to an actual Logger with optimizations
* for isDebugEnabled and isTraceEnabled.
*/
@Category(UnitTest.class)
public class FastLoggerJUnitTest {
private MessageFactory messageFactory;
private ExtendedLogger mockedLogger;
private Marker mockedMarker;
@Before
public void setUp() {
this.messageFactory = new ParameterizedMessageFactory();
this.mockedLogger = mock(ExtendedLogger.class);
this.mockedMarker = mock(Marker.class);
when(this.mockedLogger.getMessageFactory()).thenReturn(this.messageFactory);
when(this.mockedMarker.getName()).thenReturn("MARKER");
}
/**
* FastLogger should return isDelegating after setDelegating
*/
@Test
public void returnIsDelegatingAfterSetDelegating() {
FastLogger.setDelegating(true);
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.isDelegating(), is(true));
FastLogger.setDelegating(false);
assertThat(fastLogger.isDelegating(), is(false));
}
/**
* FastLogger should delegate getLevel
*/
@Test
public void delegateGetLevel() {
FastLogger.setDelegating(true);
when(this.mockedLogger.getLevel()).thenReturn(Level.DEBUG);
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.getLevel(), is(Level.DEBUG));
verify(this.mockedLogger, times(1)).getLevel();
}
/**
* FastLogger should delegate isDebugEnabled when isDelegating
*/
@Test
public void delegateIsDebugEnabledWhenIsDelegating() {
FastLogger.setDelegating(true);
when(this.mockedLogger.getLevel()).thenReturn(Level.DEBUG);
when(this.mockedLogger.isEnabled(eq(Level.DEBUG), isNull(Marker.class), isNull(String.class)))
.thenReturn(true);
when(this.mockedLogger.isEnabled(eq(Level.DEBUG), eq(this.mockedMarker), isNull(Object.class),
isNull(Throwable.class))).thenReturn(true);
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.isDebugEnabled(), is(true));
assertThat(fastLogger.isDebugEnabled(this.mockedMarker), is(true));
verify(this.mockedLogger, times(1)).isEnabled(eq(Level.DEBUG), any(Marker.class),
isNull(String.class));
verify(this.mockedLogger, times(1)).isEnabled(eq(Level.DEBUG), eq(this.mockedMarker),
isNull(Object.class), isNull(Throwable.class));
}
/**
* FastLogger should delegate isTraceEnabled when isDelegating
*/
@Test
public void delegateIsTraceEnabledWhenIsDelegating() {
FastLogger.setDelegating(true);
when(this.mockedLogger.getLevel()).thenReturn(Level.TRACE);
when(this.mockedLogger.isEnabled(eq(Level.TRACE), isNull(Marker.class), isNull(Object.class),
isNull(Throwable.class))).thenReturn(true);
when(this.mockedLogger.isEnabled(eq(Level.TRACE), eq(this.mockedMarker), isNull(Object.class),
isNull(Throwable.class))).thenReturn(true);
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.isTraceEnabled(), is(true));
assertThat(fastLogger.isTraceEnabled(this.mockedMarker), is(true));
verify(this.mockedLogger, times(1)).isEnabled(eq(Level.TRACE), isNull(Marker.class),
isNull(Object.class), isNull(Throwable.class));
verify(this.mockedLogger, times(1)).isEnabled(eq(Level.TRACE), eq(this.mockedMarker),
isNull(Object.class), isNull(Throwable.class));
}
/**
* FastLogger should not delegate isDebugEnabled when not isDelegating
*/
@Test
public void notDelegateIsDebugEnabledWhenNotIsDelegating() {
FastLogger.setDelegating(false);
when(this.mockedLogger.getLevel()).thenReturn(Level.INFO);
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.getLevel(), is(Level.INFO));
assertThat(fastLogger.isDebugEnabled(), is(false));
assertThat(fastLogger.isDebugEnabled(this.mockedMarker), is(false));
verify(this.mockedLogger, times(0)).isEnabled(eq(Level.DEBUG), isNull(Marker.class),
isNull(String.class));
verify(this.mockedLogger, times(0)).isEnabled(eq(Level.DEBUG), eq(this.mockedMarker),
isNull(Object.class), isNull(Throwable.class));
}
/**
* FastLogger should not delegate isTraceEnabled when not isDelegating
*/
@Test
public void notDelegateIsTraceEnabledWhenNotIsDelegating() {
FastLogger.setDelegating(false);
when(mockedLogger.getLevel()).thenReturn(Level.INFO);
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.getLevel(), is(Level.INFO));
assertThat(fastLogger.isTraceEnabled(), is(false));
assertThat(fastLogger.isTraceEnabled(this.mockedMarker), is(false));
verify(this.mockedLogger, times(0)).isEnabled(eq(Level.TRACE), isNull(Marker.class),
isNull(String.class));
verify(this.mockedLogger, times(0)).isEnabled(eq(Level.TRACE), eq(this.mockedMarker),
isNull(Object.class), isNull(Throwable.class));
}
/**
* FastLogger should wrap delegate and return from getExtendedLogger
*/
@Test
public void wrapDelegateAndReturnFromGetExtendedLogger() {
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.getExtendedLogger(), is(sameInstance(this.mockedLogger)));
}
/**
* FastLogger should delegate getName
*/
@Test
public void delegateGetName() {
when(this.mockedLogger.getName()).thenReturn("name");
FastLogger fastLogger = new FastLogger(this.mockedLogger);
assertThat(fastLogger.getName(), is("name"));
verify(this.mockedLogger, times(1)).getName();
}
}