/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.volley; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import com.android.volley.toolbox.StringRequest; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.concurrent.BlockingQueue; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) public class NetworkDispatcherTest { private NetworkDispatcher mDispatcher; private @Mock ResponseDelivery mDelivery; private @Mock BlockingQueue> mNetworkQueue; private @Mock Network mNetwork; private @Mock Cache mCache; private StringRequest mRequest; private static final byte[] CANNED_DATA = "Ceci n'est pas une vraie reponse".getBytes(StandardCharsets.UTF_8); @Before public void setUp() throws Exception { initMocks(this); mRequest = new StringRequest(Request.Method.GET, "http://foo", null, null); mDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork, mCache, mDelivery); } @Test public void successPostsResponse() throws Exception { when(mNetwork.performRequest(any(Request.class))) .thenReturn(new NetworkResponse(CANNED_DATA)); mDispatcher.processRequest(mRequest); ArgumentCaptor response = ArgumentCaptor.forClass(Response.class); verify(mDelivery).postResponse(any(Request.class), response.capture()); assertTrue(response.getValue().isSuccess()); assertEquals(response.getValue().result, new String(CANNED_DATA, StandardCharsets.UTF_8)); verify(mDelivery, never()).postError(any(Request.class), any(VolleyError.class)); } @Test public void exceptionPostsError() throws Exception { when(mNetwork.performRequest(any(Request.class))).thenThrow(new ServerError()); mDispatcher.processRequest(mRequest); verify(mDelivery).postError(any(Request.class), any(VolleyError.class)); verify(mDelivery, never()).postResponse(any(Request.class), any(Response.class)); } @Test public void shouldCacheFalse() throws Exception { mRequest.setShouldCache(false); mDispatcher.processRequest(mRequest); verify(mCache, never()).put(anyString(), any(Cache.Entry.class)); } @Test public void shouldCacheTrue() throws Exception { when(mNetwork.performRequest(any(Request.class))) .thenReturn(new NetworkResponse(CANNED_DATA)); mRequest.setShouldCache(true); mDispatcher.processRequest(mRequest); ArgumentCaptor entry = ArgumentCaptor.forClass(Cache.Entry.class); verify(mCache).put(eq(mRequest.getCacheKey()), entry.capture()); assertTrue(Arrays.equals(entry.getValue().data, CANNED_DATA)); } }