package org.jvalue.ods.notifications.sender; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.android.gcm.server.Constants; import com.google.android.gcm.server.Message; import com.google.android.gcm.server.MulticastResult; import com.google.android.gcm.server.Result; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.jvalue.ods.api.notifications.GcmClient; import org.jvalue.ods.api.sources.DataSource; import java.io.IOException; import java.util.Arrays; import java.util.List; import mockit.Expectations; import mockit.Mocked; import mockit.Verifications; import mockit.integration.junit4.JMockit; @RunWith(JMockit.class) public final class GcmSenderTest { @Mocked private com.google.android.gcm.server.Sender gcmService; @Mocked private MulticastResult gcmMulticastResult; @Mocked private Result gcmResult; private final String sourceId = "someSourceId"; private final DataSource source = new DataSource(sourceId, null, null, null); private final String gcmDeviceId = "someGcmDeviceId"; private final GcmClient client = new GcmClient("someId", gcmDeviceId); private GcmSender sender; @Before public void setupSender() { sender = new GcmSender(source, client, gcmService); } @Test @SuppressWarnings("unchecked") public void testGcmSuccess() throws Exception { new Expectations() {{ gcmService.send((Message) any, (List) any, anyInt); result = gcmMulticastResult; gcmMulticastResult.getResults(); result = Arrays.asList(gcmResult); gcmResult.getMessageId(); result = "someMessageId"; }}; sender.onNewDataStart(); sender.onNewDataItem(new ObjectNode(JsonNodeFactory.instance)); sender.onNewDataComplete(); Assert.assertEquals(SenderResult.Status.SUCCESS, sender.getSenderResult().getStatus()); new Verifications() {{ Message message; List<String> devices; gcmService.send(message = withCapture(), devices = withCapture(), anyInt); Assert.assertEquals(sourceId, message.getCollapseKey()); Assert.assertEquals(sourceId, message.getData().get("source")); Assert.assertEquals(1, devices.size()); Assert.assertTrue(devices.contains(gcmDeviceId)); }}; } @Test @SuppressWarnings("unchecked") public void testGcmError() throws Exception { final IOException ioe = new IOException("boom"); new Expectations() {{ gcmService.send((Message) any, (List) any, anyInt); result = ioe; }}; sender.onNewDataComplete(); Assert.assertEquals(SenderResult.Status.ERROR, sender.getSenderResult().getStatus()); Assert.assertEquals(ioe, sender.getSenderResult().getErrorCause()); } @Test @SuppressWarnings("unchecked") public void testGcmUpdate() throws Exception { final String newDeviceId = "someNewDeviceId"; new Expectations() {{ gcmService.send((Message) any, (List) any, anyInt); result = gcmMulticastResult; gcmMulticastResult.getResults(); result = Arrays.asList(gcmResult); gcmResult.getMessageId(); result = "someMessageId"; gcmResult.getCanonicalRegistrationId(); result = newDeviceId; }}; sender.onNewDataComplete(); Assert.assertEquals(SenderResult.Status.UPDATE_CLIENT, sender.getSenderResult().getStatus()); Assert.assertEquals(newDeviceId, ((GcmClient) sender.getSenderResult().getNewClient()).getGcmClientId()); } @Test @SuppressWarnings("unchecked") public void testGcmRemove() throws Exception { new Expectations() {{ gcmService.send((Message) any, (List) any, anyInt); result = gcmMulticastResult; gcmMulticastResult.getResults(); result = Arrays.asList(gcmResult); gcmResult.getErrorCodeName(); result = Constants.ERROR_NOT_REGISTERED; }}; sender.onNewDataComplete(); Assert.assertEquals(SenderResult.Status.REMOVE_CLIENT, sender.getSenderResult().getStatus()); } }