@Test // parallel, PartitionedRegion, GatewayEventSubstitutionFilter
  public void testParallelAsyncEventQueueWithSubstitutionFilter() {
    vm0.invoke(this::createCache);

    vm0.invoke(() -> createAsyncEventQueueWithGatewayEventSubstitutionFilter(asyncEventQueueId,
        new SpyAsyncEventListener(), new StringGatewayEventSubstitutionFilter(),
        100, dispatcherThreadCount, 100, true));

    vm0.invoke(() -> createPartitionedRegion(partitionedRegionName, asyncEventQueueId, -1, 0, 16));

    int numPuts = 10;
    vm0.invoke(() -> doPuts(partitionedRegionName, numPuts));

    vm0.invoke(this::waitForAsyncQueueToEmpty);

    vm0.invoke(() -> validateSubstitutionFilterInvocations(numPuts));
  }
Override as needed to add to the configuration, such as regionFactory.setOffHeap(boolean).
geode-core/src/distributedTest/java/org/apache/geode/internal/cache/wan/asyncqueue/AsyncEventListenerWithFilterDistributedTest.java