/*
* $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.services;
import static org.junit.Assert.assertSame;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.util.concurrent.Service;
import com.google.common.util.concurrent.Service.State;
import io.janusproject.services.IServiceManager;
import io.janusproject.services.Services;
import io.janusproject.services.contextspace.ContextSpaceService;
import io.janusproject.services.executor.ExecutorService;
import io.janusproject.services.kerneldiscovery.KernelDiscoveryService;
import io.janusproject.services.logging.LogService;
import io.janusproject.services.network.NetworkService;
import io.janusproject.services.spawn.SpawnService;
import io.janusproject.tests.testutils.AbstractJanusTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import io.sarl.tests.api.Nullable;
/**
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
@SuppressWarnings("all")
public class ServicesTest extends AbstractJanusTest {
@Nullable
private Multimap<State, Service> services;
@Nullable
private IServiceManager serviceManager;
@Nullable
private List<Service> encounteredServices;
@Nullable
private ContextSpaceService s1;
@Nullable
private ExecutorService s2;
@Nullable
private KernelDiscoveryService s3;
@Nullable
private LogService s4;
@Nullable
private NetworkService s5;
@Nullable
private SpawnService s6;
@Before
public void setUp() {
this.encounteredServices = new LinkedList<>();
this.services = LinkedListMultimap.create();
this.s1 = Mockito.mock(ContextSpaceService.class, "s1"); //$NON-NLS-1$
this.s2 = Mockito.mock(ExecutorService.class, "s2"); //$NON-NLS-1$
this.s3 = Mockito.mock(KernelDiscoveryService.class, "s3"); //$NON-NLS-1$
this.s4 = Mockito.mock(LogService.class, "s4"); //$NON-NLS-1$
this.s5 = Mockito.mock(NetworkService.class, "s5"); //$NON-NLS-1$
this.s6 = Mockito.mock(SpawnService.class, "s6"); //$NON-NLS-1$
Mockito.when(this.s1.startAsync()).thenAnswer(new EncounteredServiceAnswer(this.s1));
Mockito.when(this.s1.stopAsync()).thenAnswer(new EncounteredServiceAnswer(this.s1));
Mockito.when(this.s1.getServiceType()).thenReturn((Class) ContextSpaceService.class);
Mockito.when(this.s1.getServiceDependencies())
.thenReturn(Arrays.<Class<? extends Service>>asList(NetworkService.class, KernelDiscoveryService.class));
Mockito.when(this.s1.getServiceWeakDependencies()).thenReturn(Arrays.<Class<? extends Service>>asList());
this.services.put(State.NEW, this.s1);
Mockito.when(this.s2.startAsync()).thenAnswer(new EncounteredServiceAnswer(this.s2));
Mockito.when(this.s2.stopAsync()).thenAnswer(new EncounteredServiceAnswer(this.s2));
Mockito.when(this.s2.getServiceType()).thenReturn((Class) ExecutorService.class);
Mockito.when(this.s2.getServiceDependencies()).thenReturn(Arrays.<Class<? extends Service>>asList());
Mockito.when(this.s2.getServiceWeakDependencies()).thenReturn(Arrays.<Class<? extends Service>>asList());
this.services.put(State.NEW, this.s2);
Mockito.when(this.s3.startAsync()).thenAnswer(new EncounteredServiceAnswer(this.s3));
Mockito.when(this.s3.stopAsync()).thenAnswer(new EncounteredServiceAnswer(this.s3));
Mockito.when(this.s3.getServiceType()).thenReturn((Class) KernelDiscoveryService.class);
Mockito.when(this.s3.getServiceDependencies())
.thenReturn(Arrays.<Class<? extends Service>>asList(LogService.class, ExecutorService.class));
Mockito.when(this.s3.getServiceWeakDependencies()).thenReturn(Arrays.<Class<? extends Service>>asList());
this.services.put(State.NEW, this.s3);
Mockito.when(this.s4.startAsync()).thenAnswer(new EncounteredServiceAnswer(this.s4));
Mockito.when(this.s4.stopAsync()).thenAnswer(new EncounteredServiceAnswer(this.s4));
Mockito.when(this.s4.getServiceType()).thenReturn((Class) LogService.class);
Mockito.when(this.s4.getServiceDependencies()).thenReturn(Arrays.<Class<? extends Service>>asList());
Mockito.when(this.s4.getServiceWeakDependencies()).thenReturn(Arrays.<Class<? extends Service>>asList());
this.services.put(State.NEW, this.s4);
Mockito.when(this.s5.startAsync()).thenAnswer(new EncounteredServiceAnswer(this.s5));
Mockito.when(this.s5.stopAsync()).thenAnswer(new EncounteredServiceAnswer(this.s5));
Mockito.when(this.s5.getServiceType()).thenReturn((Class) NetworkService.class);
Mockito.when(this.s5.getServiceDependencies())
.thenReturn(Arrays.<Class<? extends Service>>asList(LogService.class, ExecutorService.class));
Mockito.when(this.s5.getServiceWeakDependencies())
.thenReturn(Arrays.<Class<? extends Service>>asList(KernelDiscoveryService.class));
this.services.put(State.NEW, this.s5);
Mockito.when(this.s6.startAsync()).thenAnswer(new EncounteredServiceAnswer(this.s6));
Mockito.when(this.s6.stopAsync()).thenAnswer(new EncounteredServiceAnswer(this.s6));
Mockito.when(this.s6.getServiceType()).thenReturn((Class) SpawnService.class);
Mockito.when(this.s6.getServiceDependencies())
.thenReturn(Arrays.<Class<? extends Service>>asList(ContextSpaceService.class));
Mockito.when(this.s6.getServiceWeakDependencies()).thenReturn(Arrays.<Class<? extends Service>>asList());
this.services.put(State.NEW, this.s6);
for (int i = 0; i < 10; ++i) {
Service serv = Mockito.mock(Service.class);
Mockito.when(serv.startAsync()).thenAnswer(new EncounteredServiceAnswer(serv));
Mockito.when(serv.stopAsync()).thenAnswer(new EncounteredServiceAnswer(serv));
this.services.put(State.NEW, serv);
}
this.serviceManager = Mockito.mock(IServiceManager.class);
Mockito.when(this.serviceManager.servicesByState()).thenReturn(this.services);
}
@Test
public void startServices() {
Services.startServices(this.serviceManager);
// s1 : ContextSpace -> Network, KernelDiscovery
// s2 : Executor ->
// s3 : KernelDiscovery -> Log, Executor
// s4 : Log ->
// s5 : Network -> Log, Executor, KernelDiscovery
// s6 : Spawn -> ContextSpace
// Executor(s2)
// Log(s4)
// KernelDiscovery(s3)
// Network(s5)
// ContextSpace(s1)
// Spawn(s6)
assertEquals(16, this.encounteredServices.size());
assertSame(this.s2, this.encounteredServices.get(0));
assertSame(this.s4, this.encounteredServices.get(1));
assertSame(this.s3, this.encounteredServices.get(2));
assertSame(this.s5, this.encounteredServices.get(3));
assertSame(this.s1, this.encounteredServices.get(4));
assertSame(this.s6, this.encounteredServices.get(5));
}
@Test
public void stopServices() {
Services.stopServices(this.serviceManager);
// s1 : ContextSpace -> Network, KernelDiscovery
// s2 : Executor ->
// s3 : KernelDiscovery -> Log, Executor
// s4 : Log ->
// s5 : Network -> Log, Executor, KernelDiscovery
// s6 : Spawn -> ContextSpace
// Executor(s2)
// Log(s4)
// KernelDiscovery(s3)
// Network(s5)
// ContextSpace(s1)
// Spawn(s6)
assertEquals(16, this.encounteredServices.size());
assertSame(this.s6, this.encounteredServices.get(10));
assertSame(this.s1, this.encounteredServices.get(11));
assertSame(this.s5, this.encounteredServices.get(12));
assertSame(this.s3, this.encounteredServices.get(13));
assertSame(this.s4, this.encounteredServices.get(14));
assertSame(this.s2, this.encounteredServices.get(15));
}
/**
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
private class EncounteredServiceAnswer implements Answer<Service> {
private final Service service;
/**
* @param service
*/
EncounteredServiceAnswer(Service service) {
this.service = service;
}
/**
* {@inheritDoc}
*/
@Override
public Service answer(InvocationOnMock invocation) throws Throwable {
ServicesTest.this.encounteredServices.add(this.service);
return this.service;
}
}
}