Thanks for the update, Jukka! I'd be in favor of the current proposal. Not sure how the others feel. If people generally feel positive, it might be time to start a vote.
Thanks, -John On Sat, Sep 7, 2019 at 12:40 AM Jukka Karvanen <jukka.karva...@jukinimi.com> wrote: > > Hi, > > Sorry; I need to rollback right away the one method removal what I was > proposing. > > One constructor with Long restored to TestRecord, which is needed by > TestInputTopic. > > Regards, > Jukka > > la 7. syysk. 2019 klo 8.06 Jukka Karvanen (jukka.karva...@jukinimi.com) > kirjoitti: > > > Hi, > > > > Let's get back to this after summer break. > > Thanks Antony to offering help, it might be needed. > > > > I modified the KIP based on the feedback to be a mixture of variations 4 > > and 5. > > > > In TestInputTopic I removed deprecation from one variation with long > > timestamp and removed totally one version without key. > > The existing test code with it can be easily migrated to use remaining > > method adding null key. > > > > In TestRecord I removed constructors with Long timestamp from the public > > interface. You can migrate existing code > > with Long timestamp constructors to use constructors with ProducerRecord > > or ConsumerRecord. > > There is still Long timestamp(); method like in ProducerRecord / > > ConsumerRecord. > > > > Is this acceptable alternative? > > What else is needed to conclude the discussion phase and get to voting? > > > > Regards, > > Jukka > > > > to 5. syysk. 2019 klo 17.17 Antony Stubbs (ant...@confluent.io) kirjoitti: > > > >> Hi Jukka! I just came across your work - it looks great! I was taking a > >> stab at improving the existing API, but yours already looks great and just > >> about complete! Are you planning on continuing your work and submitting a > >> PR? If you want some help, I'd be happy to jump in. > >> > >> Regards, > >> Antony. > >> > >> On Thu, Aug 1, 2019 at 3:42 PM Bill Bejeck <bbej...@gmail.com> wrote: > >> > >> > Hi Jukka, > >> > > >> > I also think 3, 4, and 5 are all good options. > >> > > >> > My personal preference is 4, but I also wouldn't mind going with 5 if > >> that > >> > is what others want to do. > >> > > >> > Thanks, > >> > Bill > >> > > >> > On Tue, Jul 30, 2019 at 9:31 AM John Roesler <j...@confluent.io> wrote: > >> > > >> > > Hey Jukka, > >> > > > >> > > Sorry for the delay. > >> > > > >> > > For what it's worth, I think 3, 4, and 5 are all good options. I > >> guess my > >> > > own preference is 5. > >> > > > >> > > It seems like the migration pain is a one-time concern vs. having more > >> > > maintainable code for years thereafter. > >> > > > >> > > Thanks, > >> > > -John > >> > > > >> > > > >> > > > >> > > On Tue, Jul 2, 2019 at 4:03 AM Jukka Karvanen < > >> > jukka.karva...@jukinimi.com > >> > > > > >> > > wrote: > >> > > > >> > > > Hi Matthias, > >> > > > > >> > > > Generally I think using Instant and Duration make the test more > >> > readable > >> > > > and that's why I modified KIP based on your suggestion. > >> > > > Now a lot of code use time with long or Long and that make the > >> change > >> > > more > >> > > > complicated. > >> > > > > >> > > > What I tried to say about the migration is the lines without > >> timestamp > >> > or > >> > > > if long timestamp is supported can be migrated mainly with search & > >> > > > recplace: > >> > > > > >> > > > > >> > > > > >> > > > >> > > >> testDriver.pipeInput(recordFactory.create(WordCountLambdaExample.inputTopic, > >> > > > nullKey, "Hello", 1L)); > >> > > > > >> > > > -> > >> > > > > >> > > > *inputTopic*.pipeInput(nullKey, "Hello", 1L); > >> > > > > >> > > > If long is not supported as timestamp, the same is not so easy: > >> > > > > >> > > > > >> > > > > >> > > > >> > > >> testDriver.pipeInput(recordFactory.create(WordCountLambdaExample.inputTopic, > >> > > > nullKey, "Hello", 1L)); > >> > > > > >> > > > -> > >> > > > > >> > > > *inputTopic1*.pipeInput(nullKey, "Hello", Instant.ofEpochMilli(1L)); > >> > > > > >> > > > Also if you need to convert arbitrary long timestamps to proper time > >> > > > Instants, it require you need to understand the logic of the test. > >> So > >> > > > mechanical search & replace is not possible. > >> > > > > >> > > > > >> > > > I see there are several alternatives for long vs Instant / Duration: > >> > > > > >> > > > 1. All times as long/Long like in this version: > >> > > > > >> > > > > >> > > > >> > > >> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=119550011 > >> > > > > >> > > > (startTimestampMs, autoAdvanceMs as parameter of createInputTopic > >> > > > instead of configureTiming) > >> > > > > >> > > > 2. Auto timestamping configured with Instant and Duration, pipeInput > >> > > > and TestRecord with long: > >> > > > > >> > > > > >> > > > >> > > >> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=120722523 > >> > > > > >> > > > > >> > > > 3. (CURRENT) Auto timestamping configured with Instant and Duration, > >> > > > pipeInput and TestRecord with Instant, version with long deprecated: > >> > > > > >> > > > > >> > > > > >> > > > >> > > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-470%3A+TopologyTestDriver+test+input+and+output+usability+improvements > >> > > > > >> > > > > >> > > > 4. Auto timestamping configured with Instant and Duration, pipeInput > >> > > > and TestRecord with Instant and long parallel (with long not > >> > > > deprecated): > >> > > > > >> > > > 5. Auto timestamping configured with Instant and Duration, pipeInput > >> > > > and TestRecord with Instant only > >> > > > > >> > > > I hope to get feedback. > >> > > > > >> > > > My own preference currently is alternative 3. or 4. > >> > > > > >> > > > > >> > > > If somebody want to test, there is a implementation of this version > >> > > > available in Github: > >> > > > > >> > > > https://github.com/jukkakarvanen/kafka-streams-test-topics > >> > > > > >> > > > which can be used directly from public Maven repository: > >> > > > > >> > > > <dependency> > >> > > > <groupId>com.github.jukkakarvanen</groupId> > >> > > > <artifactId>kafka-streams-test-topics</artifactId> > >> > > > <version>0.0.1-beta3</version> > >> > > > <scope>test</scope> > >> > > > </dependency> > >> > > > > >> > > > Also is this approach in KIP-470 preferred over KIP-456, so can we > >> > close > >> > > > it: > >> > > > > >> > > > > >> > > > > >> > > > >> > > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-456%3A+Helper+classes+to+make+it+simpler+to+write+test+logic+with+TopologyTestDriver > >> > > > > >> > > > Jukka > >> > > > > >> > > > . > >> > > > > >> > > > > >> > > > pe 28. kesäk. 2019 klo 1.10 Matthias J. Sax (matth...@confluent.io) > >> > > > kirjoitti: > >> > > > > >> > > > > Thanks Jukka! > >> > > > > > >> > > > > The idea to use `Instant/Duration` was a proposal. If we think > >> it's > >> > not > >> > > > > a good one, we could still stay with `long`. Because > >> `ProducerRecord` > >> > > > > and `ConsumerRecord` are both based on `long,` it might make > >> sense to > >> > > > > keep `long`? > >> > > > > > >> > > > > > The result of converting millis to Instant directly generates > >> > > > > >> rather non readable test code and changing from long to Instant > >> > > > > correctly > >> > > > > >> require understand what is the case it is testing. > >> > > > > > >> > > > > This might be a good indicator the using `Instant/Duration` might > >> not > >> > > be > >> > > > > a good idea. > >> > > > > > >> > > > > Would be nice to get feedback from others. > >> > > > > > >> > > > > About adding new methods that we deprecate immediately: I don't > >> think > >> > > we > >> > > > > should do this. IMHO, there are two kind of users, one that > >> > immediately > >> > > > > rewrite their code to move off deprecated methods. Those won't use > >> > the > >> > > > > new+deprecated ones anyway. Other uses migrate their code slowly > >> and > >> > > > > would just not rewrite their code at all, and thus also not use > >> the > >> > > > > new+deprecated methods. > >> > > > > > >> > > > > > Checking my own tests I was able to migrate the most of my code > >> > with > >> > > > > > search&replace without further thinking about the logic to this > >> new > >> > > > > > approach. The result of converting millis to Instant directly > >> > > generates > >> > > > > > rather non readable test code and changing from long to Instant > >> > > > correctly > >> > > > > > require understand what is the case it is testing. > >> > > > > > >> > > > > Not sure if I can follow here. You first say, you could easily > >> > migrate > >> > > > > your code, but than you say it was not easily possible? Can you > >> > clarify > >> > > > > your experience upgrading your test code? > >> > > > > > >> > > > > > >> > > > > -Matthias > >> > > > > > >> > > > > > >> > > > > On 6/27/19 12:21 AM, Jukka Karvanen wrote: > >> > > > > > Hi, > >> > > > > > > >> > > > > >>> (4) Should we switch from `long` for timestamps to `Instant` > >> and > >> > > > > > `Duration` ? > >> > > > > >> This version startTimestamp is Instant and autoAdvance > >> Duration in > >> > > > > > Initialization and with manual configured collection pipe > >> methods. > >> > > > > >> Now timestamp of TestRecord is still Long and similarly single > >> > > record > >> > > > > > pipeInput still has long as parameter. > >> > > > > >> Should these also converted to to Instant type? > >> > > > > >> Should there be both long and Instant parallel? > >> > > > > >> I expect there are existing test codebase which would be > >> easier to > >> > > > > migrate > >> > > > > > if long could be still used. > >> > > > > > Now added Instant version to TestRecord and pipeInput method. > >> > > > > > > >> > > > > > Checking my own tests I was able to migrate the most of my code > >> > with > >> > > > > > search&replace without further thinking about the logic to this > >> new > >> > > > > > approach. The result of converting millis to Instant directly > >> > > generates > >> > > > > > rather non readable test code and changing from long to Instant > >> > > > correctly > >> > > > > > require understand what is the case it is testing. > >> > > > > > > >> > > > > > That is why version with long left still as deprecated for > >> easier > >> > > > > migration > >> > > > > > for existing test. > >> > > > > > Also TopologyTestDriver constructor and advanceWallClockTime > >> > method > >> > > > > > modified with same approach. > >> > > > > > > >> > > > > > Jukka > >> > > > > > > >> > > > > > > >> > > > > > ma 24. kesäk. 2019 klo 16.47 Bill Bejeck (bbej...@gmail.com) > >> > > > kirjoitti: > >> > > > > > > >> > > > > >> Hi Jukka > >> > > > > >> > >> > > > > >>> These topic objects are only interfacing TopologyTestDriver, > >> not > >> > > > > >> affecting > >> > > > > >>> the internal functionality of it. In my plan the internal data > >> > > > > structures > >> > > > > >>> are using those Producer/ConsumerRecords as earlier. That way > >> I > >> > > don't > >> > > > > see > >> > > > > >>> how those could be affected. > >> > > > > >> > >> > > > > >> I mistakenly thought the KIP was proposing to completely remove > >> > > > > >> Producer/ConsumerRecords in favor of TestRecord. But taking > >> > another > >> > > > > quick > >> > > > > >> look I can see the plan for using the TestRecord objects. > >> Thanks > >> > > for > >> > > > > the > >> > > > > >> clarification. > >> > > > > >> > >> > > > > >> -Bill > >> > > > > >> > >> > > > > >> On Sat, Jun 22, 2019 at 2:26 AM Jukka Karvanen < > >> > > > > >> jukka.karva...@jukinimi.com> > >> > > > > >> wrote: > >> > > > > >> > >> > > > > >>> Hi All, > >> > > > > >>> Hi Matthias, > >> > > > > >>> > >> > > > > >>>> (1) It's a little confusing that you list all method > >> (existing, > >> > > > > proposed > >> > > > > >>>> to deprecate, and new one) of `TopologyTestDriver` in the > >> KIP. > >> > > Maybe > >> > > > > >>>> only list the ones you propose to deprecate and the new ones > >> you > >> > > > want > >> > > > > to > >> > > > > >>>> add? > >> > > > > >>> > >> > > > > >>> Ok. Unmodified methods removed. > >> > > > > >>> > >> > > > > >>>> (2) `TopologyTestDriver#createInputTopic`: might it be worth > >> to > >> > > add > >> > > > > >>>> overload to initialize the timetamp and auto-advance feature > >> > > > directly? > >> > > > > >>>> Otherwise, uses always need to call `configureTiming` as an > >> > extra > >> > > > > call? > >> > > > > >>> > >> > > > > >>> Added with Instant and Duration parameters. > >> > > > > >>> > >> > > > > >>>> (3) `TestInputTopic#configureTiming()`: maybe rename to > >> > > > > >>> `reconfigureTiming()` ? > >> > > > > >>> > >> > > > > >>> I removed this method when we have now initialization in > >> > > constructor. > >> > > > > >>> You can recreate TestInputTopic if needing to reconfigure > >> timing. > >> > > > > >>> > >> > > > > >>> > >> > > > > >>>> (4) Should we switch from `long` for timestamps to `Instant` > >> and > >> > > > > >>> `Duration` ? > >> > > > > >>> This version startTimestamp is Instant and autoAdvance > >> Duration > >> > in > >> > > > > >>> Initialization and with manual configured collection pipe > >> > methods. > >> > > > > >>> Now timestamp of TestRecord is still Long and similarly single > >> > > record > >> > > > > >>> pipeInput still has long as parameter. > >> > > > > >>> Should these also converted to to Instant type? > >> > > > > >>> Should there be both long and Instant parallel? > >> > > > > >>> I expect there are existing test codebase which would be > >> easier > >> > to > >> > > > > >> migrate > >> > > > > >>> if long could be still used. > >> > > > > >>> > >> > > > > >>> Also should advanceWallClockTime in TopologyTestDriver > >> > changed(or > >> > > > > added > >> > > > > >>> alternative) for Duration parameter. > >> > > > > >>> > >> > > > > >>> > >> > > > > >>>> (5) Why do we have redundant getters? Or set with `getX()` > >> and > >> > one > >> > > > > >>> set without `get`-prefix? > >> > > > > >>> > >> > > > > >>> The methods without get-prefix are for compatibility with > >> > > > > >> ProducerRecord / > >> > > > > >>> ConsumerRecord and I expect would make migration to TestRecord > >> > > > easier. > >> > > > > >>> Standard getters in TestRecord enable writing test ignoring > >> > > selected > >> > > > > >> fields > >> > > > > >>> with hamcrest like this: > >> > > > > >>> > >> > > > > >>> assertThat(outputTopic.readRecord(), allOf( > >> > > > > >>> hasProperty("key", equalTo(1L)), > >> > > > > >>> hasProperty("value", equalTo("Hello")), > >> > > > > >>> hasProperty("headers", equalTo(headers)))); > >> > > > > >>> > >> > > > > >>> > >> > > > > >>> That's why I have currently both methods. > >> > > > > >>> > >> > > > > >>> Jukka > >> > > > > >>> > >> > > > > >>> > >> > > > > >>> pe 21. kesäk. 2019 klo 22.20 Matthias J. Sax ( > >> > > matth...@confluent.io) > >> > > > > >>> kirjoitti: > >> > > > > >>> > >> > > > > >>>> Thanks for the KIP. The idea to add InputTopic and > >> OutputTopic > >> > > > > >>>> abstractions is really neat! > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> Couple of minor comment: > >> > > > > >>>> > >> > > > > >>>> (1) It's a little confusing that you list all method > >> (existing, > >> > > > > >> proposed > >> > > > > >>>> to deprecate, and new one) of `TopologyTestDriver` in the > >> KIP. > >> > > Maybe > >> > > > > >>>> only list the ones you propose to deprecate and the new ones > >> you > >> > > > want > >> > > > > >> to > >> > > > > >>>> add? > >> > > > > >>>> > >> > > > > >>>> (Or mark all existing methods clearly -- atm, I need to got > >> back > >> > > to > >> > > > > the > >> > > > > >>>> code to read the KIP and to extract what changes are > >> proposed). > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> (2) `TopologyTestDriver#createInputTopic`: might it be worth > >> to > >> > > add > >> > > > > >>>> overload to initialize the timetamp and auto-advance feature > >> > > > directly? > >> > > > > >>>> Otherwise, uses always need to call `configureTiming` as an > >> > extra > >> > > > > call? > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> (3) `TestInputTopic#configureTiming()`: maybe rename to > >> > > > > >>>> `reconfigureTiming()` ? > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> (4) Should we switch from `long` for timestamps to `Instant` > >> and > >> > > > > >>>> `Duration` ? > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> (5) Why do we have redundant getters? Or set with `getX()` > >> and > >> > one > >> > > > set > >> > > > > >>>> without `get`-prefix? > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> -Matthias > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>>> On 6/21/19 10:57 AM, Bill Bejeck wrote: > >> > > > > >>>>> Jukka, > >> > > > > >>>>> > >> > > > > >>>>> Thanks for the KIP. I like the changes overall. > >> > > > > >>>>> One thing I wanted to confirm, and this may be me being > >> > paranoid, > >> > > > but > >> > > > > >>>> will > >> > > > > >>>>> the changes for input/output topic affect how the > >> > > > TopologyTestDriver > >> > > > > >>>> works > >> > > > > >>>>> with internal topics when there are sub-topologies created? > >> > > > > >>>>> > >> > > > > >>>>> On Fri, Jun 21, 2019 at 12:05 PM Guozhang Wang < > >> > > wangg...@gmail.com > >> > > > > > >> > > > > >>>> wrote: > >> > > > > >>>>> > >> > > > > >>>>>> 1) Got it, could you list this class along with all its > >> > > functions > >> > > > in > >> > > > > >>> the > >> > > > > >>>>>> proposed public APIs as well? > >> > > > > >>>>>> > >> > > > > >>>>>> 2) Ack, thanks! > >> > > > > >>>>>> > >> > > > > >>>>>> On Thu, Jun 20, 2019 at 11:27 PM Jukka Karvanen < > >> > > > > >>>>>> jukka.karva...@jukinimi.com> > >> > > > > >>>>>> wrote: > >> > > > > >>>>>> > >> > > > > >>>>>>> Hi Guozhang, > >> > > > > >>>>>>> > >> > > > > >>>>>>> 1) This TestRecord is new class in my proposal. So it is a > >> > > > > >> simplified > >> > > > > >>>>>>> version of ProducerRecord and ConsumerRecord containing > >> only > >> > > the > >> > > > > >>> fields > >> > > > > >>>>>>> needed to test record content. > >> > > > > >>>>>>> > >> > > > > >>>>>>> 2) > >> > > > > >>>>>>> public final <K, V> TestInputTopic<K, V> > >> > createInputTopic(final > >> > > > > >>> String > >> > > > > >>>>>>> topicName, final Serde<K> keySerde, final Serde<V> > >> > valueSerde); > >> > > > > >>>>>>> public final <K, V> TestOutputTopic<K, V> > >> > > createOutputTopic(final > >> > > > > >>>> String > >> > > > > >>>>>>> topicName, final Serde<K> keySerde, final Serde<V> > >> > valueSerde); > >> > > > > >>>>>>> The purpose is to create separate object for each input > >> and > >> > > > output > >> > > > > >>>> topic > >> > > > > >>>>>>> you are using. The topic name is given to > >> > > createInput/OutputTopic > >> > > > > >>> when > >> > > > > >>>>>>> initialize topic object. > >> > > > > >>>>>>> > >> > > > > >>>>>>> For example: > >> > > > > >>>>>>> > >> > > > > >>>>>>> final TestInputTopic<Long, String> inputTopic1 = > >> > > > > >>>>>>> testDriver.createInputTopic( INPUT_TOPIC, longSerde, > >> > > > stringSerde); > >> > > > > >>>>>>> final TestInputTopic<Long, String> inputTopic2 = > >> > > > > >>>>>>> testDriver.createInputTopic( INPUT_TOPIC_MAP, longSerde, > >> > > > > >>> stringSerde); > >> > > > > >>>>>>> final TestOutputTopic<Long, String> outputTopic1 = > >> > > > > >>>>>>> testDriver.createOutputTopic(OUTPUT_TOPIC, longSerde, > >> > > > stringSerde); > >> > > > > >>>>>>> final TestOutputTopic<String, Long> outputTopic2 = > >> > > > > >>>>>>> testDriver.createOutputTopic(OUTPUT_TOPIC_MAP, > >> stringSerde, > >> > > > > >>>>>>> longSerde); > >> > > > > >>>>>>> inputTopic1.pipeInput(1L, "Hello"); > >> > > > > >>>>>>> assertThat(outputTopic1.readKeyValue(), equalTo(new > >> > > > KeyValue<>(1L, > >> > > > > >>>>>>> "Hello"))); > >> > > > > >>>>>>> assertThat(outputTopic2.readKeyValue(), equalTo(new > >> > > > > >>> KeyValue<>("Hello", > >> > > > > >>>>>>> 1L))); > >> > > > > >>>>>>> inputTopic2.pipeInput(1L, "Hello"); > >> > > > > >>>>>>> > >> > > > > >>>>>>> > >> > > > > >>>>>>> Jukka > >> > > > > >>>>>>> > >> > > > > >>>>>>> to 20. kesäk. 2019 klo 23.52 Guozhang Wang ( > >> > wangg...@gmail.com > >> > > ) > >> > > > > >>>>>> kirjoitti: > >> > > > > >>>>>>> > >> > > > > >>>>>>>> Hello Jukka, > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> Thanks for writing the KIP, I have a couple of quick > >> > > questions: > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> 1) Is "TestRecord" an existing class that you propose to > >> > > > > >> piggy-back > >> > > > > >>>> on? > >> > > > > >>>>>>>> Right now we have a scala TestRecord case class but I > >> doubt > >> > > that > >> > > > > >> was > >> > > > > >>>>>> your > >> > > > > >>>>>>>> proposal, or are you proposing to add a new Java class? > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> 2) Would the new API only allow a single input / output > >> > topic > >> > > > with > >> > > > > >>>>>>>> `createInput/OutputTopic`? If not, when we call pipeInput > >> > how > >> > > to > >> > > > > >>>>>>> determine > >> > > > > >>>>>>>> which topic this record should be pipe to? > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> Guozhang > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> On Mon, Jun 17, 2019 at 1:34 PM John Roesler < > >> > > j...@confluent.io > >> > > > > > >> > > > > >>>>>> wrote: > >> > > > > >>>>>>>> > >> > > > > >>>>>>>>> Woah, I wasn't aware of that Hamcrest test style. > >> Awesome! > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>>> Thanks for the updates. I look forward to hearing what > >> > others > >> > > > > >>> think. > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>>> -John > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>>> On Mon, Jun 17, 2019 at 4:12 AM Jukka Karvanen > >> > > > > >>>>>>>>> <jukka.karva...@jukinimi.com> wrote: > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> Wiki page updated: > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>> > >> > > > > >>>>>>> > >> > > > > >>>>>> > >> > > > > >>>> > >> > > > > >>> > >> > > > > >> > >> > > > > > >> > > > > >> > > > >> > > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-470%3A+TopologyTestDriver+test+input+and+output+usability+improvements > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> ClientRecord removed and replaced with TestRecord in > >> > method > >> > > > > >> calls. > >> > > > > >>>>>>>>>> TestRecordFactory removed (time tracking functionality > >> to > >> > be > >> > > > > >>>>>> included > >> > > > > >>>>>>>> to > >> > > > > >>>>>>>>>> TestInputTopic) > >> > > > > >>>>>>>>>> OutputVerifier deprecated > >> > > > > >>>>>>>>>> TestRecord topic removed and getters added > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> Getters in TestRecord enable writing test ignoring > >> > selected > >> > > > > >> fields > >> > > > > >>>>>>> with > >> > > > > >>>>>>>>>> hamcrest like this: > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> assertThat(outputTopic.readRecord(), allOf( > >> > > > > >>>>>>>>>> hasProperty("key", equalTo(1L)), > >> > > > > >>>>>>>>>> hasProperty("value", equalTo("Hello")), > >> > > > > >>>>>>>>>> hasProperty("headers", equalTo(headers)))); > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> Jukka > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>> la 15. kesäk. 2019 klo 1.10 John Roesler ( > >> > j...@confluent.io > >> > > ) > >> > > > > >>>>>>>> kirjoitti: > >> > > > > >>>>>>>>>> > >> > > > > >>>>>>>>>>> Sounds good. Thanks as always for considering my > >> > feedback! > >> > > > > >>>>>>>>>>> -John > >> > > > > >>>>>>>>>>> > >> > > > > >>>>>>>>>>> On Fri, Jun 14, 2019 at 12:12 PM Jukka Karvanen > >> > > > > >>>>>>>>>>> <jukka.karva...@jukinimi.com> wrote: > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> Ok, I will modify KIP Public Interface in a wiki > >> based > >> > on > >> > > > the > >> > > > > >>>>>>>>> feedback. > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> TestRecordFactory / ConsumerRecordFactory was used by > >> > > > > >>>>>>>> TestInputTopic > >> > > > > >>>>>>>>> with > >> > > > > >>>>>>>>>>>> the version I had with KIP456, but maybe I can merge > >> > That > >> > > > > >>>>>>>>> functionality > >> > > > > >>>>>>>>>>> to > >> > > > > >>>>>>>>>>>> InputTopic or TestRecordFactory can kept non > >> public > >> > > maybe > >> > > > > >>>>>>> moving > >> > > > > >>>>>>>>> it to > >> > > > > >>>>>>>>>>>> internals package. > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> I will make the proposal with a slim down interface. > >> > > > > >>>>>>>>>>>> I don't want to go to so slim as you proposed with > >> only > >> > > > > >>>>>>> TestRecord > >> > > > > >>>>>>>> or > >> > > > > >>>>>>>>>>>> List<TestRecord>, because you then still end up doing > >> > > helper > >> > > > > >>>>>>>> methods > >> > > > > >>>>>>>>> to > >> > > > > >>>>>>>>>>>> construct List of TestRecord. > >> > > > > >>>>>>>>>>>> The list of values is easier to write and clearer to > >> > read > >> > > > than > >> > > > > >>>>>> if > >> > > > > >>>>>>>> you > >> > > > > >>>>>>>>>>> need > >> > > > > >>>>>>>>>>>> to contruct list of TestRecords. > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> For example: > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> final List<String> inputValues = Arrays.asList( > >> > > > > >>>>>>>>>>>> "Apache Kafka Streams Example", > >> > > > > >>>>>>>>>>>> "Using Kafka Streams Test Utils", > >> > > > > >>>>>>>>>>>> "Reading and Writing Kafka Topic" > >> > > > > >>>>>>>>>>>> ); > >> > > > > >>>>>>>>>>>> inputTopic.pipeValueList(inputValues); > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> Let's check after the next iteration is it still > >> worth > >> > > > > >> reducing > >> > > > > >>>>>>> the > >> > > > > >>>>>>>>>>> methods. > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> Jukka > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>> pe 14. kesäk. 2019 klo 18.27 John Roesler ( > >> > > > j...@confluent.io) > >> > > > > >>>>>>>>> kirjoitti: > >> > > > > >>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> Thanks, Jukka, > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> Ok, I buy this reasoning. > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> Just to echo what I think I read, you would just > >> drop > >> > > > > >>>>>>>> ClientRecord > >> > > > > >>>>>>>>>>>>> from the proposal, and TestRecord would stand on its > >> > own, > >> > > > > >>>>>> with > >> > > > > >>>>>>>> the > >> > > > > >>>>>>>>>>>>> same methods and properties you proposed, and the > >> > "input > >> > > > > >>>>>> topic" > >> > > > > >>>>>>>>> would > >> > > > > >>>>>>>>>>>>> accept TestRecord, and the "output topic" would > >> produce > >> > > > > >>>>>>>> TestRecord? > >> > > > > >>>>>>>>>>>>> Further, the "input and output topic" classes would > >> > > > > >>>>>> internally > >> > > > > >>>>>>>>> handle > >> > > > > >>>>>>>>>>>>> the conversion to and from ConsumerRecord and > >> > > > ProducerRecord > >> > > > > >>>>>> to > >> > > > > >>>>>>>>> pass > >> > > > > >>>>>>>>>>>>> to and from the TopologyTestDriver? > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> This seems good to me. > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> Since the object coming out of the "output topic" is > >> > much > >> > > > > >>>>>> more > >> > > > > >>>>>>>>>>>>> ergonomic, I suspect we won't need the > >> OutputVerifier > >> > at > >> > > > all. > >> > > > > >>>>>>> It > >> > > > > >>>>>>>>> was > >> > > > > >>>>>>>>>>>>> mostly needed because of all the extra junk in > >> > > > ProducerRecord > >> > > > > >>>>>>> you > >> > > > > >>>>>>>>> need > >> > > > > >>>>>>>>>>>>> to ignore. It seems better to just deprecate it. If > >> in > >> > > the > >> > > > > >>>>>>> future > >> > > > > >>>>>>>>> it > >> > > > > >>>>>>>>>>>>> turns out there is some actual use case for a > >> verifier, > >> > > we > >> > > > > >>>>>> can > >> > > > > >>>>>>>>> have a > >> > > > > >>>>>>>>>>>>> very small KIP to add one. But reading your > >> response, I > >> > > > > >>>>>> suspect > >> > > > > >>>>>>>>> that > >> > > > > >>>>>>>>>>>>> existing test verification libraries would be > >> > sufficient > >> > > on > >> > > > > >>>>>>> their > >> > > > > >>>>>>>>> own. > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> Similarly, it seems like we can shrink the total > >> > > interface > >> > > > by > >> > > > > >>>>>>>>> removing > >> > > > > >>>>>>>>>>>>> the TestRecordFactory from the proposal. If > >> TestRecord > >> > > > > >>>>>> already > >> > > > > >>>>>>>>> offers > >> > > > > >>>>>>>>>>>>> all the constructors you'd want, then the only > >> benefit > >> > of > >> > > > the > >> > > > > >>>>>>>>> factory > >> > > > > >>>>>>>>>>>>> is to auto-increment the timestamps, but then again, > >> > the > >> > > > > >>>>>> "input > >> > > > > >>>>>>>>> topic" > >> > > > > >>>>>>>>>>>>> can already do that (e.g., it can do it if the > >> record > >> > > > > >>>>>> timestamp > >> > > > > >>>>>>>> is > >> > > > > >>>>>>>>> not > >> > > > > >>>>>>>>>>>>> set). > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> Likewise, if the TestRecords are easy to create, > >> then > >> > we > >> > > > > >>>>>> don't > >> > > > > >>>>>>>> need > >> > > > > >>>>>>>>>>>>> all the redundant methods in "input topic" to pipe > >> > > values, > >> > > > or > >> > > > > >>>>>>>>>>>>> key/values, or key/value/timestamp, etc. We can do > >> with > >> > > > just > >> > > > > >>>>>>> two > >> > > > > >>>>>>>>>>>>> methods, one for a single TestRecord and one for a > >> > > > collection > >> > > > > >>>>>>> of > >> > > > > >>>>>>>>> them. > >> > > > > >>>>>>>>>>>>> This reduces API ambiguity and also dramatically > >> > > decreases > >> > > > > >>>>>> the > >> > > > > >>>>>>>>> surface > >> > > > > >>>>>>>>>>>>> area of the interface, which ultimately makes it > >> much > >> > > > easier > >> > > > > >>>>>> to > >> > > > > >>>>>>>>> use. > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> It's best to start with the smallest interface that > >> > will > >> > > do > >> > > > > >>>>>> the > >> > > > > >>>>>>>> job > >> > > > > >>>>>>>>>>>>> and expand it upon request, rather than throwing in > >> > > > > >>>>>> everything > >> > > > > >>>>>>>> you > >> > > > > >>>>>>>>> can > >> > > > > >>>>>>>>>>>>> think of up front. The extra stuff would be > >> confusing > >> > to > >> > > > > >>>>>> people > >> > > > > >>>>>>>>> facing > >> > > > > >>>>>>>>>>>>> two practically identical paths to accomplish the > >> same > >> > > > goal, > >> > > > > >>>>>>> and > >> > > > > >>>>>>>>> it's > >> > > > > >>>>>>>>>>>>> very difficult to slim the interface down later, > >> > because > >> > > we > >> > > > > >>>>>>> don't > >> > > > > >>>>>>>>>>>>> really know which parts are more popular (i.e., no > >> one > >> > > > > >>>>>> submits > >> > > > > >>>>>>>>>>>>> "feature requests" to _remove_ stuff they don't > >> need, > >> > > only > >> > > > to > >> > > > > >>>>>>>> _add_ > >> > > > > >>>>>>>>>>>>> stuff that they need. > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> But overall, I really like the structure of this > >> > design. > >> > > > I'm > >> > > > > >>>>>>>> super > >> > > > > >>>>>>>>>>>>> excited about this KIP. > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> Thanks, > >> > > > > >>>>>>>>>>>>> -John > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> On Fri, Jun 14, 2019 at 2:55 AM Jukka Karvanen > >> > > > > >>>>>>>>>>>>> <jukka.karva...@jukinimi.com> wrote: > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> Hi, > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> I am not a fan of swapping only ProducerRecord and > >> > > > > >>>>>>>>> ConsumerRecord. > >> > > > > >>>>>>>>>>>>>> As a test writer point of view I do not want to > >> care > >> > > about > >> > > > > >>>>>>> the > >> > > > > >>>>>>>>>>> difference > >> > > > > >>>>>>>>>>>>>> of those and > >> > > > > >>>>>>>>>>>>>> that way I like to have object type which can be > >> used > >> > to > >> > > > > >>>>>> pipe > >> > > > > >>>>>>>>>>> records in > >> > > > > >>>>>>>>>>>>>> and compare outputs. > >> > > > > >>>>>>>>>>>>>> That way avoid unnecessary conversions between > >> > > > > >>>>>> ProducerRecord > >> > > > > >>>>>>>> and > >> > > > > >>>>>>>>>>>>>> ConsumerRecord. > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> My initial assumption was that ProducerRecord and > >> > > > > >>>>>>>>>>> ConsumerRecord.could > >> > > > > >>>>>>>>>>>>>> implement the same ClientRecord > >> > > > > >>>>>>>>>>>>>> and that way test writer could have used either of > >> > > those, > >> > > > > >>>>>> but > >> > > > > >>>>>>>>> seems > >> > > > > >>>>>>>>>>> that > >> > > > > >>>>>>>>>>>>>> return type of timestamp method long vs Long is not > >> > > > > >>>>>>> compatible. > >> > > > > >>>>>>>>>>>>>> Now the main advantage of ClientRecord is no need > >> to > >> > > > > >>>>>>> duplicate > >> > > > > >>>>>>>>>>>>>> OutputVerifier when it is modified from > >> ProducerRecord > >> > > to > >> > > > > >>>>>>>>>>> ClientRecord. > >> > > > > >>>>>>>>>>>>>> Generally is there need for OutputVerifier. Can we > >> > > > > >>>>>> deprecate > >> > > > > >>>>>>>> the > >> > > > > >>>>>>>>>>> existing > >> > > > > >>>>>>>>>>>>>> and use standard assertion libraries for new test. > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> If you use hamcrest, assert-j or any other > >> assertion > >> > > > > >>>>>> library > >> > > > > >>>>>>>>> for the > >> > > > > >>>>>>>>>>>>> rest > >> > > > > >>>>>>>>>>>>>> of the test, why not use it with these also. > >> > > > > >>>>>>>>>>>>>> When we have these methods to access only needed > >> > fields > >> > > it > >> > > > > >>>>>> is > >> > > > > >>>>>>>>> easier > >> > > > > >>>>>>>>>>> to > >> > > > > >>>>>>>>>>>>>> write test like this: > >> > > > > >>>>>>>>>>>>>> > >> > assertThat(outputTopic.readValue()).isEqualTo("Hello"); > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> or > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>> > >> > assertThat(outputTopic.readRecord()).isEqualTo(expectedRecord); > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> Only value for new OutputVerifier is when needing > >> to > >> > > > ignore > >> > > > > >>>>>>>> some > >> > > > > >>>>>>>>>>> fields > >> > > > > >>>>>>>>>>>>>> ClientRecord actual = outputTopic.readRecord(); > >> > > > > >>>>>>>>>>>>>> assertThat(actual.value()).isEqualTo("Hello"); > >> > > > > >>>>>>>>>>>>>> assertThat(actual.key()).isEqualTo(expectedKey); > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>> > >> assertThat(actual.timestamp()).isEqualTo(expectedTimestamp); > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> So if want to leave client package untouched, I > >> would > >> > > > > >>>>>> modify > >> > > > > >>>>>>>> the > >> > > > > >>>>>>>>>>> methods > >> > > > > >>>>>>>>>>>>>> with ClientRecord now in InputTopic and > >> OutputTopic to > >> > > > pass > >> > > > > >>>>>>> in > >> > > > > >>>>>>>>> and > >> > > > > >>>>>>>>>>> out > >> > > > > >>>>>>>>>>>>> this > >> > > > > >>>>>>>>>>>>>> TestRecord instead. > >> > > > > >>>>>>>>>>>>>> In that case there would be possibility to add > >> methods > >> > > to > >> > > > > >>>>>>>>> TestRecord > >> > > > > >>>>>>>>>>> to > >> > > > > >>>>>>>>>>>>>> help ignore some fields in assertions like: > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>> > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>> > >> > > > > >>>>>>> > >> > > > > >>>>>> > >> > > > > >>>> > >> > > > > >>> > >> > > > > >> > >> > > > > > >> > > > > >> > > > >> > > >> assertThat(outputTopic.readRecord().getValueTimestamp()).isEqualTo(expectedRecord.get > >> > > > > >>>>>>>>>>>>>> ValueTimestamp()); > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> How about this alternative? > >> > > > > >>>>>>>>>>>>>> If this way sounds better I will modify KIP page in > >> > > wiki. > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> Jukka > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>> to 13. kesäk. 2019 klo 18.30 John Roesler ( > >> > > > > >>>>>> j...@confluent.io > >> > > > > >>>>>>> ) > >> > > > > >>>>>>>>>>> kirjoitti: > >> > > > > >>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>> Hey, all, maybe we can jump-start this discussion. > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>> I think this approach would be very ergonomic for > >> > > > > >>>>>> testing, > >> > > > > >>>>>>>> and > >> > > > > >>>>>>>>>>> would > >> > > > > >>>>>>>>>>>>>>> help reduce boilerplate in tests. > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>> The think I like most about it is that it mirrors > >> the > >> > > > > >>>>>>> mental > >> > > > > >>>>>>>>> model > >> > > > > >>>>>>>>>>>>>>> that people already have from Kafka Streams, in > >> which > >> > > you > >> > > > > >>>>>>>>> write to > >> > > > > >>>>>>>>>>> an > >> > > > > >>>>>>>>>>>>>>> "input topic" and then get your results from an > >> > "output > >> > > > > >>>>>>>>> topic". As > >> > > > > >>>>>>>>>>> a > >> > > > > >>>>>>>>>>>>>>> side benefit, the input and output topics in the > >> > > proposal > >> > > > > >>>>>>>> also > >> > > > > >>>>>>>>>>> close > >> > > > > >>>>>>>>>>>>>>> over the serdes, which makes it much less > >> boilerplate > >> > > for > >> > > > > >>>>>>>> test > >> > > > > >>>>>>>>>>> code. > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>> If I can offer one suggestion for change, I'm not > >> > sure > >> > > > > >>>>>> I'm > >> > > > > >>>>>>>>> totally > >> > > > > >>>>>>>>>>>>>>> sold on the need for a new abstraction > >> "ClientRecord" > >> > > > > >>>>>> with > >> > > > > >>>>>>> an > >> > > > > >>>>>>>>>>>>>>> implementation for tests "TestRecord". It seems > >> like > >> > > this > >> > > > > >>>>>>>>>>>>>>> unnecessarily complicates the main (non-testing) > >> data > >> > > > > >>>>>>> model. > >> > > > > >>>>>>>> It > >> > > > > >>>>>>>>>>> seems > >> > > > > >>>>>>>>>>>>>>> like it would be sufficient, and just as > >> ergonomic, > >> > to > >> > > > > >>>>>> have > >> > > > > >>>>>>>> the > >> > > > > >>>>>>>>>>> input > >> > > > > >>>>>>>>>>>>>>> topic accept ProducerRecords and the output topic > >> > > return > >> > > > > >>>>>>>>>>>>>>> ConsumerRecords. I'm open to discussion on this > >> > point, > >> > > > > >>>>>>>> though. > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>> Thanks for the proposal, Jukka! > >> > > > > >>>>>>>>>>>>>>> -John > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>> On Mon, May 20, 2019 at 7:59 AM Jukka Karvanen > >> > > > > >>>>>>>>>>>>>>> <jukka.karva...@jukinimi.com> wrote: > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> Hi All, > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> I would like to start the discussion on 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 is inspired by the Discussion in > >> KIP-456: > >> > > > > >>>>>> Helper > >> > > > > >>>>>>>>>>> classes to > >> > > > > >>>>>>>>>>>>> make > >> > > > > >>>>>>>>>>>>>>>> it simpler to write test logic with > >> > > TopologyTestDriver: > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-456 > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>> > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>> > >> > > > > >>>>>>> > >> > > > > >>>>>> > >> > > > > >>>> > >> > > > > >>> > >> > > > > >> > >> > > > > > >> > > > > >> > > > >> > > >> %3A+Helper+classes+to+make+it+simpler+to+write+test+logic+with+TopologyTestDriver > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> The proposal in KIP-456 > >> > > > > >>>>>>>>>>>>>>>> < > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>> > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>> > >> > > > > >>>>>>> > >> > > > > >>>>>> > >> > > > > >>>> > >> > > > > >>> > >> > > > > >> > >> > > > > > >> > > > > >> > > > >> > > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-456%3A+Helper+classes+to+make+it+simpler+to+write+test+logic+with+TopologyTestDriver > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> was > >> > > > > >>>>>>>>>>>>>>>> to add alternate way to input and output topic, > >> but > >> > > > > >>>>>> this > >> > > > > >>>>>>>> KIP > >> > > > > >>>>>>>>>>> enhance > >> > > > > >>>>>>>>>>>>>>> those > >> > > > > >>>>>>>>>>>>>>>> classes and deprecate old functionality to make > >> > clear > >> > > > > >>>>>>>>> interface > >> > > > > >>>>>>>>>>> for > >> > > > > >>>>>>>>>>>>> test > >> > > > > >>>>>>>>>>>>>>>> writer to use. > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> In current KIP-470 proposal, topic objects are > >> > created > >> > > > > >>>>>>> with > >> > > > > >>>>>>>>>>>>> topicName and > >> > > > > >>>>>>>>>>>>>>>> related serders. > >> > > > > >>>>>>>>>>>>>>>> public final <K, V> TestInputTopic<K, V> > >> > > > > >>>>>>>>>>> createInputTopic(final > >> > > > > >>>>>>>>>>>>>>> String > >> > > > > >>>>>>>>>>>>>>>> topicName, final Serde<K> keySerde, final > >> Serde<V> > >> > > > > >>>>>>>>> valueSerde); > >> > > > > >>>>>>>>>>>>>>>> public final <K, V> TestOutputTopic<K, V> > >> > > > > >>>>>>>>>>> createOutputTopic(final > >> > > > > >>>>>>>>>>>>>>> String > >> > > > > >>>>>>>>>>>>>>>> topicName, final Serde<K> keySerde, final > >> Serde<V> > >> > > > > >>>>>>>>> valueSerde); > >> > > > > >>>>>>>>>>>>>>>> One thing I wondered if there way to find out > >> topic > >> > > > > >>>>>>> related > >> > > > > >>>>>>>>> serde > >> > > > > >>>>>>>>>>>>> from > >> > > > > >>>>>>>>>>>>>>>> TopologyTestDriver topology, it would simply > >> > creation > >> > > > > >>>>>> of > >> > > > > >>>>>>>>> these > >> > > > > >>>>>>>>>>> Topic > >> > > > > >>>>>>>>>>>>>>>> objects: > >> > > > > >>>>>>>>>>>>>>>> public final <K, V> TestInputTopic<K, V> > >> > > > > >>>>>>>>>>> createInputTopic(final > >> > > > > >>>>>>>>>>>>>>> String > >> > > > > >>>>>>>>>>>>>>>> topicName); > >> > > > > >>>>>>>>>>>>>>>> public final <K, V> TestOutputTopic<K, V> > >> > > > > >>>>>>>>>>> createOutputTopic(final > >> > > > > >>>>>>>>>>>>>>> String > >> > > > > >>>>>>>>>>>>>>>> topicName); > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> KIP-456 can be discarded if this KIP get > >> accepted. > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>>>>> Best Regards, > >> > > > > >>>>>>>>>>>>>>>> Jukka > >> > > > > >>>>>>>>>>>>>>> > >> > > > > >>>>>>>>>>>>> > >> > > > > >>>>>>>>>>> > >> > > > > >>>>>>>>> > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> > >> > > > > >>>>>>>> -- > >> > > > > >>>>>>>> -- Guozhang > >> > > > > >>>>>>>> > >> > > > > >>>>>>> > >> > > > > >>>>>> > >> > > > > >>>>>> > >> > > > > >>>>>> -- > >> > > > > >>>>>> -- Guozhang > >> > > > > >>>>>> > >> > > > > >>>>> > >> > > > > >>>> > >> > > > > >>>> > >> > > > > >>> > >> > > > > >> > >> > > > > > > >> > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> > >> -- > >> > >> Antony Stubbs > >> > >> Solutions Architect | Confluent > >> > >> +44 (0)7491 833 814 <+447491833814> > >> Follow us: Twitter <https://twitter.com/ConfluentInc> | blog > >> <http://www.confluent.io/blog> > >> > >