I have a PR up to deprecate these classes and several other distributed test classes that use inheritance (I actually forgot to mention it here when I first put it up, whoops): https://github.com/apache/geode/pull/2841 I intend to merge it Monday evening if there are no objections.
I think I'll try to use the public facing APIs the next time I write a new test and see how it goes. Thanks, Galen On Mon, Nov 12, 2018 at 8:41 AM Jinmei Liao <jil...@pivotal.io> wrote: > I feel like we are mixing two topic in this discussion. One is to improve > our user API, and one is to write clean tests. Doing one doesn't have to > sacrifice the other. If our rules are using internal APIs, then it's a > chance to check if we can improve our APIs like Kirk has done. But stop > using the rules or change the rules to use a more verbose API should not > the way to go. My 2 cents. > > On Mon, Nov 12, 2018 at 4:22 AM Juan José Ramos <jra...@pivotal.io> wrote: > > > Hello all, > > > > What about mixing both approaches?. > > We can use the *Rules* to avoid duplication of code *but re-write them* > to > > directly use the Geode User APIs instead of the Geode Internal API. > > Just for the record, https://issues.apache.org/jira/browse/GEODE-5739 > was > > created for something similar (use [Server|Locator]Launcher instead of > > internal API in [Server|Locator]StarterRule), but it didn't get enough > > consent to be merged (leaving aside the huge amount of unrelated changes > in > > the PR, the idea itself was rejected). > > Cheers. > > > > > > On Fri, Nov 9, 2018 at 11:55 PM Jinmei Liao <jil...@pivotal.io> wrote: > > > > > Yeah, I guess. But why going out of this way to avoid using rules? Why > > > rules are bad? Rules just encapsulate common befores and afters to > avoid > > > duplicate code in every tests. I don't see why we should avoid using > it. > > > > > > On Fri, Nov 9, 2018, 3:44 PM Galen O'Sullivan <gosulli...@pivotal.io > > > wrote: > > > > > > > I wonder if we could use some sort of assertions to validate that > that > > > > tests have cleaned up, at least in a few ways? For example, if a > > > > Cache/Locator/DistributedSystem is still running after a test has > > > finished, > > > > that's a good sign of a dirty environment. If system properties are > > still > > > > set, that's a good sign of a dirty environment. We could use a custom > > > test > > > > runner, or even add a rule to all our tests en masse that checks that > > > > things are cleaned up. > > > > > > > > Jinmei, for single-JVM tests, you could write a method for your test > > (or > > > > test class) that sets whatever properties you need and returns a > Cache > > > > constructed with those properties. Then you can use > try-with-resources > > to > > > > make sure that the Cache is properly closed. Is that a good > alternative > > > to > > > > using a rule? > > > > > > > > On Fri, Nov 9, 2018 at 3:28 PM Helena Bales <hba...@pivotal.io> > wrote: > > > > > > > > > +1 for deprecating old test bases. Many of the tests that gave me > the > > > > most > > > > > trouble this summer were because of JUnit4CacheTestCase. > > > > > Also +1 for pulling out Blackboard into a rule. > > > > > > > > > > I will, however, argue for continuing to use ClusterStartupRule. > The > > > > > benefit of that is that it makes sure that all JVMs started for > > servers > > > > and > > > > > locators are cleaned up at the end of the tests, even if the tests > > > fail. > > > > We > > > > > could certainly spend time making that code easier to understand, > > but I > > > > > don't think that starting clusters is straightforward enough to > have > > > > > confidence that it will get done correctly every time. > Multi-threaded > > > > tests > > > > > should be a cautionary tale for this; some implementations were > fine, > > > but > > > > > many polluted the system with threads that never stopped and tests > > that > > > > > didn't actually test anything. > > > > > As I see it, we are paying in readability for tests that do things > > the > > > > > right way. > > > > > > > > > > On Fri, Nov 9, 2018 at 2:31 PM Kirk Lund <kl...@apache.org> wrote: > > > > > > > > > > > I would love to see you apply some of your passion for that to > > > > improving > > > > > > the User APIs so there's less boiler plate code for the Users as > > > well. > > > > > > > > > > > > Please don't forget that to Developers who are not familiar with > > our > > > > > Rules > > > > > > such as ClusterStarterRule, that it can be very difficult to > > > understand > > > > > > what it has done and how it has configured Geode. The more the > Rule > > > > does, > > > > > > the greater this problem. The fact that most of these Rules use > > > > Internal > > > > > > APIs instead of User APIs is also a problem in my opinion because > > > we're > > > > > not > > > > > > testing exactly what a User would do or can do. > > > > > > > > > > > > To many of us Developers, figuring out what all the rules have > > > > configured > > > > > > and done is a much bigger problem than it is to deal with verbose > > > code > > > > > in a > > > > > > setUp method that uses CacheFactory directly. On one hand I want > to > > > > say, > > > > > do > > > > > > as you prefer but we also have to consider that other Developers > > need > > > > to > > > > > > maintain these tests that are using the Rules, so I will continue > > to > > > > > > advocate for the writing of tests using Geode User APIs as much > as > > > > > possible > > > > > > for the reasons I already stated. > > > > > > > > > > > > On Fri, Nov 9, 2018 at 1:44 PM, Jinmei Liao <jil...@pivotal.io> > > > wrote: > > > > > > > > > > > > > I like using the rules because it reduces boiler plate code and > > the > > > > > > chance > > > > > > > of not cleaning up properly after your tests. It also make what > > you > > > > are > > > > > > > really trying to do in the test stand out more in the test > code. > > > > > > > > > > > > > > On Fri, Nov 9, 2018 at 1:37 PM Kirk Lund <kl...@apache.org> > > wrote: > > > > > > > > > > > > > > > We need to pull out the DUnit Blackboard from > > DistributedTestCase > > > > and > > > > > > > > repackage it as a BlackboardRule. It makes sense to make > that a > > > > JUnit > > > > > > > Rule > > > > > > > > because it's not part of Geode or its User APIs but it's > really > > > > > useful > > > > > > > for > > > > > > > > distributed testing in general. It's also probably the last > > > useful > > > > > > thing > > > > > > > > that's still in DistributedTestCase and no where else. > > > > > > > > > > > > > > > > On Fri, Nov 9, 2018 at 12:12 PM, Bruce Schuchardt < > > > > > > > bschucha...@pivotal.io> > > > > > > > > wrote: > > > > > > > > > > > > > > > > > I agree with Kirk about the Rules and I agree with Galen > > about > > > > > moving > > > > > > > > away > > > > > > > > > from the old abstract test classes. I think that is also > in > > > the > > > > > > spirit > > > > > > > > of > > > > > > > > > what Kirk is saying. > > > > > > > > > > > > > > > > > > There are also tests that have complicated methods for > > creating > > > > > > caches > > > > > > > > and > > > > > > > > > regions. These methods have many parameters and are > > sometimes > > > in > > > > > > > Helper > > > > > > > > > classes. I've found these especially difficult to deal > with > > > when > > > > > > > fixing > > > > > > > > > flaky tests because changing one of the Helper methods > > affects > > > > many > > > > > > > > tests. > > > > > > > > > > > > > > > > > > > > > > > > > > > On 11/9/18 11:31 AM, Kirk Lund wrote: > > > > > > > > > > > > > > > > > >> *I would like to encourage all Geode developers to start > > > writing > > > > > > tests > > > > > > > > >> directly against the Geode User APIs* even in > > > DistributedTests. > > > > > I'm > > > > > > no > > > > > > > > >> longer using *CacheRule, ClientCacheRule, > ServerStarterRule, > > > > > > > > >> LocatorStarterRule, or ClusterStarterRule* and I'm against > > > > > > encouraging > > > > > > > > >> > > > > > > > > >> their use any longer. I'll explain why below. > > > > > > > > >> > > > > > > > > >> Here's an example for an IntegrationTest that needs a > Cache > > > but > > > > > not > > > > > > > any > > > > > > > > >> CacheServers: > > > > > > > > >> > > > > > > > > >> private Cache cache; > > > > > > > > >> > > > > > > > > >> @Before > > > > > > > > >> public void setUp() { > > > > > > > > >> Properties config = new Properties(); > > > > > > > > >> config.setProperty(LOCATORS, ""); > > > > > > > > >> cache = new CacheFactory(config).create(); > > > > > > > > >> } > > > > > > > > >> > > > > > > > > >> @After > > > > > > > > >> public void tearDown() { > > > > > > > > >> cache.close(); > > > > > > > > >> } > > > > > > > > >> > > > > > > > > >> That's some pretty simple code and as a Developer, I can > > tell > > > > > > exactly > > > > > > > > what > > > > > > > > >> it's doing and what the config is. > > > > > > > > >> > > > > > > > > >> Here's an example of the kind of Geode User API code that > I > > > use > > > > to > > > > > > > > create > > > > > > > > >> Servers in a DistributedTests now: > > > > > > > > >> > > > > > > > > >> private void createServer(String serverName, File > > > serverDir, > > > > > int > > > > > > > > >> locatorPort) { > > > > > > > > >> ServerLauncher.Builder builder = new > > > > > ServerLauncher.Builder(); > > > > > > > > >> builder.setMemberName(serverName); > > > > > > > > >> > > builder.setWorkingDirectory(serverDir.getAbsolutePath()); > > > > > > > > >> builder.setServerPort(0); > > > > > > > > >> builder.set(LOCATORS, "localHost[" + locatorPort + > > "]"); > > > > > > > > >> builder.set(DISABLE_AUTO_RECONNECT, "false"); > > > > > > > > >> builder.set(ENABLE_CLUSTER_CONFIGURATION, "false"); > > > > > > > > >> builder.set(MAX_WAIT_TIME_RECONNECT, "1000"); > > > > > > > > >> builder.set(MEMBER_TIMEOUT, "2000"); > > > > > > > > >> > > > > > > > > >> serverLauncher = builder.build(); > > > > > > > > >> serverLauncher.start(); > > > > > > > > >> assertThat(serverLauncher.isRunning()).isTrue(); > > > > > > > > >> } > > > > > > > > >> > > > > > > > > >> In particular, I think we should be using ServerLauncher > and > > > > > > > > >> LocatorLauncher instead of Rules when we want a full-stack > > > > Locator > > > > > > or > > > > > > > > >> full-stack Server that looks like what a User is going to > > > > startup. > > > > > > > > >> > > > > > > > > >> Here are my reasons: > > > > > > > > >> > > > > > > > > >> 1) I want to learn and use the Geode User APIs directly, > not > > > > > > someone's > > > > > > > > >> (even mine) Testing API that hides the Geode User APIs. > If I > > > > see a > > > > > > > test > > > > > > > > >> fail, I want to see exactly what was configured and what > > User > > > > APIs > > > > > > > were > > > > > > > > >> used right there in the test without having to open other > > > > > classes. I > > > > > > > > don't > > > > > > > > >> want to have to spend even 15 minutes digging through some > > > JUnit > > > > > > Rule > > > > > > > to > > > > > > > > >> figure out how PDX was configured. > > > > > > > > >> > > > > > > > > >> 2) We need to make sure that the Geode User APIs are easy > to > > > use > > > > > and > > > > > > > are > > > > > > > > >> complete. If we're writing tests against Testing APIs > > instead > > > > then > > > > > > we > > > > > > > > >> don't > > > > > > > > >> feel the Users' pain if our API is painful. If the reason > to > > > > use a > > > > > > > Rule > > > > > > > > is > > > > > > > > >> because our User API is overly-verbose of difficult, then > > > that's > > > > > > even > > > > > > > > more > > > > > > > > >> reason to use the Geode User API, so we recognize that it > > > needs > > > > to > > > > > > > > change! > > > > > > > > >> > > > > > > > > >> GemFire had a long history of hiding its User APIs behind > > > > > elaborate > > > > > > > > >> Testing > > > > > > > > >> APIs and we all used these fancy, easier to use, more > > compact > > > > > > Testing > > > > > > > > >> APIs. > > > > > > > > >> This promotes complicated, inconsistent and potentially > > > > incomplete > > > > > > > User > > > > > > > > >> APIs for Users to actually use. The result: difficult to > use > > > > > product > > > > > > > > with > > > > > > > > >> difficult to use APIs and User APIs that are missing > > important > > > > > > things > > > > > > > > that > > > > > > > > >> then Users have to resort to internal APIs to use. I'm > > > strongly > > > > > > > > convinced > > > > > > > > >> that using elaborate Testing APIs is at least largely > > > > responsible > > > > > > for > > > > > > > > >> making GemFire and now Geode difficult to use and that's > why > > > I'm > > > > > > > pushing > > > > > > > > >> so > > > > > > > > >> hard to write tests with Geode User APIs instead of > > convenient > > > > > > custom > > > > > > > > >> Rules > > > > > > > > >> > > > > > > > > >> Since I started using ServerLauncher and LocatorLauncher > > APIs > > > > > > directly > > > > > > > > in > > > > > > > > >> my DistributedTests I made a very important discovery: the > > > User > > > > > has > > > > > > no > > > > > > > > way > > > > > > > > >> to get a reference to the Cache. This is why I recently > > > started > > > > a > > > > > > > > >> discussion thread about add getCache and getLocator to > these > > > > > > Launcher > > > > > > > > >> APIs. > > > > > > > > >> If we keep using elaborate Testing APIs including custom > > Geode > > > > > JUnit > > > > > > > > Rules > > > > > > > > >> to hide these APIs, we'll never make these discoveries > that > > I > > > > feel > > > > > > are > > > > > > > > >> vital for our Users. We need to make things a LOT easier > for > > > the > > > > > > Users > > > > > > > > >> going forward. > > > > > > > > >> > > > > > > > > >> The above is why I think we should be using User APIs in > the > > > > tests > > > > > > > even > > > > > > > > >> for > > > > > > > > >> setUp and tearDown. Save the custom JUnit Rules for > > NON-GEODE > > > > > things > > > > > > > > like > > > > > > > > >> configuring JSON or LOG4J or allowing use of > ErrorCollector > > in > > > > all > > > > > > > DUnit > > > > > > > > >> VMs. > > > > > > > > >> > > > > > > > > >> Thanks, > > > > > > > > >> Kirk > > > > > > > > >> > > > > > > > > >> On Fri, Nov 9, 2018 at 10:49 AM, Galen O'Sullivan < > > > > > > > > gosulli...@pivotal.io> > > > > > > > > >> wrote: > > > > > > > > >> > > > > > > > > >> I was looking at a test recently that extended > > > > JUnit4CacheTestCase > > > > > > and > > > > > > > > >>> only > > > > > > > > >>> used a single server, and changed it to use > > > ClusterStartupRule. > > > > > > > > >>> > > > > > > > > >>> JUnit4CacheTestCase adds additional complexity to > > > > > > > > >>> JUnit4DistributedTestCase > > > > > > > > >>> and with the move to ClusterStartupRule for distributed > > > tests, > > > > > > rather > > > > > > > > >>> than > > > > > > > > >>> class inheritance, I think we should deprecate > > > > > JUnit4CacheTestCase > > > > > > > and > > > > > > > > >>> change the comment to imply that classes should inherit > > from > > > it > > > > > > just > > > > > > > > >>> because they require a Cache. > > > > > > > > >>> > > > > > > > > >>> Is is worth deprecating JUnit4DistributedTestCase as well > > and > > > > > > > > encouraging > > > > > > > > >>> the use of ClusterStartupRule instead? > > > > > > > > >>> > > > > > > > > >>> Thanks, > > > > > > > > >>> Galen > > > > > > > > >>> > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > Cheers > > > > > > > > > > > > > > Jinmei > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > Juan José Ramos Cassella > > Senior Technical Support Engineer > > Email: jra...@pivotal.io > > Office#: +353 21 4238611 > > Mobile#: +353 87 2074066 > > After Hours Contact#: +1 877 477 2269 > > Office Hours: Mon - Thu 08:30 - 17:00 GMT. Fri 08:30 - 16:00 GMT > > How to upload artifacts: > > https://support.pivotal.io/hc/en-us/articles/204369073 > > How to escalate a ticket: > > https://support.pivotal.io/hc/en-us/articles/203809556 > > > > [image: support] <https://support.pivotal.io/> [image: twitter] > > <https://twitter.com/pivotal> [image: linkedin] > > <https://www.linkedin.com/company/3048967> [image: facebook] > > <https://www.facebook.com/pivotalsoftware> [image: google plus] > > <https://plus.google.com/+Pivotal> [image: youtube] > > < > https://www.youtube.com/playlist?list=PLAdzTan_eSPScpj2J50ErtzR9ANSzv3kl> > > > > > -- > Cheers > > Jinmei >