private void doOps(String name, int numIterations, String clientGateName) {
    ClientCache cache = (ClientCache) getCache();
    Region region = cache.getRegion(name);
    getBlackboard().signalGate(clientGateName);
    try {
      getBlackboard().waitForGate("proceed", 30, SECONDS);
    } catch (TimeoutException | InterruptedException e) {
      throw new RuntimeException("failed to start", e);
    }
    String key = "lockingKey";
    String value = "lockingValue";
    for (int j = 0; j < numIterations; j++) {
      int operation = j % 5;
      switch (operation) {
        case 0:
          region.remove(key);
          break;
        case 1:
          region.putIfAbsent(key, value);
          break;
        case 2:
          region.invalidate(key);
          break;
        case 3:
          region.replace(key, value);
          break;
        case 4:
          region.replace(key, value, value);
          break;
        // case 5:
        // remove(k,v) can't be included in this test as it checks the old value
        // against what is in the local cache before sending the operation to the server
        // region.remove(key, value);
        // break;
        default:
          throw new RuntimeException("" + j + " % 5 == " + operation + "?");
      }
    }
  }
GEODE-3519 servers are not locking on remove or invalidate ops initiated by clients
<p>
This test sets up two servers each with a client attached. The clients perform operations on
the same key in a region which, in the servers, has Scope.GLOBAL. There should be no conflation
and each operation should obtain a lock.
geode-core/src/distributedTest/java/org/apache/geode/cache30/ClientServerCCEDUnitTest.java