Maybe one follow up question: Why do we pass `Serdes` into `createInputTopic` and createOutputTopic` -- seems `Serializer` (for input) and `Deserialized` (for output) should be sufficient?
-Matthias On 9/12/19 4:59 PM, Matthias J. Sax wrote: > Thanks for updating the KIP. > > I agree with John that we (ie, you :)) can start a vote. > > > -Matthias > > On 9/11/19 9:23 AM, John Roesler wrote: >> 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> >>>>> >>>> >> >
signature.asc
Description: OpenPGP digital signature