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

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

    int serverPort = server1VM.invoke(() -> {
      int port = new ServerFactory()
          .cacheListener(new ClientToServerToServerListener())
          .evictionPolicy(HARegionQueue.HA_EVICTION_POLICY_MEMORY)
          .create();

      Region<String, DeltaTestImpl> region = getCache().getRegion(regionName);
      region.create(DELTA_KEY, DELTA_VALUES[0]);

      return port;
    });
    server2VM.invoke(() -> {
      new ServerFactory()
          .cacheListener(new ClientToServerToServerListener())
          .evictionPolicy(HARegionQueue.HA_EVICTION_POLICY_MEMORY)
          .create();

      Region<String, DeltaTestImpl> region = getCache().getRegion(regionName);
      region.create(DELTA_KEY, DELTA_VALUES[0]);
    });

    clientVM.invoke(() -> {
      new ClientFactory()
          .cacheListener(new ClientListener())
          .serverPorts(serverPort)
          .create();

      Region<String, DeltaTestImpl> region = getClientCache().getRegion(regionName);
      region.create(DELTA_KEY, DELTA_VALUES[0]);
    });

    // Invalidate the value at both the servers.
    for (VM serverVM : toArray(server1VM, server2VM)) {
      serverVM.invoke(() -> {
        Region<String, DeltaTestImpl> region = getCache().getRegion(regionName);
        region.localInvalidate(DELTA_KEY);
      });
    }
    for (VM serverVM : toArray(server1VM, server2VM)) {
      serverVM.invoke(() -> {
        await().untilAsserted(() -> assertThat(INVALIDATE_COUNTER.get()).isEqualTo(1));
      });
    }

    clientVM.invoke(() -> {
      Region<String, DeltaTestImpl> region = getClientCache().getRegion(regionName);
      region.put(DELTA_KEY, DELTA_VALUES[1]);
    });

    // Assert that server1VM distributed val as full value to server2VM.
    server2VM.invoke(() -> await().untilAsserted(() -> {
      Region<String, DeltaTestImpl> region = getCache().getRegion(regionName);
      DeltaTestImpl deltaValue = region.getEntry(DELTA_KEY).getValue();

      assertThat(deltaValue).isEqualTo(DELTA_VALUES[1]);
    }));

    for (VM vm : toArray(server1VM, server2VM)) {
      vm.invoke(() -> {
        assertThat(DeltaTestImpl.deltaFeatureUsed()).isFalse();
      });
    }

    clientVM.invoke(() -> {
      assertThat(DeltaTestImpl.deltaFeatureUsed()).isTrue();
    });
  }
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