@Test
  public void periodicAckSendByClient() throws Exception {
    int port = getRandomAvailableTCPPort();
    addCacheServer(port, null);

    PoolFactory poolFactory = PoolManager.createFactory();
    poolFactory.addServer("localhost", port);
    poolFactory.setSubscriptionEnabled(true);
    poolFactory.setSubscriptionRedundancy(1);
    poolFactory.setReadTimeout(20000);
    poolFactory.setSubscriptionMessageTrackingTimeout(15000);
    poolFactory.setSubscriptionAckInterval(5000);

    proxy = (PoolImpl) poolFactory.create("clientPool");

    EventID eventID = new EventID(new byte[0], 1, 1);

    assertThat(proxy.verifyIfDuplicate(eventID))
        .describedAs("eventID should not be duplicate as it is a new entry")
        .isFalse();

    seo = (SequenceIdAndExpirationObject) proxy.getThreadIdToSequenceIdMap()
        .get(new ThreadIdentifier(new byte[0], 1));
    assertThat(seo.getAckSend()).isFalse();

    // should send the ack to server
    seo = (SequenceIdAndExpirationObject) proxy.getThreadIdToSequenceIdMap()
        .get(new ThreadIdentifier(new byte[0], 1));
    verifyAckSend(true);

    // New update on same threadId
    eventID = new EventID(new byte[0], 1, 2);
    assertThat(proxy.verifyIfDuplicate(eventID))
        .describedAs("eventID should not be duplicate as it is a new entry")
        .isFalse();

    seo = (SequenceIdAndExpirationObject) proxy.getThreadIdToSequenceIdMap()
        .get(new ThreadIdentifier(new byte[0], 1));
    assertThat(seo.getAckSend()).isFalse();

    // should send another ack to server
    seo = (SequenceIdAndExpirationObject) proxy.getThreadIdToSequenceIdMap()
        .get(new ThreadIdentifier(new byte[0], 1));
    verifyAckSend(true);

    // should expire with the this mentioned.
    verifyExpiry();
  }
Tests the functionality of operations of AbstractConnectionProxy & its derived classes.
geode-core/src/integrationTest/java/org/apache/geode/internal/cache/tier/sockets/ConnectionProxyIntegrationTest.java