package dimitrovskif.smartcache;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import org.junit.Rule;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import retrofit.CallAdapter;
import retrofit.Callback;
import retrofit.Response;
import retrofit.Retrofit;
import retrofit.http.GET;
import static org.junit.Assert.*;
public class CallbackTest {
/***
* Builds a Retrofit SmartCache factory without Android executor
*/
private CallAdapter.Factory buildSmartCacheFactory(){
SmartCallFactory factory = new SmartCallFactory(new MockCachingSystem(),
new MainThreadExecutor());
return factory;
}
@Rule public final MockWebServer server = new MockWebServer();
@Test
public void dispatch_isGood() throws Exception{
/* Set up the mock webserver */
MockResponse resp = new MockResponse();
resp.setBody("VERY_BASIC_BODY");
server.enqueue(resp);
server.enqueue(resp.clone());
Retrofit r = new Retrofit.Builder()
.baseUrl(server.url("/"))
.addConverterFactory(new ToStringConverterFactory())
.addCallAdapterFactory(buildSmartCacheFactory())
.build();
DemoService demoService = r.create(DemoService.class);
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<Response<String>> responseRef = new AtomicReference<>();
demoService.getHome().enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response, Retrofit retrofit) {
responseRef.set(response);
latch.countDown();
}
@Override
public void onFailure(Throwable t) {
fail("Failure executing the request.");
}
});
assertTrue(latch.await(1, TimeUnit.SECONDS));
assertEquals(responseRef.get().body(), "VERY_BASIC_BODY");
final CountDownLatch latch2 = new CountDownLatch(2);
final AtomicReference<Response<String>> response2Ref = new AtomicReference<>();
demoService.getHome().enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response, Retrofit retrofit) {
latch2.countDown();
if(latch2.getCount() == 1){ // the cache hit one.
response2Ref.set(response);
}else{ // the network one.
assertEquals(response.body(), response2Ref.get().body());
}
}
@Override
public void onFailure(Throwable t) {
fail("Failure executing the request.");
}
});
assertTrue(latch2.await(1, TimeUnit.SECONDS));
}
static class MainThreadExecutor implements Executor{
@Override
public void execute(Runnable command) {
command.run();
}
}
interface DemoService{
@GET("/")
SmartCall<String> getHome();
}
}