Personally, I think it would be cleaner to just pass `Deserializer` into
`InputTopic` and `Serializer` into `OutputTopic`. Keeping the interface
simple is a good argument and we should not have overloads -- but it
seems that picking `Serdes` instead of the more straight forward
`(De)Serializer` is not "clean". One should only pass what one needs IMHO.

I also don't think that calling `#serializer()` if necessary is too much
boilerplate. At the same time, if you don't have a `Serde` at hand, it
would be quite some overhead to create a new Serde that wraps a
(de)serializer one has at hand.

Note that `ConsumerRecordFactory` also accepts `Serializer` only for the
same reason.


Beside this minor question, I think you can start a VOTE thread. If we
close the vote before Wednesday (cf
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=125307901)
we might be able to get it into 2.4 release (if we have the bandwidth to
review the PR in time...)


-Matthias



On 9/13/19 10:08 PM, Jukka Karvanen wrote:
> Hi,
> 
> In many cases you have already serde for the stream definition. So I see
> natural to use it also for the tests.
> So you can write:
> 
>   public void setup() {
>     testDriver = new TopologyTestDriver(TestStream.getTopology(),
> TestStream.getConfig());
>     inputTopic = testDriver.createInputTopic(TestStream.INPUT_TOPIC,
>  keySerde,  myClassSerde);
>     outputTopic = testDriver.createOutputTopic(TestStream.OUTPUT_TOPIC, k
> eySerde,  outClassSerde);
>   }
> 
> Instead of
> 
>   public void setup() {
>     testDriver = new TopologyTestDriver(TestStream.getTopology(),
> TestStream.getConfig());
>     inputTopic = testDriver.createInputTopic(TestStream.INPUT_TOPIC,
>  keySerde.serializer(),  myClassSerde.serializer());
>     outputTopic = testDriver.createOutputTopic(TestStream.OUTPUT_TOPIC, k
> eySerde.deserializer(),  outClassSerde.deserializer());
>   }
> 
> In original KIP-456 I had variation for Contructors with Serde and
> Serializer/Deserializer, but based on the request to keep the interface as
> simple as possible only version with Serde was kept.
> Jukka
> 
> 
> 
> 
> 
> pe 13. syysk. 2019 klo 19.15 Matthias J. Sax (matth...@confluent.io)
> kirjoitti:
> 
>> 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>
>>>>>>>
>>>>>>
>>>>
>>>
>>
>>
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to