Program: 81202
Project: 81202
Buggy source:
@Test public void testRetryPolicy(){
  Context context=RuntimeEnvironment.application;
  File file=createRandomFile();
  ShadowLooper shadowLooper=Shadows.shadowOf(Looper.getMainLooper());
  Handler handler=new Handler();
  SizeBatchingStrategy strategy=mock(SizeBatchingStrategy.class);
  SizeBatchingStrategy.SizeBatch<Data> firstBatch=new SizeBatchingStrategy.SizeBatch<>(Utils.fakeCollection(5),5);
  SerializationStrategy serializationStrategy=new GsonSerializationStrategy();
  BatchManager.registerBuiltInTypes(serializationStrategy);
  serializationStrategy.build();
  int errorCode=500;
  long callbackIdle=1000;
  int retryCount=4;
  NetworkPersistedBatchReadyListener.NetworkRequestResponse requestResponse=new NetworkPersistedBatchReadyListener.NetworkRequestResponse(true,errorCode);
  MockNetworkPersistedBatchReadyListener networkBatchListener=spy(new MockNetworkPersistedBatchReadyListener(requestResponse,handler,callbackIdle,context));
  NetworkPersistedBatchReadyListener networkPersistedBatchReadyListener=new NetworkPersistedBatchReadyListener(context,file,serializationStrategy,handler,networkBatchListener,retryCount);
  networkPersistedBatchReadyListener.onReady(strategy,firstBatch);
  shadowLooper.runToEndOfTasks();
  verify(networkBatchListener,times(1)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(networkPersistedBatchReadyListener.getDefaultTimeoutMs());
  verify(networkBatchListener,times(2)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 2);
  verify(networkBatchListener,times(3)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 4);
  verify(networkBatchListener,times(4)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  sendFakeNetworkBroadcast(context);
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 8);
  verify(networkBatchListener,times(4)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  sendFakeNetworkBroadcast(context);
  SizeBatchingStrategy.SizeBatch<Data> secondBatch=new SizeBatchingStrategy.SizeBatch<>(Utils.fakeCollection(5),5);
  networkPersistedBatchReadyListener.onReady(strategy,secondBatch);
  shadowLooper.idle();
  verify(networkBatchListener,times(5)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs());
  sendFakeNetworkBroadcast(context);
  verify(networkBatchListener,times(6)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  requestResponse.complete=true;
  requestResponse.httpErrorCode=200;
  sendFakeNetworkBroadcast(context);
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 2);
  verify(networkBatchListener,times(7)).performNetworkRequest(eq(secondBatch),any(ValueCallback.class));
  shadowLooper.runToEndOfTasks();
  verify(networkBatchListener,atLeastOnce()).isNetworkConnected(context);
  verifyNoMoreInteractions(networkBatchListener);
}

Fixed version (ground truth):
@Test public void testRetryPolicy(){
  Context context=RuntimeEnvironment.application;
  File file=createRandomFile();
  ShadowLooper shadowLooper=Shadows.shadowOf(Looper.getMainLooper());
  Handler handler=new Handler();
  SizeBatchingStrategy strategy=mock(SizeBatchingStrategy.class);
  SizeBatchingStrategy.SizeBatch<Data> firstBatch=new SizeBatchingStrategy.SizeBatch<>(Utils.fakeCollection(5),5);
  SerializationStrategy serializationStrategy=new GsonSerializationStrategy();
  BatchManager.registerBuiltInTypes(serializationStrategy);
  serializationStrategy.build();
  int errorCode=500;
  long callbackIdle=1000;
  int retryCount=4;
  NetworkPersistedBatchReadyListener.NetworkRequestResponse requestResponse=new NetworkPersistedBatchReadyListener.NetworkRequestResponse(true,errorCode);
  MockNetworkPersistedBatchReadyListener networkBatchListener=spy(new MockNetworkPersistedBatchReadyListener(requestResponse,handler,callbackIdle,context));
  NetworkPersistedBatchReadyListener networkPersistedBatchReadyListener=new NetworkPersistedBatchReadyListener(context,file,serializationStrategy,handler,networkBatchListener,retryCount);
  networkPersistedBatchReadyListener.onReady(strategy,firstBatch);
  shadowLooper.runToEndOfTasks();
  verify(networkBatchListener,times(1)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(networkPersistedBatchReadyListener.getDefaultTimeoutMs());
  verify(networkBatchListener,times(2)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 2);
  verify(networkBatchListener,times(3)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 4);
  verify(networkBatchListener,times(4)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  sendFakeNetworkBroadcast(context);
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 8);
  verify(networkBatchListener,times(4)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  sendFakeNetworkBroadcast(context);
  SizeBatchingStrategy.SizeBatch<Data> secondBatch=new SizeBatchingStrategy.SizeBatch<>(Utils.fakeCollection(5),5);
  networkPersistedBatchReadyListener.onReady(strategy,secondBatch);
  shadowLooper.idle();
  verify(networkBatchListener,times(5)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs());
  sendFakeNetworkBroadcast(context);
  verify(networkBatchListener,times(6)).performNetworkRequest(eq(firstBatch),any(ValueCallback.class));
  requestResponse.complete=true;
  requestResponse.httpErrorCode=200;
  sendFakeNetworkBroadcast(context);
  shadowLooper.idle(callbackIdle + networkPersistedBatchReadyListener.getDefaultTimeoutMs() * 2);
  verify(networkBatchListener,times(1)).performNetworkRequest(eq(secondBatch),any(ValueCallback.class));
  shadowLooper.runToEndOfTasks();
  verify(networkBatchListener,atLeastOnce()).isNetworkConnected(context);
  verifyNoMoreInteractions(networkBatchListener);
}