@Test
  public void testVerifyDestroyNotReceivedBySender() {
    final int maxWaitTime = Integer.getInteger(WAIT_PROPERTY, WAIT_DEFAULT);
    // First create entries on both servers via the two client
    vm2.invoke(DestroyEntryPropagationDUnitTest::createEntriesK1andK2);
    vm3.invoke(DestroyEntryPropagationDUnitTest::createEntriesK1andK2);
    vm2.invoke(DestroyEntryPropagationDUnitTest::registerKey1);
    vm3.invoke(DestroyEntryPropagationDUnitTest::registerKey1);
    // Induce fail over of InterestList Endpoint to Server 2 by killing server1
    vm0.invoke(() -> DestroyEntryPropagationDUnitTest.killServer(PORT1));
    // Wait for 10 seconds to allow fail over. This would mean that Interest
    // has failed over to Server2.
    vm2.invoke(new CacheSerializableRunnable("Wait for server on port1 to be dead") {
      @Override
      public void run2() throws CacheException {
        Region r = cache.getRegion(REGION_NAME);

        try {
          r.put("ping", "pong1"); // Used in the case where we don't have a LiveServerMonitorThread
        } catch (CacheWriterException ignored) {
        }
        try {
          r.put("ping", "pong1"); // Used in the case where we don't have a LiveServerMonitorThread
        } catch (CacheWriterException ignored) {
        }

        String poolName = r.getAttributes().getPoolName();
        assertNotNull(poolName);
        final PoolImpl pool = (PoolImpl) find(poolName);
        assertNotNull(pool);
        WaitCriterion ev = new WaitCriterion() {
          @Override
          public boolean done() {
            return pool.getConnectedServerCount() != 2;
          }

          @Override
          public String description() {
            return null;
          }
        };
        GeodeAwaitility.await().untilAsserted(ev);
      }
    });

    // Start Server1 again so that both clients1 & Client 2 will establish
    // connection to server1 too.
    vm0.invoke(() -> DestroyEntryPropagationDUnitTest.startServer(PORT1));

    vm2.invoke(new CacheSerializableRunnable("Wait for server on port1 to spring to life") {
      @Override
      public void run2() throws CacheException {
        Region r = cache.getRegion(REGION_NAME);
        String poolName = r.getAttributes().getPoolName();
        assertNotNull(poolName);
        final PoolImpl pool = (PoolImpl) find(poolName);
        assertNotNull(pool);
        WaitCriterion ev = new WaitCriterion() {
          @Override
          public boolean done() {
            return pool.getConnectedServerCount() == 2;
          }

          @Override
          public String description() {
            return null;
          }
        };
        GeodeAwaitility.await().untilAsserted(ev);
      }
    });

    // Do a destroy on Server1 via Connection object from client1.
    // Client1 should not receive updated value while client2 should receive
    vm2.invoke(this::acquireConnectionsAndDestroyEntriesK1andK2);
    // pause(10000);
    // Check if both the puts ( on key1 & key2 ) have reached the servers
    vm0.invoke(DestroyEntryPropagationDUnitTest::verifyEntriesAreDestroyed);
    vm1.invoke(DestroyEntryPropagationDUnitTest::verifyEntriesAreDestroyed);

    vm2.invoke(DestroyEntryPropagationDUnitTest::verifyNoDestroyEntryInSender);
  }
This tests whether the destroy are received by the sender or not if there are situation of
Interest List fail over
geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DestroyEntryPropagationDUnitTest.java