Thanks for the correction Bruce!
> On Nov 26, 2018, at 10:04 AM, Bruce Schuchardt <bschucha...@pivotal.io> wrote:
>
> While it's common to use VM.getVM(int) to get a VM you still must use
> Host.getHost() to get a VM running an older version of Geode. Until someone
> adds a VM.getVM(version, vmNumber) we can't frown upon
> Host.getHost(0).getVM(startingVersion, 0).
>
> On 11/21/18 4:09 PM, Mark Hanson 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
>>>>>