Is there a preferred ordering of the above list of rules? Or is the
preferred ordering whichever passes?

On Wed, Nov 21, 2018 at 4:36 PM Mark Hanson <mhan...@pivotal.io> wrote:

> It is frowned upon.  VM.getVM(0) is now the accepted way to get VM 0.
>
> Thanks,
> Mark
>
>
> > On Nov 21, 2018, at 10:41 AM, Nabarun Nag <n...@pivotal.io> wrote:
> >
> > Will doing this  in the test,
> >
> > final Host host = Host.getHost(0);
> > VM server1 = host.getVM(startingVersion, 0);
> >
> > be frowned upon, if I use the above over using @Rule.
> >
> > Regards
> > Nabarun Nag
> >
> >> On Nov 21, 2018, at 10:36 AM, Robert Houghton <rhough...@pivotal.io>
> wrote:
> >>
> >> Great find, Patrick. I hope this shakes out some of the test bugs!
> >>
> >> On Wed, Nov 21, 2018, 10:34 Patrick Rhomberg <prhomb...@apache.org
> wrote:
> >>
> >>> tl;dr: Use JUnit RuleChain.
> >>> ----
> >>>
> >>> Hello all!
> >>>
> >>> Several [1] of our test @Rule classes make use of the fact that our
> DUnit
> >>> VMs Host is statically accessible to affect every test VM.  For
> instance,
> >>> the SharedCountersRule initializes a counter in every VM, and the
> >>> CleanupDUnitVMsRule bounces VMs before and after each test.
> >>>
> >>> Problematically, JUnit rules applied in an unpredictable /
> JVM-dependent
> >>> ordering. [2]  As a result, some flakiness we find in our tests may be
> the
> >>> result of unexpected interaction and ordering of our test rules. [3]
> >>>
> >>> Fortunately, a solution to this problem already exists.  Rule ordering
> can
> >>> be imposed by JUnit's RuleChain. [4]
> >>>
> >>> In early exploration with this rule, some tests failed due to the
> RuleChain
> >>> not being serializable.  However, as it should only apply to the test
> VM,
> >>> and given that it can be composed of (unannotated) rules that remain
> >>> accessible and serializable, it should be a simple matter of declaring
> the
> >>> offending field transient, as it will only be necessary in the test VM.
> >>>
> >>> So, you dear reader: while you're out there making Geode the best it
> can
> >>> be, if you find yourself in a test class that uses more than one rule
> >>> listed in [1], or if you notice some other rule not listed below that
> >>> reaches out to VMs as part of its @Before or @After, please update that
> >>> test to use the RuleChain to apply the rules in a predictable order.
> >>>
> >>> Imagination is Change.
> >>> ~Patrick
> >>>
> >>> [1] A probably-incomplete list of invasive rules can be found via
> >>> $> git grep -il inEveryVM | grep Rule.java
> >>>
> >>>
> geode-core/src/distributedTest/java/org/apache/geode/management/ManagementTestRule.java
> >>>
> geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/CacheRule.java
> >>>
> >>>
> geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClientCacheRule.java
> >>>
> >>>
> geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java
> >>>
> >>>
> geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java
> >>>
> >>>
> geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedUseJacksonForJsonPathRule.java
> >>>
> >>>
> geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/SharedCountersRule.java
> >>>
> >>> [2] See the documentation for rules here:
> >>> https://junit.org/junit4/javadoc/4.12/org/junit/Rule.html ; notably,
> >>> "However,
> >>> if there are multiple [Rule] fields (or methods) they will be applied
> in an
> >>> order that depends on your JVM's implementation of the reflection API,
> >>> which is undefined, in general."
> >>>
> >>> [3] For what it's worth, this was discovered after looking into why the
> >>> DistributedRule check fo suspicious strings caused the test *after* the
> >>> test that emitted the strings to fail.  It's only tangentially
> related, but
> >>> got me looking into when and how the @After was getting applied.
> >>>
> >>> [4]
> https://junit.org/junit4/javadoc/4.12/org/junit/rules/RuleChain.html
> >>>
> >
>
>

Reply via email to