/*
* $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.ArrayList;
import java.util.Collection;
import java.util.UUID;
import javax.inject.Inject;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import io.janusproject.kernel.bic.InternalEventBusCapacity;
import io.janusproject.kernel.bic.InternalEventBusSkill;
import io.janusproject.kernel.bic.internaleventdispatching.AgentInternalEventsDispatcher;
import io.janusproject.services.logging.LogService;
import io.janusproject.tests.testutils.AbstractJanusTest;
import io.sarl.core.Destroy;
import io.sarl.core.Initialize;
import io.sarl.lang.core.Address;
import io.sarl.lang.core.Agent;
import io.sarl.lang.core.Behavior;
import io.sarl.lang.core.Event;
import io.sarl.lang.core.EventListener;
import io.sarl.lang.core.Skill.UninstallationStage;
/**
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
@SuppressWarnings("all")
public class InternalEventBusSkillTest extends AbstractJanusTest {
@Inject
private ReflectExtensions reflect;
@Mock
private AgentInternalEventsDispatcher eventBus;
@Mock
private LogService logger;
@Mock
private Agent agent;
@Mock
private Address innerAddress;
@InjectMocks
private InternalEventBusSkill skill;
@Test
public void asEventListener() {
assertNotNull(this.skill.asEventListener());
}
@Test
public void getInnerDefaultSpaceAddress() {
assertSame(this.innerAddress, this.skill.getInnerDefaultSpaceAddress());
}
@Test
public void registerEventListener_null_disableInitializeFiring() {
EventListener eventListener = Mockito.mock(EventListener.class);
this.skill.registerEventListener(eventListener, false, null);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument4 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument5 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument4.capture(), argument5.capture());
assertSame(eventListener, argument1.getValue());
assertNull(argument2.getValue());
}
@Test
public void registerEventListener_validFilter_disableInitializeFiring() {
EventListener eventListener = Mockito.mock(EventListener.class);
Function1<? super Event, ? extends Boolean> filter = (event) -> true;
this.skill.registerEventListener(eventListener, false, filter);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument4 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument5 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument4.capture(), argument5.capture());
assertSame(eventListener, argument1.getValue());
assertSame(filter, argument2.getValue());
}
@Test
public void registerEventListener_invalidFilter_disableInitializeFiring() {
EventListener eventListener = Mockito.mock(EventListener.class);
Function1<? super Event, ? extends Boolean> filter = (event) -> false;
this.skill.registerEventListener(eventListener, false, filter);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument4 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument5 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument4.capture(), argument5.capture());
assertSame(eventListener, argument1.getValue());
assertSame(filter, argument2.getValue());
}
@Test
public void registerEventListener_null_enableInitializeFiring_running() throws Exception {
EventListener eventListener = Mockito.mock(EventListener.class);
this.reflect.invoke(this.skill, "setOwnerState", InternalEventBusCapacity.OwnerState.ALIVE);
this.skill.registerEventListener(eventListener, true, null);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
assertSame(eventListener, argument1.getValue());
assertNull(argument2.getValue());
assertNotNull(argument3.getValue());
}
@Test
public void registerEventListener_validFilter_enableInitializeFiring_running() throws Exception {
EventListener eventListener = Mockito.mock(EventListener.class);
this.reflect.invoke(this.skill, "setOwnerState", InternalEventBusCapacity.OwnerState.ALIVE);
Function1<? super Event, ? extends Boolean> filter = (event) -> true;
this.skill.registerEventListener(eventListener, true, filter);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
assertSame(eventListener, argument1.getValue());
assertSame(filter, argument2.getValue());
assertNotNull(argument3.getValue());
}
@Test
public void registerEventListener_invalidFilter_enableInitializeFiring_running() throws Exception {
EventListener eventListener = Mockito.mock(EventListener.class);
this.reflect.invoke(this.skill, "setOwnerState", InternalEventBusCapacity.OwnerState.ALIVE);
Function1<? super Event, ? extends Boolean> filter = (event) -> false;
this.skill.registerEventListener(eventListener, true, filter);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
assertSame(eventListener, argument1.getValue());
assertSame(filter, argument2.getValue());
assertNotNull(argument3.getValue());
}
@Test
public void registerEventListener_null_enableInitializeFiring_notRunning() {
EventListener eventListener = Mockito.mock(EventListener.class);
this.skill.registerEventListener(eventListener, true, null);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument4 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument5 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument4.capture(), argument5.capture());
assertSame(eventListener, argument1.getValue());
assertNull(argument2.getValue());
}
@Test
public void registerEventListener_validFilter_enableInitializeFiring_notRunning() {
EventListener eventListener = Mockito.mock(EventListener.class);
Function1<? super Event, ? extends Boolean> filter = (event) -> true;
this.skill.registerEventListener(eventListener, true, filter);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument4 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument5 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument4.capture(), argument5.capture());
assertSame(eventListener, argument1.getValue());
assertSame(filter, argument2.getValue());
}
@Test
public void registerEventListener_invalidFilter_enableInitializeFiring_notRunning() {
EventListener eventListener = Mockito.mock(EventListener.class);
Function1<? super Event, ? extends Boolean> filter = (event) -> false;
this.skill.registerEventListener(eventListener, true, filter);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument4 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument5 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument4.capture(), argument5.capture());
assertSame(eventListener, argument1.getValue());
assertSame(filter, argument2.getValue());
}
@Test
public void unregisterEventListener_enableDestroyFiring_running() throws Exception {
EventListener eventListener = Mockito.mock(EventListener.class);
this.reflect.invoke(this.skill, "setOwnerState", InternalEventBusCapacity.OwnerState.ALIVE);
this.skill.registerEventListener(eventListener, false, null);
//
this.skill.unregisterEventListener(eventListener, true);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Procedure1<Object>> argument2 = ArgumentCaptor.forClass(Procedure1.class);
Mockito.verify(this.eventBus, Mockito.times(1)).unregister(argument1.capture(), argument2.capture());
assertSame(eventListener, argument1.getValue());
assertNotNull(argument2.getValue());
}
@Test
public void unregisterEventListener_enableDestroyFiring_notRunning() {
EventListener eventListener = Mockito.mock(EventListener.class);
this.skill.registerEventListener(eventListener, false, null);
//
this.skill.unregisterEventListener(eventListener, true);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Procedure1<Object>> argument2 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument3 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument4 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).unregister(argument1.capture(), argument2.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument3.capture(), argument4.capture());
assertSame(eventListener, argument1.getValue());
}
@Test
public void unregisterEventListener_disableDestroyFiring() {
EventListener eventListener = Mockito.mock(EventListener.class);
this.skill.registerEventListener(eventListener, false, null);
//
this.skill.unregisterEventListener(eventListener, false);
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Procedure1<Object>> argument2 = ArgumentCaptor.forClass(Procedure1.class);
ArgumentCaptor<Object> argument3 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Event> argument4 = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).unregister(argument1.capture(), argument2.capture());
Mockito.verify(this.eventBus, Mockito.never()).immediateDispatchTo(argument3.capture(), argument4.capture());
assertSame(eventListener, argument1.getValue());
}
@Test
public void install() throws Exception {
this.reflect.invoke(this.skill, "install");
ArgumentCaptor<Object> argument1 = ArgumentCaptor.forClass(Object.class);
ArgumentCaptor<Function1<? super Event, ? extends Boolean>> argument2 = ArgumentCaptor.forClass(Function1.class);
ArgumentCaptor<Procedure1<Object>> argument3 = ArgumentCaptor.forClass(Procedure1.class);
Mockito.verify(this.eventBus, Mockito.times(1)).register(argument1.capture(), argument2.capture(), argument3.capture());
assertSame(this.agent, argument1.getValue());
assertNull(argument2.getValue());
assertNull(argument3.getValue());
}
@Test
public void uninstall_Pre() throws Exception {
this.reflect.invoke(this.skill, "install");
//
this.reflect.invoke(this.skill, "uninstall", UninstallationStage.PRE_DESTROY_EVENT);
ArgumentCaptor<Procedure1<Object>> argument = ArgumentCaptor.forClass(Procedure1.class);
Mockito.verify(this.eventBus, Mockito.never()).unregisterAll(argument.capture());
}
@Test
public void uninstall_Post() throws Exception {
this.reflect.invoke(this.skill, "install");
//
this.reflect.invoke(this.skill, "uninstall", UninstallationStage.POST_DESTROY_EVENT);
ArgumentCaptor<Procedure1<Object>> argument = ArgumentCaptor.forClass(Procedure1.class);
Mockito.verify(this.eventBus, Mockito.times(1)).unregisterAll(argument.capture());
}
@Test
public void selfEvent_other_notinitialized() {
Event event = Mockito.mock(Event.class);
this.skill.selfEvent(event);
Mockito.verifyZeroInteractions(this.eventBus);
}
@Test
public void selfEvent_other_initialized() {
Initialize initEvent = new Initialize(UUID.randomUUID());
this.skill.selfEvent(initEvent);
//
Event event = Mockito.mock(Event.class);
this.skill.selfEvent(event);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).asyncDispatch(argument.capture());
assertSame(event, argument.getValue());
}
@Test
public void selfEvent_initialize() {
Initialize event = new Initialize(UUID.randomUUID());
this.skill.selfEvent(event);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).immediateDispatch(argument.capture());
assertSame(event, argument.getValue());
}
@Test
public void selfEvent_destroy() {
Destroy event = new Destroy();
this.skill.selfEvent(event);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.eventBus, Mockito.times(1)).immediateDispatch(argument.capture());
assertSame(event, argument.getValue());
}
}