summaryrefslogtreecommitdiff
path: root/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/android/volley/toolbox/BasicNetworkTest.java')
-rw-r--r--src/test/java/com/android/volley/toolbox/BasicNetworkTest.java211
1 files changed, 203 insertions, 8 deletions
diff --git a/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java b/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java
index 89718b1..c01d9b0 100644
--- a/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java
+++ b/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java
@@ -16,29 +16,46 @@
package com.android.volley.toolbox;
+import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
+import com.android.volley.RetryPolicy;
+import com.android.volley.ServerError;
+import com.android.volley.TimeoutError;
+import com.android.volley.VolleyError;
import com.android.volley.mock.MockHttpStack;
import org.apache.http.ProtocolVersion;
+import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHttpResponse;
-
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
-import static org.junit.Assert.*;
-
+import java.io.IOException;
+import java.net.SocketTimeoutException;
import java.util.HashMap;
import java.util.Map;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+import static org.mockito.MockitoAnnotations.initMocks;
+
@RunWith(RobolectricTestRunner.class)
public class BasicNetworkTest {
+ @Mock private Request<String> mMockRequest;
+ @Mock private RetryPolicy mMockRetryPolicy;
+ private BasicNetwork mNetwork;
+
+ @Before public void setUp() throws Exception {
+ initMocks(this);
+ }
+
@Test public void headersAndPostParams() throws Exception {
MockHttpStack mockHttpStack = new MockHttpStack();
BasicHttpResponse fakeResponse = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1),
@@ -46,7 +63,188 @@ public class BasicNetworkTest {
fakeResponse.setEntity(new StringEntity("foobar"));
mockHttpStack.setResponseToReturn(fakeResponse);
BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
- Request<String> request = new Request<String>(Request.Method.GET, "http://foo", null) {
+ Request<String> request = buildRequest();
+ httpNetwork.performRequest(request);
+ assertEquals("foo", mockHttpStack.getLastHeaders().get("requestheader"));
+ assertEquals("requestpost=foo&", new String(mockHttpStack.getLastPostBody()));
+ }
+
+ @Test public void socketTimeout() throws Exception {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ mockHttpStack.setExceptionToThrow(new SocketTimeoutException());
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should retry socket timeouts
+ verify(mMockRetryPolicy).retry(any(TimeoutError.class));
+ }
+
+ @Test public void connectTimeout() throws Exception {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ mockHttpStack.setExceptionToThrow(new ConnectTimeoutException());
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should retry connection timeouts
+ verify(mMockRetryPolicy).retry(any(TimeoutError.class));
+ }
+
+ @Test public void noConnection() throws Exception {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ mockHttpStack.setExceptionToThrow(new IOException());
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should not retry when there is no connection
+ verify(mMockRetryPolicy, never()).retry(any(VolleyError.class));
+ }
+
+ @Test public void unauthorized() throws Exception {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ BasicHttpResponse fakeResponse = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1),
+ 401, "Unauthorized");
+ mockHttpStack.setResponseToReturn(fakeResponse);
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should retry in case it's an auth failure.
+ verify(mMockRetryPolicy).retry(any(AuthFailureError.class));
+ }
+
+ @Test public void forbidden() throws Exception {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ BasicHttpResponse fakeResponse = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1),
+ 403, "Forbidden");
+ mockHttpStack.setResponseToReturn(fakeResponse);
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should retry in case it's an auth failure.
+ verify(mMockRetryPolicy).retry(any(AuthFailureError.class));
+ }
+
+ @Test public void redirect() throws Exception {
+ for (int i = 300; i <= 399; i++) {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ BasicHttpResponse fakeResponse =
+ new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), i, "");
+ mockHttpStack.setResponseToReturn(fakeResponse);
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should not retry 300 responses.
+ verify(mMockRetryPolicy, never()).retry(any(VolleyError.class));
+ reset(mMockRetryPolicy);
+ }
+ }
+
+ @Test public void otherClientError() throws Exception {
+ for (int i = 400; i <= 499; i++) {
+ if (i == 401 || i == 403) {
+ // covered above.
+ continue;
+ }
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ BasicHttpResponse fakeResponse =
+ new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), i, "");
+ mockHttpStack.setResponseToReturn(fakeResponse);
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should not retry other 400 errors.
+ verify(mMockRetryPolicy, never()).retry(any(VolleyError.class));
+ reset(mMockRetryPolicy);
+ }
+ }
+
+ @Test public void serverError_enableRetries() throws Exception {
+ for (int i = 500; i <= 599; i++) {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ BasicHttpResponse fakeResponse =
+ new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), i, "");
+ mockHttpStack.setResponseToReturn(fakeResponse);
+ BasicNetwork httpNetwork =
+ new BasicNetwork(mockHttpStack, new ByteArrayPool(4096));
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ request.setShouldRetryServerErrors(true);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should retry all 500 errors
+ verify(mMockRetryPolicy).retry(any(ServerError.class));
+ reset(mMockRetryPolicy);
+ }
+ }
+
+ @Test public void serverError_disableRetries() throws Exception {
+ for (int i = 500; i <= 599; i++) {
+ MockHttpStack mockHttpStack = new MockHttpStack();
+ BasicHttpResponse fakeResponse =
+ new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), i, "");
+ mockHttpStack.setResponseToReturn(fakeResponse);
+ BasicNetwork httpNetwork = new BasicNetwork(mockHttpStack);
+ Request<String> request = buildRequest();
+ request.setRetryPolicy(mMockRetryPolicy);
+ doThrow(new VolleyError()).when(mMockRetryPolicy).retry(any(VolleyError.class));
+ try {
+ httpNetwork.performRequest(request);
+ } catch (VolleyError e) {
+ // expected
+ }
+ // should not retry any 500 error w/ HTTP 500 retries turned off (the default).
+ verify(mMockRetryPolicy, never()).retry(any(VolleyError.class));
+ reset(mMockRetryPolicy);
+ }
+ }
+
+ private static Request<String> buildRequest() {
+ return new Request<String>(Request.Method.GET, "http://foo", null) {
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
@@ -71,8 +269,5 @@ public class BasicNetworkTest {
return result;
}
};
- httpNetwork.performRequest(request);
- assertEquals("foo", mockHttpStack.getLastHeaders().get("requestheader"));
- assertEquals("requestpost=foo&", new String(mockHttpStack.getLastPostBody()));
}
}