It's also worth noting that "waitForCondition" requires "assertTrue", which
is easy to forget and we had a lot of bugs because of that.

Also, are you talking about both Ignite 2 and Ignite 3? Does Ignite 2 use
Awaitility?

On Wed, Oct 29, 2025 at 3:07 PM Pavel Tupitsyn <[email protected]> wrote:

> +1, sounds great. Did not know about that library.
>
> On Wed, Oct 29, 2025 at 2:58 PM Ivan Zlenko <[email protected]> wrote:
> >
> > Hi Ignite community!
> > I have a small proposition in regards to our testing.
> > We have an utility method called waitForCondition which we are using, as
> it
> > implies from the name of the method, to wait until some condition will be
> > met in the test. As soon as the condition is met this method returns
> true,
> > or false if the specified condition is not met for specified timeout.
> > After that our common pattern is to use assertTrue to verify whether
> > waitForCondition is completed successfully.
> > However we have a library awaitility in our test classpath in many
> modules
> > which are made for similar purposes. The main difference here is that
> this
> > library provides a clear message on what condition failed to meet in what
> > time frame.
> > Let's take a look at following example:
> >
> > assertTrue(waitForCondition(() -> 60 == 61, 5_000));
> >
> > In that case result of the assertion will be the following:
> >
> > org.opentest4j.AssertionFailedError:
> > Expected :true
> > Actual   :false
> >
> > As we can see it is hard to understand what went wrong.
> >
> > The same scenario using awaitility:
> >
> > await().timeout(Duration.ofSeconds(5)).until(() -> 60, equalTo(61));
> >
> > Will result in the following error:
> >
> > org.awaitility.core.ConditionTimeoutException: Lambda expression in
> >
> org.apache.ignite.internal.ItApplyPartitionRaftLogOnAnotherNodesCompatibilityTest
> > expected <61> but was <60> within 5 seconds.
> >
> > Not only is it easier to understand what we want to achieve in the
> > testing scenario, but the error message is much clearer compared to
> > waitForCondition.
> >
> > Also, we have a very huge bug in waitForCondition where it will not
> > work at all if the supplier is frozen or executing more than specified
> > timeout. For example:
> >
> > assertTrue(waitForCondition(() -> {
> >     try {
> >         Thread.sleep(10_000);
> >     } catch (InterruptedException e) {
> >         throw new RuntimeException(e);
> >     }
> >
> >     return true;
> > }, 5_000));
> >
> > I would've expected that this code snippet would fail after 5 seconds,
> > but it completes successfully after 10 seconds.
> >
> > So my proposition to the community is to deprecate waitForCondition
> > completely and eventually switch to awaitility through the whole
> > Ignite code base.
> >
> > Sincerely yours,
> >
> > Ivan Zlenko.
>


-- 
With regards,
Aleksandr Polovtsev

Reply via email to