/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.notification.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.Serializable;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
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.ResolvableNodeId;
import de.rcenvironment.core.communication.testutils.CommunicationServiceDefaultStub;
import de.rcenvironment.core.notification.Notification;
import de.rcenvironment.core.notification.NotificationHeader;
import de.rcenvironment.core.notification.NotificationService;
import de.rcenvironment.core.notification.NotificationSubscriber;
import de.rcenvironment.core.notification.NotificationTestConstants;
import de.rcenvironment.core.notification.api.RemotableNotificationService;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Test cases for {@link DistributedNotificationServiceImpl}.
*
* @author Doreen Seider
* @author Robert Mischke (adapted for 7.0.0; 8.0.0 id adaptations)
*/
public class DistributedNotificationServiceTest {
private static final String EXPECTED_EXCEPTION = "Expected exception because of DummyRemoteNotificationService";
private static final String EXPECTED_EXCEPTION_FAILING = "Expected exception not thrown by DummyRemoteNotificationService";
private DistributedNotificationServiceImpl notificationService;
private Notification remoteNotification = new Notification("identifier", 0, NotificationTestConstants.REMOTE_INSTANCE_SESSION,
new String());
private Notification anotherRemoteNotification = new Notification("id", 0, NotificationTestConstants.REMOTE_INSTANCE_SESSION,
new String());
private Map<String, List<Notification>> notifications = new HashMap<String, List<Notification>>();
private Map<String, SortedSet<NotificationHeader>> headers = new HashMap<String, SortedSet<NotificationHeader>>();
private Map<String, List<Notification>> remoteNotifications = new HashMap<String, List<Notification>>();;
private Map<String, SortedSet<NotificationHeader>> remoteHeaders = new HashMap<String, SortedSet<NotificationHeader>>();
private BundleContext context = EasyMock.createNiceMock(BundleContext.class);
/** Inject the notification service before the test methods run. */
@Before
public void initialize() {
notificationService = new DistributedNotificationServiceImpl();
notificationService.bindNotificationService(new DummyLocalNotificationService());
notificationService.bindCommunicationService(new DummyCommunicationService());
notificationService.activate(context);
}
/** Test. */
@Test
public void testRemovePublisher() {
try {
notificationService.removePublisher(NotificationTestConstants.NOTIFICATION_ID);
} catch (RuntimeException e) {
assertEquals("deregistered", e.getMessage());
}
}
/** Test. */
@Test
public void testSetBufferSize() {
try {
notificationService.setBufferSize(NotificationTestConstants.NOTIFICATION_ID, 0);
} catch (RuntimeException e) {
assertEquals("registered with buffer", e.getMessage());
}
}
/**
* Test.
*
* @throws RemoteOperationException on error
*/
@Test
public void testGetNotifications() throws RemoteOperationException {
assertEquals(notifications, notificationService.getNotifications(NotificationTestConstants.NOTIFICATION_ID,
NotificationTestConstants.LOCAL_INSTANCE_SESSION));
assertEquals(remoteNotifications,
notificationService.getNotifications(remoteNotification.getHeader().getNotificationIdentifier(),
NotificationTestConstants.REMOTE_INSTANCE_SESSION));
try {
notificationService.getNotifications(NotificationTestConstants.NOTIFICATION_ID,
NotificationTestConstants.REMOTE_INSTANCE_SESSION);
fail(EXPECTED_EXCEPTION_FAILING);
} catch (IllegalStateException e) {
assertTrue(EXPECTED_EXCEPTION, true);
}
}
/** Test. */
@Test
public void testSend() {
try {
notificationService.send(NotificationTestConstants.NOTIFICATION_ID,
NotificationTestConstants.NOTIFICATION.getBody());
} catch (RuntimeException e) {
assertEquals("sent", e.getMessage());
}
}
/**
* Test.
*
* @throws RemoteOperationException on unexpected failure
*/
@Test
public void testSubscribe() throws RemoteOperationException {
assertNotNull(notificationService.subscribe(NotificationTestConstants.NOTIFICATION_ID,
NotificationTestConstants.NOTIFICATION_SUBSCRIBER,
NotificationTestConstants.LOCAL_INSTANCE_SESSION));
}
/**
* Test.
*/
@Test
public void testUnsubscribeFailureWithoutSubscription() {
try {
notificationService.unsubscribe(NotificationTestConstants.NOTIFICATION_ID,
NotificationTestConstants.NOTIFICATION_SUBSCRIBER,
NotificationTestConstants.LOCAL_INSTANCE_SESSION);
fail("Expected exception");
} catch (RemoteOperationException e) {
final String expectedMessage =
"Failed to unsubscribe from publisher \"local\" ["
+ NotificationTestConstants.LOCAL_INSTANCE_SESSION.getInstanceNodeSessionIdString()
+ "]: unsubscribed";
assertEquals(expectedMessage, e.getMessage());
}
}
/**
* Test {@link NotificationService}.
*
* TODO Don't throw exception for test purposes. - seid_do
*
* @author Doreen Seider
*/
class DummyLocalNotificationService implements NotificationService {
@Override
public void removePublisher(String notificationIdentifier) {
throw new RuntimeException("deregistered");
}
@Override
public Notification getNotification(NotificationHeader header) {
if (header.equals(NotificationTestConstants.NOTIFICATION_HEADER)) {
return NotificationTestConstants.NOTIFICATION;
} else {
return null;
}
}
@Override
public Map<String, SortedSet<NotificationHeader>> getNotificationHeaders(String notificationIdentifier) {
if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID)) {
return headers;
} else {
return null;
}
}
@Override
public Map<String, List<Notification>> getNotifications(String notificationIdentifier) {
if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID)) {
return notifications;
} else {
return null;
}
}
@Override
public void setBufferSize(String notificationIdentifier, int buffer) {
if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID) && buffer == 0) {
throw new RuntimeException("registered with buffer");
}
}
@Override
public void send(String notificationIdentifier, Serializable notificationBody) {
if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID)
&& notificationBody.equals(NotificationTestConstants.NOTIFICATION.getBody())) {
throw new RuntimeException("sent");
}
}
@Override
public Map<String, Long> subscribe(String notificationIdentifier, NotificationSubscriber subscriber) {
if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID)
&& subscriber.equals(NotificationTestConstants.NOTIFICATION_SUBSCRIBER)) {
return new HashMap<String, Long>();
}
return null;
}
@Override
public void unsubscribe(String notificationIdentifier, NotificationSubscriber subscriber) {
if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID)
&& subscriber.equals(NotificationTestConstants.NOTIFICATION_SUBSCRIBER)) {
throw new RuntimeException("unsubscribed");
}
}
}
/**
* Test {@link NotificationService} implementation.
*
* @author Doreen Seider
*/
class DummyRemoteNotificationService implements NotificationService {
@Override
public void removePublisher(String notificationIdentifier) {}
@Override
public Notification getNotification(NotificationHeader header) {
if (header.equals(remoteNotification.getHeader())) {
return remoteNotification;
} else if (header.equals(anotherRemoteNotification.getHeader())) {
throw new UndeclaredThrowableException(new RuntimeException());
} else {
return null;
}
}
@Override
public Map<String, SortedSet<NotificationHeader>> getNotificationHeaders(String notificationIdentifier) {
if (notificationIdentifier.equals(remoteNotification.getHeader().getNotificationIdentifier())) {
return remoteHeaders;
} else if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID)) {
throw new UndeclaredThrowableException(new RuntimeException());
} else {
return null;
}
}
@Override
public Map<String, List<Notification>> getNotifications(String notificationIdentifier) {
if (notificationIdentifier.equals(remoteNotification.getHeader().getNotificationIdentifier())) {
return remoteNotifications;
} else if (notificationIdentifier.equals(NotificationTestConstants.NOTIFICATION_ID)) {
throw new IllegalStateException();
} else {
return null;
}
}
@Override
public void setBufferSize(String notificationIdentifier, int buffer) {}
@Override
public void send(String notificationIdentifier, Serializable notificationBody) {}
@Override
public Map<String, Long> subscribe(String notificationIdentifier, NotificationSubscriber subscriber) {
Map<String, Long> numbers = new HashMap<String, Long>();
numbers.put(notificationIdentifier, new Long(5));
return numbers;
}
@Override
public void unsubscribe(String notificationIdentifier, NotificationSubscriber subscriber) {}
}
/**
* Test {@link CommunicationService} implementation.
*
* @author Doreen Seider
* @author Robert Mischke (adapted for 7.0.0)
*/
class DummyCommunicationService extends CommunicationServiceDefaultStub {
@Override
@SuppressWarnings("unchecked")
public <T> T getRemotableService(Class<T> iface, ResolvableNodeId nodeId) {
if (iface == RemotableNotificationService.class
&& nodeId.equals(NotificationTestConstants.LOCAL_INSTANCE_SESSION)) {
return (T) new DummyLocalNotificationService();
} else if (iface == RemotableNotificationService.class
&& nodeId.equals(NotificationTestConstants.REMOTE_INSTANCE_SESSION)) {
return (T) new DummyRemoteNotificationService();
} else {
return null;
}
}
}
}