public <K, J> void waitUntilSatisfied(Supplier<K> supplier, Function<K, J> examiner,
      Consumer<J> assertionConsumer, String assertionConsumerDescription, long timeout,
      TimeUnit unit)
      throws Exception {
    try {
      await(assertionConsumerDescription)
          .atMost(timeout, unit)
          .untilAsserted(() -> assertionConsumer.accept(examiner.apply(supplier.get())));
    } catch (ConditionTimeoutException e) {
      // There is a very slight race condition here, where the above could conceivably time out,
      // and become satisfied before the next supplier.get()
      throw new ConditionTimeoutException(
          "The observed result '" + supplier.get()
              + "' does not satisfy the provided assertionConsumer. \n" + e.getMessage());
    }
  }
This method wraps an {@link GeodeAwaitility#await()} call for more meaningful error
reporting.

@param <K> the type of results supplied by {@code supplier}
@param <J> the type of results returned by {@code examiner}
@param supplier Method to retrieve the result to be tested, e.g.,
       get a list of visible region mbeans
@param examiner Method to evaluate the result provided by {@code provider}, e.g.,
       get the length of the provided list.
       Use {@link java.util.function.Function#identity()} if {@code assertionConsumer}
       directly tests the value provided by {@code supplier}.
@param assertionConsumer assertThat styled condition on the output of {@code examiner} against
       which
       the {@code await().untilAsserted(...)} will be called. E.g.,
       {@code beanCount -> assertThat(beanCount, is(5))}
@param assertionConsumerDescription A description of the {@code assertionConsumer} method,
       for additional failure information should this call time out.
       E.g., "Visible region mbean count should be 5"
@param timeout With {@code unit}, the maximum time to wait before raising an exception.
@param unit With {@code timeout}, the maximum time to wait before raising an exception.
@throws org.awaitility.core.ConditionTimeoutException The timeout has been reached
@throws Exception Any exception produced by {@code provider.call()}
geode-dunit/src/main/java/org/apache/geode/test/junit/rules/MemberStarterRule.java