@Test(groups = "unit", dataProvider = "simpleReadStrongArgProvider")
public void basicReadStrong_AllReplicasSameLSN(int replicaCountToRead, ReadMode readMode, Long lsn, Long localLSN) {

    ISessionContainer sessionContainer = Mockito.mock(ISessionContainer.class);
    Uri primaryReplicaURI = Uri.create("primary");
    ImmutableList<Uri> secondaryReplicaURIs = ImmutableList.of(Uri.create("secondary1"), Uri.create("secondary2"), Uri.create("secondary3"));
    AddressSelectorWrapper addressSelectorWrapper = AddressSelectorWrapper.Builder.Simple.create()
            .withPrimary(primaryReplicaURI)
            .withSecondary(secondaryReplicaURIs)
            .build();
    RxDocumentServiceRequest request = RxDocumentServiceRequest.createFromName(
            OperationType.Read, "/dbs/db/colls/col/docs/docId", ResourceType.Document);
    request.requestContext = new DocumentServiceRequestContext();
    request.requestContext.timeoutHelper = Mockito.mock(TimeoutHelper.class);
    request.requestContext.resolvedPartitionKeyRange = Mockito.mock(PartitionKeyRange.class);
    request.requestContext.requestChargeTracker = new RequestChargeTracker();
    BigDecimal requestChargePerRead = new BigDecimal(1.1);
    StoreResponse primaryResponse = storeResponse(lsn, localLSN, requestChargePerRead.doubleValue());
    StoreResponse secondaryResponse1 = storeResponse(lsn, localLSN, requestChargePerRead.doubleValue());
    StoreResponse secondaryResponse2 = storeResponse(lsn, localLSN, requestChargePerRead.doubleValue());
    StoreResponse secondaryResponse3 = storeResponse(lsn, localLSN, requestChargePerRead.doubleValue());
    TransportClientWrapper transportClientWrapper = TransportClientWrapper.Builder.uriToResultBuilder()
            .storeResponseOn(primaryReplicaURI, OperationType.Read, ResourceType.Document, primaryResponse, false)
            .storeResponseOn(secondaryReplicaURIs.get(0), OperationType.Read, ResourceType.Document, secondaryResponse1, false)
            .storeResponseOn(secondaryReplicaURIs.get(1), OperationType.Read, ResourceType.Document, secondaryResponse2, false)
            .storeResponseOn(secondaryReplicaURIs.get(2), OperationType.Read, ResourceType.Document, secondaryResponse3, false)
            .build();
    StoreReader storeReader = new StoreReader(transportClientWrapper.transportClient, addressSelectorWrapper.addressSelector, sessionContainer);
    GatewayServiceConfigurationReader serviceConfigurator = Mockito.mock(GatewayServiceConfigurationReader.class);
    IAuthorizationTokenProvider authTokenProvider = Mockito.mock(IAuthorizationTokenProvider.class);
    QuorumReader quorumReader = new QuorumReader(configs, transportClientWrapper.transportClient, addressSelectorWrapper.addressSelector, storeReader, serviceConfigurator, authTokenProvider);
    Single<StoreResponse> storeResponseSingle = quorumReader.readStrongAsync(request, replicaCountToRead, readMode);
    StoreResponseValidator.Builder validatorBuilder = StoreResponseValidator.create()
            .withBELocalLSN(localLSN)
            .withRequestCharge(requestChargePerRead.multiply(BigDecimal.valueOf(replicaCountToRead)).setScale(2, RoundingMode.FLOOR).doubleValue());
    if (lsn != null) {
        validatorBuilder.withBELSN(lsn);
    }
    validateSuccess(storeResponseSingle, validatorBuilder.build());
    transportClientWrapper.validate()
            .verifyNumberOfInvocations(replicaCountToRead);
    addressSelectorWrapper.validate()
            .verifyNumberOfForceCachRefresh(0)
            .verifyVesolvePrimaryUriAsyncCount(0)
            .verifyTotalInvocations(1);
}