/*
* $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.space;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.security.Principal;
import java.security.acl.Acl;
import java.security.acl.Permission;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Future;
import io.janusproject.kernel.services.jdk.distributeddata.DMapView;
import io.janusproject.kernel.space.RestrictedAccessEventSpaceImpl;
import io.janusproject.services.distributeddata.DMap;
import io.janusproject.services.distributeddata.DistributedDataStructureService;
import io.janusproject.services.executor.ExecutorService;
import io.janusproject.services.network.NetworkService;
import io.janusproject.tests.testutils.AbstractJanusTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.internal.verification.Times;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import io.sarl.lang.core.Address;
import io.sarl.lang.core.Event;
import io.sarl.lang.core.EventListener;
import io.sarl.lang.core.Scope;
import io.sarl.lang.core.SpaceID;
import io.sarl.tests.api.ManualMocking;
import io.sarl.tests.api.Nullable;
import io.sarl.util.OpenEventSpaceSpecification;
import io.sarl.util.Scopes;
/**
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
@SuppressWarnings("all")
@ManualMocking
public class RestrictedAccessEventSpaceImplTest extends AbstractJanusTest {
@Nullable
private UUID agentId;
@Nullable
private DistributedDataStructureService service;
@Nullable
private SpaceID spaceId;
@Nullable
private Address address;
@Nullable
private EventListener listener;
@Nullable
private Acl acl;
@Nullable
private Permission permission;
@Mock
private NetworkService network;
@Mock
private ExecutorService executor;
@InjectMocks
private RestrictedAccessEventSpaceImpl space;
@Before
public void setUp() {
this.agentId = UUID.randomUUID();
this.service = Mockito.mock(DistributedDataStructureService.class);
DMap<Object, Object> mapMock = new DMapView<>(UUID.randomUUID().toString(), new HashMap<>());
Mockito.when(this.service.getMap(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(mapMock);
Mockito.when(this.service.getMap(ArgumentMatchers.any())).thenReturn(mapMock);
this.spaceId = new SpaceID(UUID.randomUUID(), UUID.randomUUID(), OpenEventSpaceSpecification.class);
this.address = new Address(this.spaceId, this.agentId);
this.acl = Mockito.mock(Acl.class);
Mockito.when(this.acl.checkPermission(Mockito.any(), Mockito.any())).thenReturn(true);
this.permission = Mockito.mock(Permission.class);
this.space = new RestrictedAccessEventSpaceImpl(this.spaceId, this.acl, this.permission, this.service);
this.listener = Mockito.mock(EventListener.class);
Mockito.when(this.listener.getID()).thenReturn(this.agentId);
MockitoAnnotations.initMocks(this);
Mockito.when(this.executor.submit(Mockito.any(Runnable.class))).thenAnswer(new Answer<Future<?>>() {
@Override
public Future<?> answer(InvocationOnMock invocation) throws Throwable {
Runnable r = (Runnable) invocation.getArguments()[0];
r.run();
return null;
}
});
}
private void register() {
this.space.register(this.listener, Mockito.mock(Principal.class));
}
private void unregister() {
this.space.unregister(this.listener);
}
@Test
public void getAddressEventListener() {
assertNull(this.space.getAddress(this.listener));
register();
assertEquals(this.address, this.space.getAddress(this.listener));
unregister();
assertNull(this.space.getAddress(this.listener));
}
@Test
public void getAddressUUID() {
assertNull(this.space.getAddress(this.listener.getID()));
register();
assertEquals(this.address, this.space.getAddress(this.listener.getID()));
unregister();
assertNull(this.space.getAddress(this.listener.getID()));
}
@Test
public void getParticipants() {
Set<UUID> set;
set = this.space.getParticipants();
assertNotNull(set);
assertTrue(set.isEmpty());
register();
set = this.space.getParticipants();
assertNotNull(set);
assertEquals(1, set.size());
assertTrue(set.contains(this.listener.getID()));
unregister();
set = this.space.getParticipants();
assertNotNull(set);
assertTrue(set.isEmpty());
}
@Test
public void doEmit_fullscope() throws Exception {
Event event;
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.<Address> allParticipants());
Mockito.verifyZeroInteractions(this.listener);
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.<Address> allParticipants());
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertSame(event, argument.getValue());
unregister();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.<Address> allParticipants());
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertNotSame(event, argument.getValue());
}
@Test
public void doEmit_scopeaddress() throws Exception {
Event event;
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(this.address));
Mockito.verifyZeroInteractions(this.listener);
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(this.address));
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertSame(event, argument.getValue());
unregister();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(this.address));
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertNotSame(event, argument.getValue());
}
@Test
public void doEmit_scopeotheraddress() throws Exception {
Address otherAddress = new Address(new SpaceID(UUID.randomUUID(), UUID.randomUUID(), OpenEventSpaceSpecification.class),
UUID.randomUUID());
Event event;
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(otherAddress));
Mockito.verifyZeroInteractions(this.listener);
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(otherAddress));
Mockito.verify(this.listener, new Times(0)).receiveEvent(Mockito.any());
unregister();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(otherAddress));
Mockito.verify(this.listener, new Times(0)).receiveEvent(Mockito.any());
}
@Test
public void doEmit_scopebothaddresses() throws Exception {
Address otherAddress = new Address(new SpaceID(UUID.randomUUID(), UUID.randomUUID(), OpenEventSpaceSpecification.class),
UUID.randomUUID());
Event event;
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(this.address, otherAddress));
Mockito.verifyZeroInteractions(this.listener);
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(this.address, otherAddress));
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertSame(event, argument.getValue());
unregister();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.reflect.invoke(this.space, "doEmit", event, Scopes.addresses(this.address, otherAddress));
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertNotSame(event, argument.getValue());
}
@Test
public void emitEventScope_fullscope() throws Exception {
Event event;
Scope<Address> scope = Scopes.<Address> allParticipants();
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.space.emit(event, scope);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertSame(event, argument.getValue());
{
ArgumentCaptor<Scope> netscope = ArgumentCaptor.forClass(Scope.class);
ArgumentCaptor<Event> netarg = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.network).publish(netscope.capture(), netarg.capture());
assertSame(scope, netscope.getValue());
assertSame(event, netarg.getValue());
}
}
@Test
public void emitEventScope_scopeaddress() throws Exception {
Event event;
Scope<Address> scope = Scopes.addresses(this.address);
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.space.emit(event, scope);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertSame(event, argument.getValue());
{
ArgumentCaptor<Scope> netscope = ArgumentCaptor.forClass(Scope.class);
ArgumentCaptor<Event> netarg = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.network).publish(netscope.capture(), netarg.capture());
assertSame(scope, netscope.getValue());
assertSame(event, netarg.getValue());
}
}
@Test
public void emitEventScope_scopeotheraddress() throws Exception {
Address otherAddress = new Address(new SpaceID(UUID.randomUUID(), UUID.randomUUID(), OpenEventSpaceSpecification.class),
UUID.randomUUID());
Event event;
Scope<Address> scope = Scopes.addresses(otherAddress);
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.space.emit(event, scope);
Mockito.verify(this.listener, new Times(0)).receiveEvent(Mockito.any());
{
ArgumentCaptor<Scope> netscope = ArgumentCaptor.forClass(Scope.class);
ArgumentCaptor<Event> netarg = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.network).publish(netscope.capture(), netarg.capture());
assertSame(scope, netscope.getValue());
assertSame(event, netarg.getValue());
}
}
@Test
public void emitEventScope_scopebothaddresses() throws Exception {
Address otherAddress = new Address(new SpaceID(UUID.randomUUID(), UUID.randomUUID(), OpenEventSpaceSpecification.class),
UUID.randomUUID());
Event event;
Scope<Address> scope = Scopes.addresses(this.address, otherAddress);
register();
event = Mockito.mock(Event.class);
Mockito.when(event.getSource()).thenReturn(this.address);
this.space.emit(event, scope);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.listener).receiveEvent(argument.capture());
assertSame(event, argument.getValue());
{
ArgumentCaptor<Scope> netscope = ArgumentCaptor.forClass(Scope.class);
ArgumentCaptor<Event> netarg = ArgumentCaptor.forClass(Event.class);
Mockito.verify(this.network).publish(netscope.capture(), netarg.capture());
assertSame(scope, netscope.getValue());
assertSame(event, netarg.getValue());
}
}
}