package com.workshare.msnos.core;
import static com.workshare.msnos.core.CoreHelper.createMockCloud;
import static com.workshare.msnos.core.MessagesHelper.newPingMessage;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.concurrent.Executor;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import com.workshare.msnos.core.Message.Status;
import com.workshare.msnos.core.receipts.SingleReceipt;
import com.workshare.msnos.core.routing.Router;
public class SenderTest {
private Cloud cloud;
private Sender sender;
private Router router;
private Executor executor;
@Before
public void before() throws Exception {
cloud = createMockCloud();
router = mock(Router.class);
executor = mock(Executor.class);
sender = new Sender(router, executor);
}
@Test
public void shouldSendMessagesTroughRouter() throws Exception {
Message message = newPingMessage(cloud);
when(router.send(any(Message.class))).thenReturn(SingleReceipt.failure(message));
sendAndWait(message);
verifyMessageSent(message);
}
@Test
public void shouldDecreaseHopsBeforeSending() throws Exception {
Message message = newPingMessage(cloud);
when(router.send(any(Message.class))).thenReturn(SingleReceipt.failure(message));
sendAndWait(message);
int expectedHops = message.getHops()-1;
assertEquals(expectedHops, verifyMessageSent(message).getHops());
}
@Test
public void shouldUpdateReceiptStatusAndGatewayWithRouterResult() throws Exception {
final Message message = newPingMessage(cloud);
final Receipt routerReceipt = createReceipt("FOO", Status.DELIVERED, message);
when(router.send(any(Message.class))).thenReturn(routerReceipt);
Receipt receipt = sendAndWait(message);
assertEquals("FOO", receipt.getGate());
assertEquals(Status.DELIVERED, receipt.getStatus());
assertEquals(message.getUuid(), receipt.getMessageUuid());
}
private Message verifyMessageSent(final Message message) throws IOException {
ArgumentCaptor<Message> runnableCaptor = ArgumentCaptor.forClass(Message.class);
verify(router).send(runnableCaptor.capture());
Message captured = runnableCaptor.getValue();
assertEquals(message.getUuid(), captured.getUuid());
return captured;
}
private Receipt sendAndWait(Message message) throws MsnosException {
Receipt receipt = sender.send(cloud, message);
ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
verify(executor).execute(runnableCaptor.capture());
runnableCaptor.getValue().run();
return receipt;
}
private Receipt createReceipt(String gateName, Status status, Message message) throws Exception {
Gateway gate = mock(Gateway.class);
when(gate.name()).thenReturn(gateName);
return new SingleReceipt(gate, status, message);
}
}