/respokeSDKTest/src/androidTest/java/com/digium/respokesdktest/unit/RespokeEndpointTests.java

https://github.com/respoke/respoke-sdk-android · Java · 257 lines · 173 code · 68 blank · 16 comment · 8 complexity · 2e37f08e253510b876e8fca3df1b1476 MD5 · raw file

  1. /**
  2. * Copyright 2015, Digium, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under The MIT License found in the
  6. * LICENSE file in the root directory of this source tree.
  7. *
  8. * For all details and documentation: https://www.respoke.io
  9. */
  10. package com.digium.respokesdktest.unit;
  11. import android.app.Application;
  12. import android.test.ApplicationTestCase;
  13. import com.digium.respokesdk.Respoke;
  14. import com.digium.respokesdk.RespokeCall;
  15. import com.digium.respokesdk.RespokeClient;
  16. import com.digium.respokesdk.RespokeConnection;
  17. import com.digium.respokesdk.RespokeDirectConnection;
  18. import com.digium.respokesdk.RespokeEndpoint;
  19. import com.digium.respokesdktest.RespokeTestCase;
  20. import java.util.ArrayList;
  21. import java.util.Date;
  22. import java.util.Dictionary;
  23. import java.util.Enumeration;
  24. import java.util.HashMap;
  25. import java.util.concurrent.CountDownLatch;
  26. import java.util.concurrent.TimeUnit;
  27. public class RespokeEndpointTests extends RespokeTestCase implements RespokeEndpoint.Listener, RespokeClient.ResolvePresenceListener {
  28. private boolean callbackDidSucceed;
  29. private RespokeEndpoint presenceTestEndpoint;
  30. private Object callbackPresence;
  31. private Object customPresenceResolution;
  32. private static final String TEST_MESSAGE = "This is a test message!";
  33. public void testUnconnectedEndpointBehavior() {
  34. RespokeClient client = Respoke.sharedInstance().createClient(getContext());
  35. assertNotNull(client);
  36. assertNull("Should return nil if no endpoint exists", client.getEndpoint("someEndpointID", true));
  37. RespokeEndpoint endpoint = client.getEndpoint("someEndpointID", false);
  38. assertNotNull("Should create an endpoint instance if it does not exist and it so commanded to", endpoint);
  39. assertEquals("Should have the correct endpoint ID", "someEndpointID", endpoint.getEndpointID());
  40. ArrayList<RespokeConnection> connections = endpoint.getConnections();
  41. assertNotNull("Should return an empty list of connections when not connected", connections);
  42. assertTrue("Should return an empty list of connections when not connected", 0 == connections.size());
  43. callbackDidSucceed = false;
  44. asyncTaskDone = false;
  45. endpoint.sendMessage("Hi there!", false, true, new Respoke.TaskCompletionListener(){
  46. @Override
  47. public void onSuccess() {
  48. assertTrue("Should not call success handler", false);
  49. asyncTaskDone = true;
  50. }
  51. @Override
  52. public void onError(String errorMessage) {
  53. assertTrue("Should be called in UI thread", RespokeTestCase.currentlyOnUIThread());
  54. callbackDidSucceed = true;
  55. assertEquals("Can't complete request when not connected. Please reconnect!", errorMessage);
  56. asyncTaskDone = true;
  57. }
  58. });
  59. assertTrue("Test timed out", waitForCompletion(RespokeTestCase.TEST_TIMEOUT));
  60. assertTrue("Should call error handler", callbackDidSucceed);
  61. assertNull("Should not create a call object when not connected", endpoint.startCall(null, getContext(), null,false));
  62. }
  63. public void testPresence() {
  64. RespokeClient client = Respoke.sharedInstance().createClient(getContext());
  65. assertNotNull(client);
  66. assertNull("Should return nil if no endpoint exists", client.getEndpoint("someEndpointID", true));
  67. presenceTestEndpoint = client.getEndpoint("someEndpointID", false);
  68. assertNotNull("Should create an endpoint instance if it does not exist and it so commanded to", presenceTestEndpoint);
  69. presenceTestEndpoint.setListener(this);
  70. assertNull("Presence should initially be null", presenceTestEndpoint.presence);
  71. // Test presence with no connections
  72. callbackDidSucceed = false;
  73. callbackPresence = null;
  74. asyncTaskDone = false;
  75. presenceTestEndpoint.resolvePresence();
  76. assertTrue("Test timed out", waitForCompletion(RespokeTestCase.TEST_TIMEOUT));
  77. assertTrue("Presence delegate should be called", callbackDidSucceed);
  78. assertTrue("Should resolve to the correct presence value", "unavailable".equals(callbackPresence));
  79. // Test presence with one connection
  80. RespokeConnection connection = new RespokeConnection(Respoke.makeGUID(), presenceTestEndpoint);
  81. assertNotNull("Should create connection", connection);
  82. assertNull("Presence should initially be null", connection.presence);
  83. presenceTestEndpoint.connections.add(connection);
  84. callbackDidSucceed = false;
  85. callbackPresence = null;
  86. asyncTaskDone = false;
  87. presenceTestEndpoint.resolvePresence();
  88. assertTrue("Test timed out", waitForCompletion(RespokeTestCase.TEST_TIMEOUT));
  89. assertTrue("Presence delegate should be called", callbackDidSucceed);
  90. assertTrue("Should resolve to the correct presence value", "unavailable".equals(callbackPresence));
  91. ArrayList<String> options = new ArrayList<String>();
  92. options.add("chat");
  93. options.add("available");
  94. options.add("away");
  95. options.add("dnd");
  96. options.add("xa");
  97. options.add("unavailable");
  98. for (String eachPresence : options) {
  99. connection.presence = eachPresence;
  100. callbackDidSucceed = false;
  101. callbackPresence = null;
  102. asyncTaskDone = false;
  103. presenceTestEndpoint.resolvePresence();
  104. assertTrue("Test timed out", waitForCompletion(RespokeTestCase.TEST_TIMEOUT));
  105. assertTrue("Presence listener should be called", callbackDidSucceed);
  106. assertTrue("Expected presence to be [" + eachPresence + "] but found [" + callbackPresence + "]", eachPresence.equals(connection.presence));
  107. assertTrue("Resolved endpoint presence should match the connections", eachPresence.equals(presenceTestEndpoint.presence));
  108. }
  109. // Test presence with 2 connections
  110. RespokeConnection secondConnection = new RespokeConnection(Respoke.makeGUID(), presenceTestEndpoint);
  111. assertNotNull("Should create connection", secondConnection);
  112. assertNull("Presence should initially be null", secondConnection.presence);
  113. presenceTestEndpoint.connections.add(secondConnection);
  114. for (Integer ii = 0; ii < options.size(); ii++) {
  115. String firstPresence = options.get(ii);
  116. for (Integer jj = 0; jj < options.size(); jj++) {
  117. String secondPresence = options.get(jj);
  118. connection.presence = firstPresence;
  119. secondConnection.presence = secondPresence;
  120. String expectedPresence = null;
  121. if (ii <= jj) {
  122. expectedPresence = firstPresence;
  123. } else {
  124. expectedPresence = secondPresence;
  125. }
  126. callbackDidSucceed = false;
  127. callbackPresence = null;
  128. asyncTaskDone = false;
  129. presenceTestEndpoint.resolvePresence();
  130. assertTrue("Test timed out", waitForCompletion(RespokeTestCase.TEST_TIMEOUT));
  131. assertTrue("Presence delegate should be called", callbackDidSucceed);
  132. assertTrue("Expected presence to be [" + expectedPresence + "] but found [" + callbackPresence + "]", expectedPresence.equals(callbackPresence));
  133. assertTrue("Resolved endpoint presence should match the connections", expectedPresence.equals(presenceTestEndpoint.presence));
  134. }
  135. }
  136. }
  137. public void testCustomPresence() {
  138. RespokeClient client = Respoke.sharedInstance().createClient(getContext());
  139. assertNotNull(client);
  140. client.setResolvePresenceListener(this);
  141. presenceTestEndpoint = client.getEndpoint("someEndpointID", false);
  142. assertNotNull("Should create an endpoint instance if it does not exist and it so commanded to", presenceTestEndpoint);
  143. presenceTestEndpoint.setListener(this);
  144. RespokeConnection connection1 = new RespokeConnection(Respoke.makeGUID(), presenceTestEndpoint);
  145. assertNotNull("Should create connection", connection1);
  146. presenceTestEndpoint.connections.add(connection1);
  147. RespokeConnection connection2 = new RespokeConnection(Respoke.makeGUID(), presenceTestEndpoint);
  148. assertNotNull("Should create connection", connection2);
  149. presenceTestEndpoint.connections.add(connection2);
  150. RespokeConnection connection3 = new RespokeConnection(Respoke.makeGUID(), presenceTestEndpoint);
  151. assertNotNull("Should create connection", connection3);
  152. presenceTestEndpoint.connections.add(connection3);
  153. // Test presence values that are not strings
  154. customPresenceResolution = new HashMap<String, String>();
  155. ((HashMap<String, String>)customPresenceResolution).put("myRealPresence", "ready");
  156. HashMap<String, String> connection1Presence = new HashMap<String, String>();
  157. connection1Presence.put("myRealPresence", "not ready");
  158. connection1.presence = connection1Presence;
  159. connection2.presence = customPresenceResolution;
  160. HashMap<String, String> connection3Presence = new HashMap<String, String>();
  161. connection3Presence.put("myRealPresence", "not ready");
  162. connection3.presence = connection3Presence;
  163. callbackDidSucceed = false;
  164. callbackPresence = null;
  165. presenceTestEndpoint.resolvePresence();
  166. assertTrue("Test timed out", waitForCompletion(RespokeTestCase.TEST_TIMEOUT));
  167. assertTrue("Presence delegate should be called", callbackDidSucceed);
  168. assertTrue("Custom presence should be a hash map", presenceTestEndpoint.presence instanceof HashMap);
  169. HashMap<String, String> resolvedPresence = (HashMap<String, String>)presenceTestEndpoint.presence;
  170. assertTrue("Should resolve to correct custom presence", resolvedPresence.get("myRealPresence").equals("ready"));
  171. assertTrue("Should resolve correct custom presence in callback", ((HashMap<String, String>)callbackPresence).get("myRealPresence").equals("ready"));
  172. }
  173. // RespokeEndpoint.Listener methods
  174. public void onMessage(String message, Date timestamp, RespokeEndpoint endpoint, boolean didSend) {
  175. // Not under test
  176. }
  177. public void onPresence(Object presence, RespokeEndpoint sender) {
  178. assertTrue("Sender should be set correctly", sender == presenceTestEndpoint);
  179. assertTrue("Should be called in UI thread", RespokeTestCase.currentlyOnUIThread());
  180. callbackPresence = presence;
  181. callbackDidSucceed = true;
  182. asyncTaskDone = true;
  183. }
  184. // RespokeClient.ResolvePresenceListener methods
  185. public Object resolvePresence(ArrayList<Object> presenceArray) {
  186. assertTrue("presence array should contain the correct number of values", 3 == presenceArray.size());
  187. return customPresenceResolution;
  188. }
  189. }