@Test
  public void testS2CDeltaPropagationWithGIIAndFailover() {
    VM clientVM = getController();
    VM server1VM = vm0;
    VM server2VM = vm1;
    VM server3VM = vm2;

    for (VM vm : toArray(clientVM, server1VM, server2VM, server3VM)) {
      vm.invoke(this::prepareDeltas);
    }

    // Do puts after slowing the dispatcher.
    for (VM vm : toArray(server1VM, server2VM, server3VM)) {
      vm.invoke(() -> {
        System.setProperty(INTERNAL_FACTORY_PROPERTY, CACHE_CLIENT_PROXY_FACTORY_NAME);
        LATCH.set(new CountDownLatch(1));
      });
    }

    int serverPort1 = server1VM.invoke(() -> new ServerFactory()
        .regionShortcut(RegionShortcut.REPLICATE)
        .create());
    int serverPort2 = server2VM.invoke(() -> new ServerFactory()
        .regionShortcut(RegionShortcut.REPLICATE)
        .create());
    int serverPort3 = server3VM.invoke(() -> new ServerFactory()
        .regionShortcut(RegionShortcut.REPLICATE)
        .create());

    clientVM.invoke(() -> {
      new ClientFactory()
          .cacheListener(new ClientListener())
          .serverPorts(serverPort1, serverPort2, serverPort3)
          .subscriptionRedundancy(1)
          .create();

      Region<String, DeltaTestImpl> region = getClientCache().getRegion(regionName);
      region.registerInterest("ALL_KEYS");

      InternalPool pool = (InternalPool) PoolManager.getAll().values().stream().findFirst().get();

      VM primaryServerVM = pool.getPrimaryPort() == serverPort1 ? server1VM
          : pool.getPrimaryPort() == serverPort2 ? server2VM : server3VM;

      primaryServerVM.invoke(() -> {
        Region<String, Object> regionOnServer = getCache().getRegion(regionName);
        regionOnServer.create(DELTA_KEY, DELTA_VALUES[0]);
        for (int i = 1; i < EVENTS_SIZE; i++) {
          regionOnServer.put(DELTA_KEY, DELTA_VALUES[i]);
        }
        regionOnServer.put(LAST_KEY, "");
        closeCache();
      });

      await().until(LAST_KEY_RECEIVED::get);

      VM primaryServer2VM = pool.getPrimaryPort() == serverPort1 ? server1VM
          : pool.getPrimaryPort() == serverPort2 ? server2VM : server3VM;

      for (VM vm : toArray(server1VM, server2VM, server3VM)) {
        vm.invoke(() -> LATCH.get().countDown());
      }

      primaryServer2VM.invoke(this::closeCache);

      long fromDeltasOnClient = DeltaTestImpl.getFromDeltaInvokations();
      assertThat(fromDeltasOnClient).isEqualTo(EVENTS_SIZE - 1);
    });
  }
Tests that an update on a server with full Delta object causes distribution of the full Delta
instance, and not its delta bits, to other peers, even if that instance's
{@code hasDelta()} returns true.
geode-core/src/distributedTest/java/org/apache/geode/internal/cache/DeltaPropagationDUnitTest.java