/host-common/src/test/java/com/atlassian/plugin/remotable/host/common/service/http/DefaultHostXmlRpcClientTest.java

https://bitbucket.org/rodogu/remotable-plugins · Java · 237 lines · 182 code · 55 blank · 0 comment · 1 complexity · ec89fb89901157bb87b82bf8e97054cc MD5 · raw file

  1. package com.atlassian.plugin.remotable.host.common.service.http;
  2. import com.atlassian.httpclient.api.Request;
  3. import com.atlassian.httpclient.api.Response;
  4. import com.atlassian.httpclient.api.ResponseTransformationException;
  5. import com.atlassian.httpclient.api.UnexpectedResponseException;
  6. import com.atlassian.plugin.remotable.api.service.http.HostHttpClient;
  7. import com.atlassian.plugin.remotable.api.service.http.XmlRpcException;
  8. import com.atlassian.plugin.remotable.api.service.http.XmlRpcFault;
  9. import com.atlassian.util.concurrent.Effect;
  10. import com.atlassian.util.concurrent.Promise;
  11. import com.google.common.base.Objects;
  12. import com.google.common.util.concurrent.SettableFuture;
  13. import org.hamcrest.BaseMatcher;
  14. import org.hamcrest.Description;
  15. import org.junit.Before;
  16. import org.junit.Test;
  17. import org.junit.runner.RunWith;
  18. import org.mockito.Mock;
  19. import org.mockito.Mockito;
  20. import org.mockito.runners.MockitoJUnitRunner;
  21. import redstone.xmlrpc.XmlRpcStruct;
  22. import java.io.InputStream;
  23. import java.io.StringWriter;
  24. import java.net.URI;
  25. import static com.atlassian.httpclient.api.ResponsePromises.*;
  26. import static com.atlassian.util.concurrent.Promises.*;
  27. import static org.junit.Assert.*;
  28. import static org.mockito.Matchers.anyString;
  29. import static org.mockito.Matchers.argThat;
  30. import static org.mockito.Matchers.isA;
  31. import static org.mockito.Mockito.*;
  32. import static org.mockito.Mockito.when;
  33. @RunWith(MockitoJUnitRunner.class)
  34. public final class DefaultHostXmlRpcClientTest
  35. {
  36. private DefaultHostXmlRpcClient client;
  37. @Mock
  38. private HostHttpClient httpClient;
  39. @Mock
  40. private Request request;
  41. @Mock
  42. private Effect<ExpectedClass> doneEffect;
  43. @Mock
  44. private Effect<Throwable> failEffect;
  45. private SettableFuture<Response> responseFuture;
  46. @Mock
  47. private Response response;
  48. @Mock
  49. private FaultHandlingXmlRpcParser parser;
  50. @Before
  51. public void setUp()
  52. {
  53. client = new DefaultHostXmlRpcClient(httpClient);
  54. when(httpClient.newRequest(Mockito.<URI>any())).thenReturn(request);
  55. when(request.setContentType(anyString())).thenReturn(request);
  56. when(request.setContentCharset(anyString())).thenReturn(request);
  57. when(request.setEntity(anyString())).thenReturn(request);
  58. responseFuture = SettableFuture.create();
  59. when(request.post()).thenReturn(toResponsePromise(forListenableFuture(responseFuture)));
  60. }
  61. @Test
  62. public final void testEndCallOnResponseOk200AndParsesFine()
  63. {
  64. final Promise<ExpectedClass> promise = client
  65. .endCall(new StringWriter(), parser, ExpectedClass.class)
  66. .done(doneEffect)
  67. .fail(failEffect);
  68. assertFalse(promise.isDone());
  69. when(response.getStatusCode()).thenReturn(200);
  70. final ExpectedClass parsedValue = mock(ExpectedClass.class);
  71. when(parser.getParsedValue()).thenReturn(parsedValue);
  72. responseFuture.set(response);
  73. assertTrue(promise.isDone());
  74. verify(doneEffect).apply(parsedValue);
  75. verifyZeroInteractions(failEffect);
  76. }
  77. @Test
  78. public final void testEndCallOnResponseOk200AndParsesNotExpectedClass()
  79. {
  80. final Promise<ExpectedClass> promise = client
  81. .endCall(new StringWriter(), parser, ExpectedClass.class)
  82. .done(doneEffect)
  83. .fail(failEffect);
  84. assertFalse(promise.isDone());
  85. when(response.getStatusCode()).thenReturn(200);
  86. final Object parsedValue = new Object();
  87. when(parser.getParsedValue()).thenReturn(parsedValue);
  88. responseFuture.set(response);
  89. assertTrue(promise.isDone());
  90. verifyZeroInteractions(doneEffect);
  91. verify(failEffect).apply(isA(XmlRpcException.class));
  92. }
  93. @Test
  94. public final void testEndCallOnResponseOk200AndParsesXmlFault()
  95. {
  96. final Promise<ExpectedClass> promise = client
  97. .endCall(new StringWriter(), parser, ExpectedClass.class)
  98. .done(doneEffect)
  99. .fail(failEffect);
  100. assertFalse(promise.isDone());
  101. when(response.getStatusCode()).thenReturn(200);
  102. when(parser.isFaultResponse()).thenReturn(true);
  103. when(parser.getParsedValue()).thenReturn(mock(XmlRpcStruct.class));
  104. responseFuture.set(response);
  105. assertTrue(promise.isDone());
  106. verifyZeroInteractions(doneEffect);
  107. verify(failEffect).apply(isA(XmlRpcFault.class));
  108. }
  109. @Test
  110. public final void testEndCallOnResponseOk200AndParsesWithException()
  111. {
  112. final Promise<ExpectedClass> promise = client
  113. .endCall(new StringWriter(), parser, ExpectedClass.class)
  114. .done(doneEffect)
  115. .fail(failEffect);
  116. assertFalse(promise.isDone());
  117. when(response.getStatusCode()).thenReturn(200);
  118. doThrow(new RuntimeException()).when(parser).parse(Mockito.<InputStream>any());
  119. responseFuture.set(response);
  120. assertTrue(promise.isDone());
  121. verifyZeroInteractions(doneEffect);
  122. verify(failEffect).apply(isA(XmlRpcException.class));
  123. }
  124. @Test
  125. public final void testEndCallOnResponseOtherThan200()
  126. {
  127. final Promise<ExpectedClass> promise = client
  128. .endCall(new StringWriter(), new FaultHandlingXmlRpcParser(), ExpectedClass.class)
  129. .done(doneEffect)
  130. .fail(failEffect);
  131. assertFalse(promise.isDone());
  132. when(response.getStatusCode()).thenReturn(100);
  133. responseFuture.set(response);
  134. assertTrue(promise.isDone());
  135. verifyZeroInteractions(doneEffect);
  136. verify(failEffect).apply(isAnUnexpectedResponseException(response));
  137. }
  138. @Test
  139. public final void testEndCallOnResponseFail()
  140. {
  141. final Promise<ExpectedClass> promise = client
  142. .endCall(new StringWriter(), new FaultHandlingXmlRpcParser(), ExpectedClass.class)
  143. .done(doneEffect)
  144. .fail(failEffect);
  145. assertFalse(promise.isDone());
  146. final Throwable throwable = new Throwable();
  147. responseFuture.setException(throwable);
  148. assertTrue(promise.isDone());
  149. verifyZeroInteractions(doneEffect);
  150. verify(failEffect).apply(isA(ResponseTransformationException.class));
  151. }
  152. private static UnexpectedResponseException isAnUnexpectedResponseException(Response response)
  153. {
  154. return argThat(new UnexpectedResponseExceptionMatcher(response));
  155. }
  156. private static class UnexpectedResponseExceptionMatcher extends BaseMatcher<UnexpectedResponseException>
  157. {
  158. private final Response response;
  159. private UnexpectedResponseExceptionMatcher(Response response)
  160. {
  161. this.response = response;
  162. }
  163. @Override
  164. public boolean matches(Object o)
  165. {
  166. if (!(o instanceof UnexpectedResponseException))
  167. {
  168. return false;
  169. }
  170. final UnexpectedResponseException e = (UnexpectedResponseException) o;
  171. return Objects.equal(response, e.getResponse());
  172. }
  173. @Override
  174. public void describeTo(Description description)
  175. {
  176. description.appendText("Unexpected response exception.");
  177. }
  178. }
  179. private static interface ExpectedClass
  180. {
  181. }
  182. }