/**
   * Checks that GridTaskListener is only called once per task.
   *
   * @throws Exception If failed.
   */
  @SuppressWarnings({"BusyWait", "unchecked"})
  public void testGridTaskListener() throws Exception {
    final AtomicInteger cnt = new AtomicInteger(0);

    IgniteInClosure<IgniteFuture<?>> lsnr =
        new CI1<IgniteFuture<?>>() {
          @Override
          public void apply(IgniteFuture<?> fut) {
            assert fut != null;

            cnt.incrementAndGet();
          }
        };

    Ignite ignite = G.ignite(getTestGridName());

    assert ignite != null;

    ignite.compute().localDeployTask(TestTask.class, TestTask.class.getClassLoader());

    ComputeTaskFuture<?> fut = executeAsync(ignite.compute(), TestTask.class.getName(), null);

    fut.listen(lsnr);

    fut.get();

    while (cnt.get() == 0) {
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        error("Got interrupted while sleep.", e);

        break;
      }
    }

    assert cnt.get() == 1
        : "Unexpected GridTaskListener apply count [count=" + cnt.get() + ", expected=1]";
  }