1d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/* 2d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project 3d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 4d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License"); 5d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * you may not use this file except in compliance with the License. 6d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * You may obtain a copy of the License at 7d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 8d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0 9d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 10d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software 11d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS, 12d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * See the License for the specific language governing permissions and 14d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * limitations under the License. 15d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 16d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 17d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupackage com.android.volley; 18d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 19d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.mock.MockCache; 20d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.mock.MockRequest; 21d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.mock.MockResponseDelivery; 22d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.mock.WaitableQueue; 23d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.utils.CacheTestUtils; 24d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 25b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport org.junit.After; 26b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport org.junit.Before; 27b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport org.junit.Test; 28b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport org.junit.runner.RunWith; 29b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport org.robolectric.RobolectricTestRunner; 30b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick 31b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport static org.junit.Assert.*; 32d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 33b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick@RunWith(RobolectricTestRunner.class) 34d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru@SuppressWarnings("rawtypes") 35b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickpublic class CacheDispatcherTest { 36d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private CacheDispatcher mDispatcher; 37d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private WaitableQueue mCacheQueue; 38d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private WaitableQueue mNetworkQueue; 39d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private MockCache mCache; 40d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private MockResponseDelivery mDelivery; 41d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private MockRequest mRequest; 42d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 43d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private static final long TIMEOUT_MILLIS = 5000; 44d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 45b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick @Before public void setUp() throws Exception { 46d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue = new WaitableQueue(); 47d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mNetworkQueue = new WaitableQueue(); 48d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCache = new MockCache(); 49d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mDelivery = new MockResponseDelivery(); 50d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 51d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest = new MockRequest(); 52d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 53d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery); 54d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mDispatcher.start(); 55d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 56d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 57b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick @After public void tearDown() throws Exception { 58d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mDispatcher.quit(); 59d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mDispatcher.join(); 60d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 61d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 62d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // A cancelled request should not be processed at all. 63b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick @Test public void cancelledRequest() throws Exception { 64d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest.cancel(); 65d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.add(mRequest); 66d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.waitUntilEmpty(TIMEOUT_MILLIS); 67d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertFalse(mCache.getCalled); 68d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertFalse(mDelivery.wasEitherResponseCalled()); 69d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 70d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 71d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // A cache miss does not post a response and puts the request on the network queue. 72b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick @Test public void cacheMiss() throws Exception { 73d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.add(mRequest); 74d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.waitUntilEmpty(TIMEOUT_MILLIS); 75d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertFalse(mDelivery.wasEitherResponseCalled()); 76d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertTrue(mNetworkQueue.size() > 0); 77d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru Request request = mNetworkQueue.take(); 78d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertNull(request.getCacheEntry()); 79d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 80d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 81d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // A non-expired cache hit posts a response and does not queue to the network. 82b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick @Test public void nonExpiredCacheHit() throws Exception { 83d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru Cache.Entry entry = CacheTestUtils.makeRandomCacheEntry(null, false, false); 84d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCache.setEntryToReturn(entry); 85d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.add(mRequest); 86d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.waitUntilEmpty(TIMEOUT_MILLIS); 87d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertTrue(mDelivery.postResponse_called); 88d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertFalse(mDelivery.postError_called); 89d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 90d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 91d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // A soft-expired cache hit posts a response and queues to the network. 92b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick @Test public void softExpiredCacheHit() throws Exception { 93d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru Cache.Entry entry = CacheTestUtils.makeRandomCacheEntry(null, false, true); 94d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCache.setEntryToReturn(entry); 95d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.add(mRequest); 96d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.waitUntilEmpty(TIMEOUT_MILLIS); 97d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertTrue(mDelivery.postResponse_called); 98d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertFalse(mDelivery.postError_called); 99d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertTrue(mNetworkQueue.size() > 0); 100d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru Request request = mNetworkQueue.take(); 101d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertSame(entry, request.getCacheEntry()); 102d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 103d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 104d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // An expired cache hit does not post a response and queues to the network. 105b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick @Test public void expiredCacheHit() throws Exception { 106d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru Cache.Entry entry = CacheTestUtils.makeRandomCacheEntry(null, true, true); 107d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCache.setEntryToReturn(entry); 108d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.add(mRequest); 109d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mCacheQueue.waitUntilEmpty(TIMEOUT_MILLIS); 110d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertFalse(mDelivery.wasEitherResponseCalled()); 111d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertTrue(mNetworkQueue.size() > 0); 112d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru Request request = mNetworkQueue.take(); 113d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru assertSame(entry, request.getCacheEntry()); 114d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 115d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru} 116