private void doTest() throws CacheException {
    AttributesFactory af = new AttributesFactory();
    af.setDataPolicy(DataPolicy.REPLICATE);
    af.setScope(Scope.DISTRIBUTED_ACK);
    CacheListener cl1 = new CacheListenerAdapter() {
      @Override
      public void afterCreate(EntryEvent e) {
        assertEquals(getCurrentExpectedKey(), e.getKey());
        assertEquals(callbackArg, e.getCallbackArgument());
        assertEquals(true, e.isCallbackArgumentAvailable());
      }
    };
    af.addCacheListener(cl1);
    Region r1 = createRootRegion("r1", af.create());
    Region r2 = r1.createSubregion("r2", af.create());
    r2.createSubregion("r3", af.create());

    TransactionListener tl1 = new TransactionListenerAdapter() {
      @Override
      public void afterCommit(TransactionEvent e) {
        assertEquals(6, e.getEvents().size());
        ArrayList keys = new ArrayList();
        for (final org.apache.geode.cache.CacheEvent<?, ?> cacheEvent : e.getEvents()) {
          EntryEvent ee = (EntryEvent) cacheEvent;
          keys.add(ee.getKey());
          assertEquals(callbackArg, ee.getCallbackArgument());
          assertEquals(true, ee.isCallbackArgumentAvailable());
        }
        assertEquals(expectedKeys, keys);
        invokeCount = 1;
      }
    };
    CacheTransactionManager ctm = getCache().getCacheTransactionManager();
    ctm.addListener(tl1);

    invokeCount = 0;
    clCount = 0;
    expectedKeys = Arrays.asList("b", "c", "a", "a2", "c2", "b2");
    doCommitOtherVm();
    assertEquals(1, invokeCount);
    assertEquals(6, clCount);
  }
make sure callback arg is NOT_AVAILABLE in all the places it should be
geode-core/src/distributedTest/java/org/apache/geode/cache30/CallbackArgDUnitTest.java