/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.log.internal;
import static org.junit.Assert.assertEquals;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import de.rcenvironment.core.communication.api.CommunicationService;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.common.NodeIdentifierTestUtils;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.communication.testutils.CommunicationServiceDefaultStub;
import de.rcenvironment.core.log.RemotableLogReaderService;
import de.rcenvironment.core.log.SerializableLogEntry;
import de.rcenvironment.core.log.SerializableLogListener;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Test cases for {@link DistributedLogReaderServiceImpl}.
*
* @author Doreen Seider
* @author Robert Mischke (7.0.0 adaptations; 8.0.0 id adaptations)
*/
// TODO consider replacing this with a VirtualInstance test for more realistic service behavior - misc_ro
public class DistributedLogReaderServiceImplTest {
private final String removed = "removed";
private final String added = "added";
private final InstanceNodeSessionId instanceIdLocal = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("local");
private final InstanceNodeSessionId instanceIdRemote = NodeIdentifierTestUtils.createTestInstanceNodeSessionIdWithDisplayName("remote");
private final InstanceNodeSessionId instanceIdNotReachable = NodeIdentifierTestUtils
.createTestInstanceNodeSessionIdWithDisplayName("notReachable");
private final SerializableLogEntry localLogEntry = EasyMock.createNiceMock(SerializableLogEntry.class);
private final SerializableLogEntry remoteLogEntry = EasyMock.createNiceMock(SerializableLogEntry.class);
private final SerializableLogListener logListener = new SerializableLogListener() {
private static final long serialVersionUID = 1L;
@Override
public void logged(SerializableLogEntry entry) {}
@Override
public Class<? extends Serializable> getInterface() {
return SerializableLogListener.class;
}
};
private BundleContext context = EasyMock.createNiceMock(BundleContext.class);
private DistributedLogReaderServiceImpl logReader = new DistributedLogReaderServiceImpl();
/** Set up method. */
@Before
public void setUp() {
logReader.bindCommunicationService(new DummyCommunicationService());
logReader.activate(context);
}
/** Test. */
@Test
public void testAddListener() {
logReader.addLogListener(logListener, instanceIdLocal);
logReader.addLogListener(logListener, instanceIdRemote);
logReader.addLogListener(logListener, instanceIdNotReachable);
}
/** Test. */
@Test
public void testGetLog() {
List<SerializableLogEntry> entries = logReader.getLog(instanceIdLocal);
assertEquals(localLogEntry, entries.get(0));
assertEquals(1, entries.size());
entries = logReader.getLog(instanceIdRemote);
assertEquals(remoteLogEntry, entries.get(0));
assertEquals(1, entries.size());
assertEquals(0, logReader.getLog(instanceIdNotReachable).size());
}
/** Test. */
@Test
public void testRemoveListener() {
logReader.removeLogListener(logListener, instanceIdLocal);
logReader.removeLogListener(logListener, instanceIdRemote);
logReader.removeLogListener(logListener, instanceIdNotReachable);
}
/**
* Test {@link CommunicationService} implementation.
*
* @author Doreen Seider
*/
private class DummyCommunicationService extends CommunicationServiceDefaultStub {
@SuppressWarnings("unchecked")
@Override
public <T> T getRemotableService(Class<T> iface, ResolvableNodeId nodeId) {
T service = null;
if (iface == RemotableLogReaderService.class && instanceIdLocal.equals(nodeId)) {
service = (T) new DummyLocalSerializableLogReaderService();
} else if (iface == RemotableLogReaderService.class && instanceIdRemote.equals(nodeId)) {
service = (T) new DummyRemoteSerializableLogReaderService();
} else if (iface == RemotableLogReaderService.class && instanceIdNotReachable.equals(nodeId)) {
service = (T) new DummyNotReachableSerializableLogReaderService();
}
return service;
}
}
/**
* Dummy local {@link RemotableLogReaderService} implementation.
*
* @author Doreen Seider
* @author Robert Mischke (7.0.0 adaptations)
*/
@SuppressWarnings("serial")
private class DummyLocalSerializableLogReaderService implements RemotableLogReaderService {
@Override
public void addLogListener(SerializableLogListener listener) throws RemoteOperationException {
if (listener == logListener) {
throw new RemoteOperationException(added);
}
}
@Override
public List<SerializableLogEntry> getLog() throws RemoteOperationException {
return new LinkedList<SerializableLogEntry>() {
{
add(localLogEntry);
}
};
}
@Override
public void removeLogListener(SerializableLogListener listener) throws RemoteOperationException {
if (listener == logListener) {
throw new RemoteOperationException(removed);
}
}
}
/**
* Dummy remote {@link RemotableLogReaderService} implementation.
*
* @author Doreen Seider
* @author Robert Mischke (7.0.0 adaptations)
*/
@SuppressWarnings("serial")
private class DummyRemoteSerializableLogReaderService implements RemotableLogReaderService {
@Override
public void addLogListener(SerializableLogListener listener) {}
@Override
public List<SerializableLogEntry> getLog() {
return new LinkedList<SerializableLogEntry>() {
{
add(remoteLogEntry);
}
};
}
@Override
public void removeLogListener(SerializableLogListener listener) {}
}
/**
* Dummy not reachable {@link RemotableLogReaderService} implementation.
*
* @author Doreen Seider
* @author Robert Mischke (7.0.0 adaptations)
*/
@SuppressWarnings("serial")
private class DummyNotReachableSerializableLogReaderService implements RemotableLogReaderService {
private static final String NOT_REACHABLE = "node unreachable";
@Override
public void addLogListener(SerializableLogListener listener) throws RemoteOperationException {
throw new RemoteOperationException(NOT_REACHABLE);
}
@Override
public List<SerializableLogEntry> getLog() throws RemoteOperationException {
throw new RemoteOperationException(NOT_REACHABLE);
}
@Override
public void removeLogListener(SerializableLogListener listener) throws RemoteOperationException {
throw new RemoteOperationException(NOT_REACHABLE);
}
}
}