Yep, I'm super happy with this approach vs. a third module just for the tests.
For clairty, here's a PR demonstrating the model we're proposing: https://github.com/apache/kafka/pull/4760 Thanks, -John On Thu, Mar 22, 2018 at 6:21 PM, Guozhang Wang <wangg...@gmail.com> wrote: > I'm +1 to the approach as well across modules that are going to have test > utils artifacts in the future. To me this seems to be a much smaller change > we can make to break the circular dependencies than creating a new package > for our own testing code. > > Guozhang > > On Thu, Mar 22, 2018 at 1:26 PM, Bill Bejeck <bbej...@gmail.com> wrote: > > > John, > > > > Thanks for the clear, detailed explanation. > > > > I'm +1 on what you have proposed. > > While I agree with you manually pulling in transitive test dependencies > is > > not ideal, in this case, I think it's worth it to get over the circular > > dependency hurdle and use streams:test-utils ourselves. > > > > -Bill > > > > On Thu, Mar 22, 2018 at 4:09 PM, John Roesler <j...@confluent.io> wrote: > > > > > Hey everyone, > > > > > > In 1.1, kafka-streams adds an artifact called > 'kafka-streams-test-utils' > > > (see > > > https://kafka.apache.org/11/documentation/streams/ > > > developer-guide/testing.html > > > ). > > > > > > The basic idea is to provide first-class support for testing Kafka > > Streams > > > applications. Without that, users were forced to either depend on our > > > internal test artifacts or develop their own test utilities, neither of > > > which is ideal. > > > > > > I think it would be great if all our APIs offered a similar module, and > > it > > > would all be good if we followed a similar pattern, so I'll describe > the > > > streams approach along with one challenge we had to overcome: > > > > > > ===================== > > > = Project Structure = > > > ===================== > > > > > > The directory structure goes: > > > > > > kafka/streams/ <- main module code here > > > /test-utils/ <- test utilities module here > > > /examples/ <- example usages here > > > > > > Likewise, the artifacts are: > > > > > > kafka-streams > > > kafka-streams-test-utils > > > kafka-streams-examples > > > > > > And finally, the Gradle build structure is: > > > > > > :streams > > > :streams:test-utils > > > :streams:examples > > > > > > > > > ============================= > > > = Problem 1: circular build = > > > ============================= > > > > > > In eat-your-own-dogfood tradition, we wanted to depend on our own > > > test-utils in our streams tests, but :streams:test-utils (obviously) > > > depends on :streams already. > > > > > > (:streams) <-- (:streams:test-utils) > > > \---> > > > > > > Luckily, Filipe Agapito found a way out of the conundrum ( > > > https://issues.apache.org/jira/browse/KAFKA-6474? > > > focusedCommentId=16402326&page=com.atlassian.jira. > > > plugin.system.issuetabpanels:comment-tabpanel#comment-16402326). > > > Many thanks to him for this contribution. > > > > > > * Add this to the ':streams' definition: > > > testCompile project(':streams:test-utils').sourceSets.main.output > > > > > > * And this to the ':streams:test-utils' definition: > > > compile project(':streams').sourceSets.main.output > > > > > > * And finally (because we also have tests for the examples), add this > to > > > the ':streams:examples' definition: > > > testCompile project(':streams:test-utils') > > > > > > > > > > > > By scoping the dependencies to 'sourceSets.main', we break the cyclic > > > dependency: > > > > > > (:streams main) <-- (:streams:test-utils main) > > > ^ ^ ^ > > > | / | > > > | / | > > > (:streams test) (:streams:test-utils test) > > > > > > > > > ============================================== > > > = Problem 2: missing transitive dependencies = > > > ============================================== > > > > > > Scoping the dependency to source-only skips copying transitive library > > > dependencies into the build & test environment, so we ran into the > > > following error in our tests for ':streams:test-utils' : > > > > > > java.lang.ClassNotFoundException: org.rocksdb.RocksDBException > > > > > > This kind of thing is easy to resolve, once you understand why it > > happens. > > > We just added this to the :test-utils build definition: > > > testCompile libs.rocksDBJni > > > > > > It's a little unfortunate to have to manually pull in transitive > > > dependencies for testing, but it's really the only downside of this > > > approach (so far). > > > > > > > > > > > > That's about it! This is partly to propose a similar model across other > > > parts of Kafka's API and partly to collect feedback on this approach. > > > > > > Thoughts? > > > -John > > > > > > > > > -- > -- Guozhang >