You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geode.apache.org by Kirk Lund <kl...@apache.org> on 2020/03/18 18:11:52 UTC

Tips on using AsyncInvocation in DUnit Tests

Tips on using AsyncInvocation:

* Always use await() or get()
* Both check and throw any remote exceptions
* Both use GeodeAwaitility Timeout and will throw TimeoutException if it’s
exceeded
* Use await() for Void types and get() when expecting a non-null value

Recent improvements:

Timeout now gets a remote stack trace to use as the cause and dumps stack
traces for that JVM’s threads.

You can also declare your instance of AsyncInvocation as a Future and
simply use the standard Java API for Futures. This basically means the test
will invoke get() for both Void and non-Void types.

AsyncInvocation handles everything for you when you invoke await() or get()
-- there is no need to invoke any of the deprecated APIs on AsyncInvocation:
* Both use the GeodeAwaitility Timeout and throw TImeoutException
* If Timeout occurs, AsyncInvocation will use the remote stack trace of the
stuck thread as the cause and it will also print all threads stacks for
that DUnit VM to facilitate debugging
* Both will check for a remote failure and rethrow it

Re: Tips on using AsyncInvocation in DUnit Tests

Posted by Kirk Lund <kl...@apache.org>.
Sure thing!

package org.apache.geode.examples;

import static org.apache.geode.test.dunit.VM.getVM;
import static org.assertj.core.api.Assertions.assertThat;

import java.io.Serializable;
import java.util.concurrent.Future;

import org.junit.Rule;
import org.junit.Test;

import org.apache.geode.test.dunit.AsyncInvocation;
import org.apache.geode.test.dunit.rules.DistributedRule;

public class ExampleDistributedTest implements Serializable {

  @Rule
  public DistributedRule distributedRule = new DistributedRule(1);

  /**
   * Awaits completion of AsyncInvocation with Void type.
   */
  @Test
  public void awaitCompletionOfAsyncInvocation() throws Exception {
    AsyncInvocation<Void> asyncActionInVM0 = getVM(0).invokeAsync(() ->
doAsyncAction());

    // do other actions in parallel

    asyncActionInVM0.await();
  }

  /**
   * Awaits completion of AsyncInvocation and then returns its result.
   */
  @Test
  public void getResultOfAsyncInvocation() throws Exception {
    AsyncInvocation<Serializable> asyncActionInVM0 =
        getVM(0).invokeAsync(() -> doAsyncActionWithReturnValue());

    // do other actions in parallel

    Serializable result = asyncActionInVM0.get();
    assertThat(result).isNotNull();
  }

  /**
   * Awaits completion of AsyncInvocation as a Future with Void type.
   */
  @Test
  public void awaitCompletionOfFuture() throws Exception {
    Future<Void> asyncActionInVM0 = getVM(0).invokeAsync(() ->
doAsyncAction());

    // do other actions in parallel

    asyncActionInVM0.get();
  }

  /**
   * Awaits completion of AsyncInvocation as a Future and then returns its
result.
   */
  @Test
  public void getResultOfFuture() throws Exception {
    Future<Serializable> asyncActionInVM0 =
        getVM(0).invokeAsync(() -> doAsyncActionWithReturnValue());

    // do other actions in parallel

    Serializable result = asyncActionInVM0.get();
    assertThat(result).isNotNull();
  }

  private void doAsyncAction() {
    // do some work that will need to execute asynchronously
  }

  private Serializable doAsyncActionWithReturnValue() {
    // do some work that will need to execute asynchronously
    return "Result";
  }
}

On Wed, Mar 18, 2020 at 3:17 PM Anilkumar Gingade <ag...@pivotal.io>
wrote:

> Thanks Kirk. Can you add an example here...
>
> On Wed, Mar 18, 2020 at 11:12 AM Kirk Lund <kl...@apache.org> wrote:
>
> > Tips on using AsyncInvocation:
> >
> > * Always use await() or get()
> > * Both check and throw any remote exceptions
> > * Both use GeodeAwaitility Timeout and will throw TimeoutException if
> it’s
> > exceeded
> > * Use await() for Void types and get() when expecting a non-null value
> >
> > Recent improvements:
> >
> > Timeout now gets a remote stack trace to use as the cause and dumps stack
> > traces for that JVM’s threads.
> >
> > You can also declare your instance of AsyncInvocation as a Future and
> > simply use the standard Java API for Futures. This basically means the
> test
> > will invoke get() for both Void and non-Void types.
> >
> > AsyncInvocation handles everything for you when you invoke await() or
> get()
> > -- there is no need to invoke any of the deprecated APIs on
> > AsyncInvocation:
> > * Both use the GeodeAwaitility Timeout and throw TImeoutException
> > * If Timeout occurs, AsyncInvocation will use the remote stack trace of
> the
> > stuck thread as the cause and it will also print all threads stacks for
> > that DUnit VM to facilitate debugging
> > * Both will check for a remote failure and rethrow it
> >
>

Re: Tips on using AsyncInvocation in DUnit Tests

Posted by Anilkumar Gingade <ag...@pivotal.io>.
Thanks Kirk. Can you add an example here...

On Wed, Mar 18, 2020 at 11:12 AM Kirk Lund <kl...@apache.org> wrote:

> Tips on using AsyncInvocation:
>
> * Always use await() or get()
> * Both check and throw any remote exceptions
> * Both use GeodeAwaitility Timeout and will throw TimeoutException if it’s
> exceeded
> * Use await() for Void types and get() when expecting a non-null value
>
> Recent improvements:
>
> Timeout now gets a remote stack trace to use as the cause and dumps stack
> traces for that JVM’s threads.
>
> You can also declare your instance of AsyncInvocation as a Future and
> simply use the standard Java API for Futures. This basically means the test
> will invoke get() for both Void and non-Void types.
>
> AsyncInvocation handles everything for you when you invoke await() or get()
> -- there is no need to invoke any of the deprecated APIs on
> AsyncInvocation:
> * Both use the GeodeAwaitility Timeout and throw TImeoutException
> * If Timeout occurs, AsyncInvocation will use the remote stack trace of the
> stuck thread as the cause and it will also print all threads stacks for
> that DUnit VM to facilitate debugging
> * Both will check for a remote failure and rethrow it
>