/*
* $Id$
*
* Janus platform is an open-source multiagent platform.
* More details on http://www.janusproject.io
*
* Copyright (C) 2014-2015 Sebastian RODRIGUEZ, Nicolas GAUD, Stéphane GALLAND.
*
* Licensed 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 io.janusproject.tests.kernel.bic;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.UUID;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import io.janusproject.kernel.bic.LoggingSkill;
import io.janusproject.services.logging.LogService;
import io.janusproject.tests.testutils.AbstractJanusTest;
import io.janusproject.util.LoggerCreator;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.internal.verification.Times;
import io.sarl.core.Time;
import io.sarl.lang.core.Agent;
import io.sarl.lang.core.BuiltinCapacitiesProvider;
import io.sarl.lang.core.Capacity;
import io.sarl.lang.core.Skill;
import io.sarl.lang.util.ClearableReference;
import io.sarl.tests.api.ManualMocking;
import io.sarl.tests.api.Nullable;
/**
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
@SuppressWarnings("all")
@ManualMocking
public class LoggingSkillTest extends AbstractJanusTest {
@Mock
protected Handler handler;
@Nullable
protected Agent owner;
@Mock
protected LogService logService;
@InjectMocks
protected LoggingSkill skill;
@Nullable
protected Logger logger;
protected Logger parentLogger;
@Before
public void setUp() throws Exception {
UUID agentId = UUID.randomUUID();
this.owner = new TestAgent(agentId, this);
this.owner = Mockito.spy(this.owner);
this.skill = this.reflect.newInstance(LoggingSkill.class, this.owner);
MockitoAnnotations.initMocks(this);
this.skill = Mockito.spy(this.skill);
//
this.parentLogger = Mockito.spy(Logger.getLogger("ROOT"));
Mockito.when(this.parentLogger.getHandlers()).thenReturn(new Handler[] { this.handler });
//
Mockito.when(this.logService.getLogger()).thenReturn(this.parentLogger);
//
this.reflect.invoke(this.skill, "install");
//
this.logger = Mockito.spy(this.skill.getLogger());
this.reflect.set(this.skill, "logger", this.logger);
}
@Test
public void errorObject_off() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
//
this.logger.setLevel(Level.OFF);
this.skill.error(message);
Mockito.verify(this.logger, new Times(1)).isLoggable(argument1.capture());
assertSame(Level.SEVERE, argument1.getValue());
Mockito.verify(this.parentLogger, Mockito.times(1)).getLevel();
Mockito.verifyNoMoreInteractions(this.parentLogger);
}
@Test
public void errorObject_on() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<Level> argument2 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<String> argument3 = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<LogRecord> argument4 = ArgumentCaptor.forClass(LogRecord.class);
ArgumentCaptor<Object[]> argument5 = ArgumentCaptor.forClass(Object[].class);
//
this.logger.setLevel(Level.ALL);
this.skill.error(message);
//
Mockito.verify(this.logger, new Times(3)).isLoggable(argument1.capture());
assertSame(Level.SEVERE, argument1.getValue());
//
Mockito.verify(this.logger, new Times(1)).log(argument2.capture(), argument3.capture(), argument5.capture());
assertSame(Level.SEVERE, argument2.getValue());
assertEquals(message, argument3.getValue());
//
Mockito.verify(this.handler).publish(argument4.capture());
assertNotNull(argument4.getValue());
assertSame(Level.SEVERE, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertNull(argument4.getValue().getThrown());
}
@Test
public void errorObjectThrowable_off() {
Throwable ex = new Exception();
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
//
this.logger.setLevel(Level.OFF);
this.skill.error(message, ex);
Mockito.verify(this.logger, new Times(1)).isLoggable(argument1.capture());
assertSame(Level.SEVERE, argument1.getValue());
Mockito.verify(this.parentLogger, Mockito.times(1)).getLevel();
Mockito.verifyNoMoreInteractions(this.parentLogger);
}
@Test
public void errorObjectThrowable_on() {
Throwable ex = new Exception();
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<LogRecord> argument4 = ArgumentCaptor.forClass(LogRecord.class);
ArgumentCaptor<Throwable> argument5 = ArgumentCaptor.forClass(Throwable.class);
//
this.logger.setLevel(Level.ALL);
this.skill.error(message, ex);
//
Mockito.verify(this.logger, new Times(2)).isLoggable(argument1.capture());
assertSame(Level.SEVERE, argument1.getValue());
//
Mockito.verify(this.logger, new Times(1)).log(argument4.capture());
assertSame(Level.SEVERE, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertSame(ex, argument4.getValue().getThrown());
//
Mockito.verify(this.handler).publish(argument4.capture());
assertNotNull(argument4.getValue());
assertSame(Level.SEVERE, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertSame(ex, argument4.getValue().getThrown());
}
@Test
public void warningObject_off() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
//
this.logger.setLevel(Level.OFF);
this.skill.warning(message);
Mockito.verify(this.logger, new Times(1)).isLoggable(argument1.capture());
assertSame(Level.WARNING, argument1.getValue());
Mockito.verify(this.parentLogger, Mockito.times(1)).getLevel();
Mockito.verifyNoMoreInteractions(this.parentLogger);
}
@Test
public void warningObject_on() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<Level> argument2 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<String> argument3 = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<LogRecord> argument4 = ArgumentCaptor.forClass(LogRecord.class);
ArgumentCaptor<Object[]> argument5 = ArgumentCaptor.forClass(Object[].class);
//
this.logger.setLevel(Level.ALL);
this.skill.warning(message);
//
Mockito.verify(this.logger, new Times(3)).isLoggable(argument1.capture());
assertSame(Level.WARNING, argument1.getValue());
//
Mockito.verify(this.logger, new Times(1)).log(argument2.capture(), argument3.capture(), argument5.capture());
assertSame(Level.WARNING, argument2.getValue());
assertEquals(message, argument3.getValue());
//
Mockito.verify(this.handler).publish(argument4.capture());
assertNotNull(argument4.getValue());
assertSame(Level.WARNING, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertNull(argument4.getValue().getThrown());
}
@Test
public void warningObjectThrowable_off() {
Throwable ex = new Exception();
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
//
this.logger.setLevel(Level.OFF);
this.skill.warning(message, ex);
Mockito.verify(this.logger, new Times(1)).isLoggable(argument1.capture());
assertSame(Level.WARNING, argument1.getValue());
Mockito.verify(this.parentLogger, Mockito.times(1)).getLevel();
Mockito.verifyNoMoreInteractions(this.parentLogger);
}
@Test
public void warningObjectThrowable_on() {
Throwable ex = new Exception();
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<LogRecord> argument4 = ArgumentCaptor.forClass(LogRecord.class);
//
this.logger.setLevel(Level.ALL);
this.skill.warning(message, ex);
//
Mockito.verify(this.logger, new Times(2)).isLoggable(argument1.capture());
assertSame(Level.WARNING, argument1.getValue());
//
Mockito.verify(this.logger, new Times(1)).log(argument4.capture());
assertSame(Level.WARNING, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertSame(ex, argument4.getValue().getThrown());
//
Mockito.verify(this.handler).publish(argument4.capture());
assertNotNull(argument4.getValue());
assertSame(Level.WARNING, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertSame(ex, argument4.getValue().getThrown());
}
@Test
public void info_off() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
//
this.logger.setLevel(Level.OFF);
this.skill.info(message);
Mockito.verify(this.logger, new Times(1)).isLoggable(argument1.capture());
assertSame(Level.INFO, argument1.getValue());
Mockito.verify(this.parentLogger, Mockito.times(1)).getLevel();
Mockito.verifyNoMoreInteractions(this.parentLogger);
}
@Test
public void info_on() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<LogRecord> argument4 = ArgumentCaptor.forClass(LogRecord.class);
//
this.logger.setLevel(Level.ALL);
this.skill.info(message);
//
Mockito.verify(this.logger, new Times(3)).isLoggable(argument1.capture());
assertSame(Level.INFO, argument1.getValue());
//
Mockito.verify(this.logger, new Times(1)).log(argument4.capture());
assertSame(Level.INFO, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
//
Mockito.verify(this.handler).publish(argument4.capture());
assertNotNull(argument4.getValue());
assertSame(Level.INFO, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertNull(argument4.getValue().getThrown());
}
@Test
public void println_off() {
info_off();
}
@Test
public void println_on() {
info_on();
}
@Test
public void debug_off() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
//
this.logger.setLevel(Level.OFF);
this.skill.debug(message);
Mockito.verify(this.logger, new Times(1)).isLoggable(argument1.capture());
assertSame(Level.CONFIG, argument1.getValue());
Mockito.verify(this.parentLogger, Mockito.times(1)).getLevel();
Mockito.verifyNoMoreInteractions(this.parentLogger);
}
@Test
public void debug_on() {
String message = UUID.randomUUID().toString();
ArgumentCaptor<Level> argument1 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<Level> argument2 = ArgumentCaptor.forClass(Level.class);
ArgumentCaptor<String> argument3 = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<LogRecord> argument4 = ArgumentCaptor.forClass(LogRecord.class);
ArgumentCaptor<Object[]> argument5 = ArgumentCaptor.forClass(Object[].class);
//
this.logger.setLevel(Level.ALL);
this.skill.debug(message);
//
Mockito.verify(this.logger, new Times(3)).isLoggable(argument1.capture());
assertSame(Level.CONFIG, argument1.getValue());
//
Mockito.verify(this.logger, new Times(1)).log(argument2.capture(), argument3.capture(), argument5.capture());
assertSame(Level.CONFIG, argument2.getValue());
assertEquals(message, argument3.getValue());
//
Mockito.verify(this.handler).publish(argument4.capture());
assertNotNull(argument4.getValue());
assertSame(Level.CONFIG, argument4.getValue().getLevel());
assertEquals(message, argument4.getValue().getMessage());
assertNull(argument4.getValue().getThrown());
}
@Test
public void getLogLevel() {
int expected = LoggerCreator.toInt(this.logger.getLevel());
assertEquals(expected, this.skill.getLogLevel());
}
@Test
public void setLogLevel() {
for (int i = 0; i < 10; i++) {
this.skill.setLogLevel(i);
assertEquals(Math.max(0, Math.min(7, i)), this.skill.getLogLevel());
}
}
@Test
public void isErrorLogEnabled() {
this.skill.setLogLevel(0);
assertFalse(this.skill.isErrorLogEnabled());
this.skill.setLogLevel(1);
assertTrue(this.skill.isErrorLogEnabled());
this.skill.setLogLevel(2);
assertTrue(this.skill.isErrorLogEnabled());
this.skill.setLogLevel(3);
assertTrue(this.skill.isErrorLogEnabled());
this.skill.setLogLevel(4);
assertTrue(this.skill.isErrorLogEnabled());
this.skill.setLogLevel(5);
assertTrue(this.skill.isErrorLogEnabled());
this.skill.setLogLevel(6);
assertTrue(this.skill.isErrorLogEnabled());
this.skill.setLogLevel(7);
assertTrue(this.skill.isErrorLogEnabled());
}
@Test
public void isWarningLogEnabled() {
this.skill.setLogLevel(0);
assertFalse(this.skill.isWarningLogEnabled());
this.skill.setLogLevel(1);
assertFalse(this.skill.isWarningLogEnabled());
this.skill.setLogLevel(2);
assertTrue(this.skill.isWarningLogEnabled());
this.skill.setLogLevel(3);
assertTrue(this.skill.isWarningLogEnabled());
this.skill.setLogLevel(4);
assertTrue(this.skill.isWarningLogEnabled());
this.skill.setLogLevel(5);
assertTrue(this.skill.isWarningLogEnabled());
this.skill.setLogLevel(6);
assertTrue(this.skill.isWarningLogEnabled());
this.skill.setLogLevel(7);
assertTrue(this.skill.isWarningLogEnabled());
}
@Test
public void isInfoLogEnabled() {
this.skill.setLogLevel(0);
assertFalse(this.skill.isInfoLogEnabled());
this.skill.setLogLevel(1);
assertFalse(this.skill.isInfoLogEnabled());
this.skill.setLogLevel(2);
assertFalse(this.skill.isInfoLogEnabled());
this.skill.setLogLevel(3);
assertTrue(this.skill.isInfoLogEnabled());
this.skill.setLogLevel(4);
assertTrue(this.skill.isInfoLogEnabled());
this.skill.setLogLevel(5);
assertTrue(this.skill.isInfoLogEnabled());
this.skill.setLogLevel(6);
assertTrue(this.skill.isInfoLogEnabled());
this.skill.setLogLevel(7);
assertTrue(this.skill.isInfoLogEnabled());
}
@Test
public void isDebugLogEnabled() {
this.skill.setLogLevel(0);
assertFalse(this.skill.isDebugLogEnabled());
this.skill.setLogLevel(1);
assertFalse(this.skill.isDebugLogEnabled());
this.skill.setLogLevel(2);
assertFalse(this.skill.isDebugLogEnabled());
this.skill.setLogLevel(3);
assertFalse(this.skill.isDebugLogEnabled());
this.skill.setLogLevel(4);
assertTrue(this.skill.isDebugLogEnabled());
this.skill.setLogLevel(5);
assertTrue(this.skill.isDebugLogEnabled());
this.skill.setLogLevel(6);
assertTrue(this.skill.isDebugLogEnabled());
this.skill.setLogLevel(7);
assertTrue(this.skill.isDebugLogEnabled());
}
public static class TestAgent extends Agent {
private final LoggingSkillTest test;
public TestAgent(UUID agentId, LoggingSkillTest test) {
super(Mockito.mock(BuiltinCapacitiesProvider.class), agentId, null);
this.test = test;
}
@Override
protected ClearableReference<Skill> $getSkill(Class<? extends Capacity> capacity) {
return new ClearableReference<>(this.test.skill);
}
}
}