Hi All, Inspired by the discussion in this thread, there is a new KIP-470: TopologyTestDriver test input and output usability improvements: https://cwiki.apache.org/confluence/display/KAFKA/KIP-470%3A+TopologyTestDriver+test+input+and+output+usability+improvements
This KIP can be discarded if KIP-470 get accepted. Even this KIP might be rejected, migrating from this classes to KIP-470 is rather straighforward. There are addon package which can be used with any Kafka version >=1.1.0.before these are included to release. See info: https://github.com/jukkakarvanen/kafka-streams-test-topics Maven package: https://mvnrepository.com/artifact/com.github.jukkakarvanen/kafka-streams-test-topics Best Regards, Jukka to 9. toukok. 2019 klo 15.51 Patrik Kleindl (pklei...@gmail.com) kirjoitti: > Hi Jukka > Sorry, that was mostly what I had in mind, I didn't have enough time to > look through the KIP. > > My question was also if this handling of topics wouldn't make more sense > even outside the TTD, for the general API. > > regards > Patrik > > On Thu, 9 May 2019 at 14:43, Jukka Karvanen <jukka.karva...@jukinimi.com> > wrote: > > > Hi Patrick, > > > > Sorry, I need to clarify. > > In this current version of KIP in wiki, topic object are created with > > constructor where driver, topicName and serdes are provided. > > > > TestInputTopic<String, String> inputTopic = new TestInputTopic<String, > > String>(testDriver, INPUT_TOPIC, new Serdes.StringSerde(), new > > Serdes.StringSerde()); > > > > So if TopologyTestDriver modified, this could be > > > > TestInputTopic<String, String> inputTopic = > > testDriver.getInputTopic(INPUT_TOPIC, new Serdes.StringSerde(), new > > Serdes.StringSerde()); > > > > or preferrable if serders can be found: > > > > TestInputTopic<String, String> inputTopic = > > testDriver.getInputTopic(INPUT_TOPIC); > > > > This initialization done normally in test setup and after it can be used > > with topic object: > > > > inputTopic.pipeInput("Hello"); > > > > > > Or did you mean something else? > > > > Jukka > > > > > > > > > > to 9. toukok. 2019 klo 15.14 Patrik Kleindl (pklei...@gmail.com) > > kirjoitti: > > > > > Hi Jukka > > > Regarding your comment > > > > If there would be a way to find out needed serders for the topic, it > > > would make API even simpler. > > > I was wondering if it wouldn't make more sense to have a "topic object" > > > including the Serdes and use this instead of only passing in the name > as > > a > > > string everywhere. > > > From a low-level perspective Kafka does and should not care what is > > inside > > > the topic, but from a user perspective this information usually belongs > > > together. > > > Sidenote: Having topics as objects would probably also make it easier > to > > > track them from the outside. > > > regards > > > Patrik > > > > > > On Thu, 9 May 2019 at 10:39, Jukka Karvanen < > jukka.karva...@jukinimi.com > > > > > > wrote: > > > > > > > Hi, > > > > > > > > I will write new KIP for the TestTopologyDriver Input and Output > > > usability > > > > changes. > > > > It is out of the scope of the current title: "Helper classes to make > it > > > > simpler to write test logic with TopologyTestDriver" > > > > and we can get back to this KIP if that alternative is not favored. > > > > > > > > So my original approach was not to modify existing classes, but if we > > end > > > > up modifing TTD, I would also change the > > > > way to instantiate these topics. We could add > > getInputTopic("my-topic") / > > > > getOutputTopic("my-topic") to TTD, so it would work > > > > same way as with getStateStore and related methods. > > > > > > > > If there would be a way to find out needed serders for the topic, it > > > would > > > > make API even simpler. > > > > > > > > Generally still as a end user, I would prefer not only swapping the > > > > ConsumerRecord and ProducerRecord, but having > > > > interface accepting and returning Record, not needing to think about > > are > > > > those ConsumerRecord or ProducerRecords. > > > > and that way would could use same classes to pipe in and assert the > > > > result.Something similar than "private final static class Record" > > > > in TopologyTestDriverTest. > > > > > > > > Jukka > > > > > > > > ke 8. toukok. 2019 klo 17.01 John Roesler (j...@confluent.io) > > kirjoitti: > > > > > > > > > Hi Jukka, thanks for the reply! > > > > > > > > > > I think this is a good summary (the discussion was getting a little > > > > > unwieldy. I'll reply inline. > > > > > > > > > > Also, thanks for clarify about your library vs. this KIP. That > makes > > > > > perfect sense to me. > > > > > > > > > > > > 1. Add JavaDoc for KIP > > > > > > > > > > > > Is there a good example of KIP where Javadoc is included, so I > can > > > > > follow? > > > > > > I create this KIP based on this as an example:: > > > > > > > > > > > > > > > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-247%3A+Add+public+test+utils+for+Kafka+Streams > > > > > > > > > > > > > > > > > > Now added some comments to KIP page to clarify timestamp > handling, > > > but > > > > I > > > > > > did not want to add full JavaDoc of each methods. > > > > > > Is that enough? > > > > > > > > > > That's fine. I was just trying to make the review process more > > > > > efficient for other reviewers (which makes getting your KIP > accepted > > > > > more efficient). I reviewed a few recent KIPs, and, indeed, I see > > that > > > > > javadocs are not actually as common as I thought. > > > > > > > > > > > 2. TTD usability changes and swapping ConsumerRecord and > > > ProducerRecord > > > > > in > > > > > > APIs > > > > > > > > > > > > To my point of view only: > > > > > > - changing readRecord to return ConsumerRecord would cause we > > cannot > > > > use > > > > > > OutputVerifier > > > > > > > > > > Yes, we'd likely have to provide new methods in OutputVerifier to > > work > > > > > with ConsumerRecord. If you buy into the plan of deprecating most > of > > > > > the current-style interactions, this wouldn't be that confusing, > > since > > > > > all the ProducerRecord verifications would be deprecated, and only > > the > > > > > ConsumerRecord verifications would remain "live". > > > > > > > > > > > - changing pipeInput to take in ProducerRecord, but not providing > > > easy > > > > > way > > > > > > to contruct those like ConsumerRecordFactory > > > > > > > > > > I didn't follow this as well. The ConsumerRecordFactory is there > > > > > because it's a pain to construct ConsumerRecords. Conversely, > > > > > ProducerRecord has many convenience constructors, so we wouldn't > need > > > > > a factory at all. This is a net win for users, since there's less > > > > > surface area for them to deal with. Under my proposal, we'd > deprecate > > > > > the whole ConsumerRecordFactory. > > > > > > > > > > Note that there's an "idea parity check" here: ConsumerRecords are > > > > > hard to construct because developers aren't meant to ever construct > > > > > them. They are meant to construct ProducerRecords, which is why > it's > > > > > made easy. TTD has inverted the relationships of these classes, > which > > > > > is why the ConsumerRecordFactory is necessary, but if we correct > it, > > > > > and return to a "normal" interaction with the Client library, then > we > > > > > don't need special support classes. > > > > > > > > > > > - if initializing ConsumerRecord to/from ProducerRecord in > these > > > > > classes > > > > > > field by field contructor, there are risk new fields are not > added > > to > > > > > this > > > > > > classes if there are changes in ProducerRecord or ConsumerRecord > > > > > > > > > > This risk seems pretty low, to be honest. We will have tests that > > > > > exercise this testing framework, so if anyone changes > ProducerRecord > > > > > or ConsumerRecord, our tests will break. Since both libraries are > > > > > build together, the problem would be fixed before the change is > ever > > > > > merged to trunk. > > > > > > > > > > > I would propose a separate KIP for these and probably other > > > > > enhanchements: > > > > > > -superclass or common interface for ConsumerRecord and > > ProducerRecord > > > > > > -contructors to ConsumerRecord and ProducerRecord to initialize > > with > > > > this > > > > > > superclass > > > > > > -modify OutputVerifier to work with both ConsumerRecord and > > > > > ProducerRecord > > > > > > -create new RecordFactory to replace ConsumerRecordFactory > > > > > > > > > > I understand your motivation to control the scope of this change, > but > > > > > I actually think that it's better for user-facing design changes to > > > > > occur in fewer, bigger, chunks, rather than many small changes. > > People > > > > > will get fatigued if multiple releases in a row change the > > > > > test-support library from under their feet. Better to do it in one > > > > > shot. > > > > > > > > > > Plus, this is a design discussion. We need to include the whole > scope > > > > > of the system in the design, or we may realize in Phase 3 that > there > > > > > was some design error in Phase 1, since we were only designing > > > > > locally. This doesn't mean that we only need one Jira ticket, there > > > > > can be many in support of this KIP, or that we only need one PR, > it's > > > > > certainly better to send multiple small PRs to decrease risk and > ease > > > > > reviews. But the design discussion doesn't need to be fragmented > > > > > similarly. > > > > > > > > > > > 3. return null vs NoSuchElementException when empty queue > > > > > > > > > > > > Should this be also included to the above TTD usability changes? > > > > > > If single row read methods is changed to throw expectiong, it > would > > > > > require > > > > > > addition of hasRecords to able to verified the empty queue > > scenarios. > > > > > > I do not know how to implement it currently without modifying TTD > > to > > > > > > provide some kind way to get the queue size or peak items. > > > > > > > > > > Yes, it's absolutely within bounds to propose changes to TTD to > > > > > support the ergonomic API you're proposing. > > > > > > > > > > > 4. IllegalArgumentException("topic doesn't exist") > > > > > > Is this worth separate ticket? > > > > > > > > > > This is your call. That was just an idea in response to your > > > experience. > > > > > > > > > > > 5. org.apache.kafka.streams.test vs org.apache.kafka.streams > > > > > > > > > > > > I was thinking org.apache.kafka.streams.test where also > > > OutputVerifier > > > > > and > > > > > > ConsumerRecordFactory exist would be more logical place, but > > > > > > I do not know is there some technical reasons why TTD are in > > > > > > org.apache.kafka.streams, not in org.apache.kafka.streams.test > > where > > > > > other > > > > > > classes are. > > > > > > > > > > > > Did I skip something? > > > > > > > > > > Ah, no, you're right. I'm not sure why that is. I admit it's > > > > > confusing. I don't think the package matters *that* much, just keep > > it > > > > > wherever you think is appropriate. > > > > > > > > > > > > > > > That's all! Thanks for entertaining my thoughts. > > > > > -John > > > > > > > > > > > > > > >