package io.vivarium.net; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import org.junit.Test; import org.junit.experimental.categories.Category; import org.mockito.ArgumentCaptor; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.johnuckele.vtest.Tester; import io.vivarium.net.messages.Message; import io.vivarium.test.FastTest; import io.vivarium.test.UnitTest; import io.vivarium.util.UUID; public class NetworkModuleTest { @Test @Category({ FastTest.class, UnitTest.class }) @SuppressWarnings("unchecked") public void testAddMessageListener() throws Exception { // Build a network module InboundNetworkListener inboundNetworkListener = mock(InboundNetworkListener.class); ObjectMapper objectMapper = new ObjectMapper(); NetworkModule networkModule = new ServerNetworkModule(inboundNetworkListener, objectMapper); // Build and set up the message listener MessageListener<TestMessage> listener = mock(MessageListener.class); networkModule.addMessageListener(listener, TestMessage.class); // Send the message to the network module Message message = new TestMessage(UUID.randomUUID()); networkModule.onMessage(null, objectMapper.writeValueAsString(message)); // Verify that the listener was called ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); verify(listener).onMessage(eq(null), argument.capture()); assertEquals(message.getClass(), argument.getValue().getClass()); assertEquals(message.getMessageID(), argument.getValue().getMessageID()); Tester.pass("The above code should execute without problems."); } @Test @Category({ FastTest.class, UnitTest.class }) @SuppressWarnings("unchecked") public void testAddRemoveMessageListener() throws Exception { // Build a network module InboundNetworkListener inboundNetworkListener = mock(InboundNetworkListener.class); ObjectMapper objectMapper = new ObjectMapper(); NetworkModule networkModule = new ServerNetworkModule(inboundNetworkListener, objectMapper); // Build and set up the message listener MessageListener<TestMessage> listener = mock(MessageListener.class); networkModule.addMessageListener(listener, TestMessage.class); // Remove the message listener networkModule.removeMessageListener(listener, TestMessage.class); // Send the message to the network module Message message = new TestMessage(UUID.randomUUID()); networkModule.onMessage(null, objectMapper.writeValueAsString(message)); // Verify that the listener was not called ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); verify(listener, never()).onMessage(eq(null), argument.capture()); Tester.pass("The above code should execute without problems."); } @Test @Category({ FastTest.class, UnitTest.class }) @SuppressWarnings("unchecked") public void testRemoveMessageListener() throws Exception { // Build a network module InboundNetworkListener inboundNetworkListener = mock(InboundNetworkListener.class); ObjectMapper objectMapper = new ObjectMapper(); NetworkModule networkModule = new ServerNetworkModule(inboundNetworkListener, objectMapper); // Build the message listener MessageListener<TestMessage> listener = mock(MessageListener.class); // Remove the message listener without adding it networkModule.removeMessageListener(listener, TestMessage.class); // Send the message to the network module Message message = new TestMessage(UUID.randomUUID()); networkModule.onMessage(null, objectMapper.writeValueAsString(message)); // Verify that the listener was not called ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); verify(listener, never()).onMessage(eq(null), argument.capture()); Tester.pass("The above code should execute without problems."); } @Test @Category({ FastTest.class, UnitTest.class }) @SuppressWarnings("unchecked") public void testSubclassListenerDoesNotGetCalled() throws Exception { // Build a network module InboundNetworkListener inboundNetworkListener = mock(InboundNetworkListener.class); ObjectMapper objectMapper = new ObjectMapper(); NetworkModule networkModule = new ServerNetworkModule(inboundNetworkListener, objectMapper); // Build and set up the message listener MessageListener<AdvancedTestMessage> listener = mock(MessageListener.class); networkModule.addMessageListener(listener, AdvancedTestMessage.class); // Send the message to the network module Message message = new TestMessage(UUID.randomUUID()); networkModule.onMessage(null, objectMapper.writeValueAsString(message)); // Verify that the listener was not called ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); verify(listener, never()).onMessage(eq(null), argument.capture()); Tester.pass("The above code should execute without problems."); } @Test @Category({ FastTest.class, UnitTest.class }) @SuppressWarnings("unchecked") public void testSuperclassListenerDoesGetCalled() throws Exception { // Build a network module InboundNetworkListener inboundNetworkListener = mock(InboundNetworkListener.class); ObjectMapper objectMapper = new ObjectMapper(); NetworkModule networkModule = new ServerNetworkModule(inboundNetworkListener, objectMapper); // Build and set up the message listener MessageListener<TestMessage> listener = mock(MessageListener.class); networkModule.addMessageListener(listener, TestMessage.class); // Send the message to the network module AdvancedTestMessage message = new AdvancedTestMessage(UUID.randomUUID()); networkModule.onMessage(null, objectMapper.writeValueAsString(message)); // Verify that the listener was called ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); verify(listener).onMessage(eq(null), argument.capture()); assertEquals(message.getClass(), argument.getValue().getClass()); assertEquals(message.getMessageID(), argument.getValue().getMessageID()); Tester.pass("The above code should execute without problems."); } private static class TestMessage extends Message { @JsonCreator protected TestMessage(@JsonProperty("messageID") @JsonSerialize(using = UUIDSerializer.class) UUID messageID) { super(messageID); } } private static class AdvancedTestMessage extends TestMessage { @JsonCreator protected AdvancedTestMessage( @JsonProperty("messageID") @JsonSerialize(using = UUIDSerializer.class) UUID messageID) { super(messageID); } } }