package org.edx.mobile.test.http; import android.content.Context; import org.edx.mobile.http.GzipRequestInterceptor; import org.edx.mobile.http.HttpStatus; import org.edx.mobile.http.OauthHeaderRequestInterceptor; import org.edx.mobile.http.OfflineRequestInterceptor; import org.edx.mobile.test.BaseTestCase; import org.junit.Ignore; import org.robolectric.RuntimeEnvironment; import java.io.File; import java.util.List; import okhttp3.Cache; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import okhttp3.mockwebserver.Dispatcher; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.http.GET; import retrofit2.http.Headers; import static org.assertj.core.api.Java6Assertions.assertThat; @Ignore public class RetrofitOkhttpTestCase extends BaseTestCase { interface DummyService { @Headers("Cache-Control: no-cache") @GET("/endpoint1") Call<Object> getRequestNoCache(String nocache); @GET("/endpoint1") Call<Object> getRequest(String nocache); } // Use a mock server to serve fixed responses protected MockWebServer server; protected Context context; private boolean isNetworkConnected; @Override public void setUp() throws Exception { super.setUp(); server = new MockWebServer(); server.setDispatcher(dispatcher); server.start(); context = RuntimeEnvironment.application; } public void testCache() throws Exception { OkHttpClient.Builder oauthBasedClientBuilder = new OkHttpClient.Builder(); File cacheDirectory = new File(context.getCacheDir(), "http-cache-test"); if (cacheDirectory.exists()) { cacheDirectory.delete(); } cacheDirectory.mkdir(); final int cacheSize = 10 * 1024 * 1024; // 10 MiB Cache cache = new Cache(cacheDirectory, cacheSize); oauthBasedClientBuilder.cache(cache); List<Interceptor> interceptors = oauthBasedClientBuilder.interceptors(); interceptors.add(new GzipRequestInterceptor()); interceptors.add(new OauthHeaderRequestInterceptor(context)); interceptors.add(new OfflineRequestInterceptor(context) { public boolean isNetworkConnected() { return isNetworkConnected; } }); HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); interceptors.add(loggingInterceptor); OkHttpClient oauthBasedClient = oauthBasedClientBuilder.build(); Retrofit retrofit = new Retrofit.Builder() .client(oauthBasedClient) .baseUrl(server.url("/")) .addConverterFactory(GsonConverterFactory.create()) .build(); DummyService service = retrofit.create(DummyService.class); //test online isNetworkConnected = true; service.getRequest("test").execute(); assertThat(cache.requestCount()).isEqualTo(1); assertThat(cache.networkCount()).isEqualTo(1); assertThat(cache.hitCount()).isEqualTo(0); service.getRequest("test").execute(); assertThat(cache.requestCount()).isEqualTo(2); assertThat(cache.networkCount()).isEqualTo(1); assertThat(cache.hitCount()).isEqualTo(1); service.getRequestNoCache("test").execute(); assertThat(cache.requestCount()).isEqualTo(3); assertThat(cache.networkCount()).isEqualTo(2); assertThat(cache.hitCount()).isEqualTo(2); //test offline isNetworkConnected = false; service.getRequest("test").execute(); assertThat(cache.requestCount()).isEqualTo(4); assertThat(cache.networkCount()).isEqualTo(2); assertThat(cache.hitCount()).isEqualTo(2); //TODO - what's that? service.getRequestNoCache("test").execute(); assertThat(cache.requestCount()).isEqualTo(4); assertThat(cache.networkCount()).isEqualTo(2); assertThat(cache.hitCount()).isEqualTo(2); } @Override public void tearDown() throws Exception { super.tearDown(); server.shutdown(); } final Dispatcher dispatcher = new Dispatcher() { @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { if (request.getPath().equals("/endpoint1")){ return new MockResponse().setResponseCode(HttpStatus.OK); } return new MockResponse().setResponseCode(HttpStatus.NOT_FOUND); } }; }