diff options
Diffstat (limited to 'src/test/java/com/android/volley/RequestQueueTest.java')
-rw-r--r-- | src/test/java/com/android/volley/RequestQueueTest.java | 181 |
1 files changed, 24 insertions, 157 deletions
diff --git a/src/test/java/com/android/volley/RequestQueueTest.java b/src/test/java/com/android/volley/RequestQueueTest.java index cc88d3b..bcf3ff2 100644 --- a/src/test/java/com/android/volley/RequestQueueTest.java +++ b/src/test/java/com/android/volley/RequestQueueTest.java @@ -16,114 +16,47 @@ package com.android.volley; -import com.android.volley.Request.Priority; -import com.android.volley.mock.MockNetwork; -import com.android.volley.mock.MockRequest; +import com.android.volley.mock.ShadowSystemClock; import com.android.volley.toolbox.NoCache; -import com.android.volley.utils.CacheTestUtils; import com.android.volley.utils.ImmediateResponseDelivery; - -import android.os.SystemClock; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import org.robolectric.annotation.Implements; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; +import static org.mockito.MockitoAnnotations.initMocks; -// TODO: Resurrect these tests when we have something like a finish() observer. -// They are really gross as-is and depend on a bunch of sleeping and whatnot. -@Ignore +/** + * Unit tests for RequestQueue, with all dependencies mocked out + */ @RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowSystemClock.class}) public class RequestQueueTest { + private ResponseDelivery mDelivery; + @Mock private Network mMockNetwork; @Before public void setUp() throws Exception { mDelivery = new ImmediateResponseDelivery(); - } - - /** - * Make a list of requests with random priorities. - * @param count Number of requests to make - */ - private List<MockRequest> makeRequests(int count) { - Request.Priority[] allPriorities = Request.Priority.values(); - Random random = new Random(); - - List<MockRequest> requests = new ArrayList<MockRequest>(); - for (int i = 0; i < count; i++) { - MockRequest request = new MockRequest(); - Request.Priority priority = allPriorities[random.nextInt(allPriorities.length)]; - request.setCacheKey(String.valueOf(i)); - request.setPriority(priority); - requests.add(request); - } - return requests; - } - - @Test public void add_requestProcessedInCorrectOrder() throws Exception { - int requestsToMake = 100; - - OrderCheckingNetwork network = new OrderCheckingNetwork(); - RequestQueue queue = new RequestQueue(new NoCache(), network, 1, mDelivery); - - for (Request<?> request : makeRequests(requestsToMake)) { - queue.add(request); - } - - network.setExpectedRequests(requestsToMake); - queue.start(); - network.waitUntilExpectedDone(2000); // 2 seconds - queue.stop(); - } - - @Test public void add_dedupeByCacheKey() throws Exception { - OrderCheckingNetwork network = new OrderCheckingNetwork(); - final AtomicInteger parsed = new AtomicInteger(); - final AtomicInteger delivered = new AtomicInteger(); - // Enqueue 2 requests with the same cache key. The first request takes 1.5s. Assert that the - // second request is only handled after the first one has been parsed and delivered. - DelayedRequest req1 = new DelayedRequest(1500, parsed, delivered); - DelayedRequest req2 = new DelayedRequest(0, parsed, delivered) { - @Override - protected Response<Object> parseNetworkResponse(NetworkResponse response) { - assertEquals(1, parsed.get()); // req1 must have been parsed. - assertEquals(1, delivered.get()); // req1 must have been parsed. - return super.parseNetworkResponse(response); - } - }; - network.setExpectedRequests(2); - RequestQueue queue = new RequestQueue(new NoCache(), network, 3, mDelivery); - queue.add(req1); - queue.add(req2); - queue.start(); - network.waitUntilExpectedDone(2000); - queue.stop(); + initMocks(this); } @Test public void cancelAll_onlyCorrectTag() throws Exception { - MockNetwork network = new MockNetwork(); - RequestQueue queue = new RequestQueue(new NoCache(), network, 3, mDelivery); + RequestQueue queue = new RequestQueue(new NoCache(), mMockNetwork, 0, mDelivery); Object tagA = new Object(); Object tagB = new Object(); - MockRequest req1 = new MockRequest(); - req1.setTag(tagA); - MockRequest req2 = new MockRequest(); - req2.setTag(tagB); - MockRequest req3 = new MockRequest(); - req3.setTag(tagA); - MockRequest req4 = new MockRequest(); - req4.setTag(tagA); + Request req1 = mock(Request.class); + when(req1.getTag()).thenReturn(tagA); + Request req2 = mock(Request.class); + when(req2.getTag()).thenReturn(tagB); + Request req3 = mock(Request.class); + when(req3.getTag()).thenReturn(tagA); + Request req4 = mock(Request.class); + when(req4.getTag()).thenReturn(tagA); queue.add(req1); // A queue.add(req2); // B @@ -131,75 +64,9 @@ public class RequestQueueTest { queue.cancelAll(tagA); queue.add(req4); // A - assertTrue(req1.cancel_called); // A cancelled - assertFalse(req2.cancel_called); // B not cancelled - assertTrue(req3.cancel_called); // A cancelled - assertFalse(req4.cancel_called); // A added after cancel not cancelled + verify(req1).cancel(); // A cancelled + verify(req3).cancel(); // A cancelled + verify(req2, never()).cancel(); // B not cancelled + verify(req4, never()).cancel(); // A added after cancel not cancelled } - - private class OrderCheckingNetwork implements Network { - private Priority mLastPriority = Priority.IMMEDIATE; - private int mLastSequence = -1; - private Semaphore mSemaphore; - - public void setExpectedRequests(int expectedRequests) { - // Leave one permit available so the waiter can find it. - expectedRequests--; - mSemaphore = new Semaphore(-expectedRequests); - } - - public void waitUntilExpectedDone(long timeout) - throws InterruptedException, TimeoutError { - if (mSemaphore.tryAcquire(timeout, TimeUnit.MILLISECONDS) == false) { - throw new TimeoutError(); - } - } - - @Override - public NetworkResponse performRequest(Request<?> request) { - Priority thisPriority = request.getPriority(); - int thisSequence = request.getSequence(); - - int priorityDiff = thisPriority.compareTo(mLastPriority); - - // Should never experience a higher priority after a lower priority - assertFalse(priorityDiff > 0); - - // If we're not transitioning to a new priority block, check sequence numbers - if (priorityDiff == 0) { - assertTrue(thisSequence > mLastSequence); - } - mLastSequence = thisSequence; - mLastPriority = thisPriority; - - mSemaphore.release(); - return new NetworkResponse(new byte[16]); - } - } - - private class DelayedRequest extends Request<Object> { - private final long mDelayMillis; - private final AtomicInteger mParsedCount; - private final AtomicInteger mDeliveredCount; - - public DelayedRequest(long delayMillis, AtomicInteger parsed, AtomicInteger delivered) { - super(Request.Method.GET, "http://buganizer/", null); - mDelayMillis = delayMillis; - mParsedCount = parsed; - mDeliveredCount = delivered; - } - - @Override - protected Response<Object> parseNetworkResponse(NetworkResponse response) { - mParsedCount.incrementAndGet(); - SystemClock.sleep(mDelayMillis); - return Response.success(new Object(), CacheTestUtils.makeRandomCacheEntry(null)); - } - - @Override - protected void deliverResponse(Object response) { - mDeliveredCount.incrementAndGet(); - } - } - } |