Thanks Sophie! I took a look at the issue and the mailing thread. So in other words, people are having issues writing unit tests using in-memory stores (which is a very common practice due to the lack of a better alternative), so we try to provide a better solution for testings, and hopefully works well with the current MockProcessContext. But the current issues we are facing with the in-memory stores, how can we better fix them in the mock stores? Should I think more about how the mock stores will interact with MockProcessorContext? The design I present now it's just a wrapper on a store. Do you think we need to address that before we go further? Instead of a wrapper, should we think about building a more comprehensive mock store?
Thanks, Yishun On Thu, Aug 29, 2019 at 12:18 AM Sophie Blee-Goldman <sop...@confluent.io> wrote: > > Hey Yishun! Glad to see this is in the works :) > > Within the past month or so, needing state stores for unit tests has been > brought up multiple times. Unfortunately, before now some people had to > rely on internal APIs to get a store for their tests, which is unsafe as > they can (and in this case > <https://mail-archives.apache.org/mod_mbox/kafka-users/201907.mbox/%3cCAM0Vdef0h3p4gB=r3s=vvgssqqzqa4oxxkpl5cnpaxn146p...@mail.gmail.com%3e>, > did) change. While there is an unstable workaround for KV stores, there is > unfortunately no good way to get a window or session store for your tests. > This > ticket <https://issues.apache.org/jira/browse/KAFKA-8630> explains that > particular issue, plus some ways to resolve it that could get kind of messy. > > I think that ticket would likely be subsumed by your KIP (and much > cleaner), but I just wanted to point to some use cases and make sure we > have them covered within this KIP. We definitely have a gap here and I > think it's pretty clear many users would benefit from state store support > in unit tests! > > Cheers, > Sophie > > On Tue, Aug 27, 2019 at 1:11 PM Yishun Guan <gyis...@gmail.com> wrote: > > > Hi All, > > > > I have finally worked on this KIP again and want to discuss with you > > all before this KIP goes dormant. > > > > Recap: https://issues.apache.org/jira/browse/KAFKA-6460 > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-448%3A+Add+State+Stores+Unit+Test+Support+to+Kafka+Streams+Test+Utils > > > > I have updated my KIP. > > 1. Provided an example of how the test will look. > > 2. Allow the tester to use their StateStore of choice as a backend > > store when testing. > > 3. Argument against EasyMock: for now, I don't really have a strong > > point against EasyMock. If people are comfortable with EasyMock and > > think building a full tracking/capturing stateStore is heavyweight, > > this makes sense to me too, and we can put this KIP as `won't > > implement`. > > > > > > I also provided a proof of concept PR for review: > > https://github.com/apache/kafka/pull/7261/files > > > > Thanks, > > Yishun > > > > On Tue, Apr 30, 2019 at 4:03 AM Matthias J. Sax <matth...@confluent.io> > > wrote: > > > > > > I just re-read the discussion on the original Jira. > > > > > > It's still a little unclear to me, how this should work end-to-end? It > > > would be good, to describe some test patterns that we want to support > > > first. Maybe using some examples, that show how a test would be written? > > > > > > I don't think that we should build a whole mocking framework similar to > > > EasyMock (or others); why re-invent the wheel? I think the goal should > > > be, to allow people to use their mocking framework of choice, and to > > > easily integrate it with `TopologyTestDriver`, without the need to > > > rewrite the code under test. > > > > > > > > > For the currently internal `KeyValueStoreTestDriver`, it's seems to be a > > > little different, as the purpose of this driver is to test a store > > > implementation. Hence, most users won't need this, because they use the > > > built-in stores anyway, ie, this driver would be for advanced users that > > > build their own stores. > > > > > > I think it's actually two orthogonal things and it might even be good to > > > split both into two KIPs. > > > > > > > > > > > > -Matthias > > > > > > > > > On 4/30/19 7:52 AM, Yishun Guan wrote: > > > > Sounds good! Let me work on this more and add some more information to > > this > > > > KIP before we continue. > > > > > > > > On Tue, Apr 30, 2019, 00:45 Bruno Cadonna <br...@confluent.io> wrote: > > > > > > > >> Hi Yishun, > > > >> > > > >> Thank you for continuing with this KIP. IMO, this KIP is very > > important to > > > >> develop robust code. > > > >> > > > >> I think, a good approach is to do some research on mock development > > on the > > > >> internet and in the literatures and then try to prototype the mocks. > > These > > > >> activities should yield you a list of pros and cons that you can add > > to the > > > >> KIP. With this information it is simpler for everybody to discuss > > this KIP. > > > >> > > > >> Does this make sense to you? > > > >> > > > >> Best, > > > >> Bruno > > > >> > > > >> On Mon, Apr 29, 2019 at 7:11 PM Yishun Guan <gyis...@gmail.com> > > wrote: > > > >> > > > >>> Hi, > > > >>> > > > >>> Sorry for the late reply, I have read through all your valuable > > > >>> comments. The KIP still needs work at this point. > > > >>> > > > >>> I think at this point, one question comes up is that, how should we > > > >>> implement the mock stores - as Sophie suggested, should we open to > > all > > > >>> Store backend and just wrap around the Store class type which the > > user > > > >>> will be providing - or, as Bruno suggested, we shouldn't have a > > > >>> production backend store to be wrapped around in a mock store, just > > > >>> keep track of the state of each method calls, even EasyMock could be > > > >>> one of the option too. > > > >>> > > > >>> Personally, EasyMock will makes the implementation easier but > > building > > > >>> from scratch provides extra functionality and provides expandability > > > >>> (But I am not sure what kind of extra functionality we want in the > > > >>> future). > > > >>> > > > >>> What do you guys think? > > > >>> > > > >>> Best, > > > >>> Yishun > > > >>> > > > >>> On Fri, Apr 26, 2019 at 2:03 AM Matthias J. Sax < > > matth...@confluent.io> > > > >>> wrote: > > > >>>> > > > >>>> What is the status of this KIP? > > > >>>> > > > >>>> > > > >>>> Btw: there is also KIP-456. I was wondering if it might be required > > or > > > >>>> helpful to align the design of both with each other. Thoughts? > > > >>>> > > > >>>> > > > >>>> > > > >>>> -Matthias > > > >>>> > > > >>>> > > > >>>> On 4/11/19 12:17 AM, Matthias J. Sax wrote: > > > >>>>> Thanks for the KIP. Only one initial comment (Sophie mentioned this > > > >>>>> already but I want to emphasize on it). > > > >>>>> > > > >>>>> You state that > > > >>>>> > > > >>>>>> These will be internal classes, so no public API/interface. > > > >>>>> > > > >>>>> If this is the case, we don't need a KIP. However, the idea of the > > > >>>>> original Jira is to actually make those classes public, as part of > > > >> the > > > >>>>> `streams-test-utils` package. If it's not public, developers should > > > >> not > > > >>>>> use them, because they don't have any backward compatibility > > > >>> guarantees. > > > >>>>> > > > >>>>> Hence, I would suggest that the corresponding classes go into a new > > > >>>>> package `org.apache.kafka.streams.state`. > > > >>>>> > > > >>>>> > > > >>>>> -Matthias > > > >>>>> > > > >>>>> > > > >>>>> On 4/9/19 8:58 PM, Bruno Cadonna wrote: > > > >>>>>> Hi Yishun, > > > >>>>>> > > > >>>>>> Thank you for the KIP. > > > >>>>>> > > > >>>>>> I have a couple of comments: > > > >>>>>> > > > >>>>>> 1. Could you please add an example to the KIP that demonstrates > > how > > > >>> the > > > >>>>>> mocks should be used in a test? > > > >>>>>> > > > >>>>>> 2. I am wondering, whether the MockKeyValueStore needs to be > > backed > > > >>> by an > > > >>>>>> actual KeyValueStore (in your KIP InMemoryKeyValueStore). Would it > > > >> not > > > >>>>>> suffice to provide the mock with the entries that it has to check > > in > > > >>> case > > > >>>>>> of input operation like put() and with the entries it has to > > return > > > >>> in case > > > >>>>>> of an output operation like get()? In my opinion, a mock should > > have > > > >>> as > > > >>>>>> little and as simple code as possible. A unit test should depend > > as > > > >>> little > > > >>>>>> as possible from productive code that it does not explicitly test. > > > >>>>>> > > > >>>>>> 3. I would be interested in the arguments against using a > > > >>> well-established > > > >>>>>> and well-tested mock framework like EasyMock. If there are good > > > >>> arguments, > > > >>>>>> they should be listed under 'Rejected Alternatives'. > > > >>>>>> > > > >>>>>> 3. What is the purpose of the parameter 'time' in > > MockStoreFactory? > > > >>>>>> > > > >>>>>> Best, > > > >>>>>> Bruno > > > >>>>>> > > > >>>>>> On Tue, Apr 9, 2019 at 11:29 AM Sophie Blee-Goldman < > > > >>> sop...@confluent.io> > > > >>>>>> wrote: > > > >>>>>> > > > >>>>>>> Hi Yishun, thanks for the KIP! I have a few initial > > > >>> questions/comments: > > > >>>>>>> > > > >>>>>>> 1) It may be useful to capture the iterator results as well (eg > > > >> with > > > >>> a > > > >>>>>>> MockIterator that wraps the underlying iterator and records the > > > >> same > > > >>> way > > > >>>>>>> the MockStore wraps/records the underlying store) > > > >>>>>>> > > > >>>>>>> 2) a. Where is the "persistent" variable coming from or being > > used? > > > >>> It > > > >>>>>>> seems the MockKeyValueStore accepts it in the constructor, but > > only > > > >>> the > > > >>>>>>> name parameter is passed when constructing a new > > MockKeyValueStore > > > >> in > > > >>>>>>> build() ... also, if we extend InMemoryXXXStore shouldn't this > > > >>> always be > > > >>>>>>> false? > > > >>>>>>> b. Is the idea to wrap an in-memory store for each type > > > >>> (key-value, > > > >>>>>>> session, etc)? We don't (yet) offer an in-memory version of the > > > >>> session > > > >>>>>>> store although it is in the works, so this will be possible -- I > > am > > > >>> more > > > >>>>>>> wondering if it makes sense to decide this for the user or to > > allow > > > >>> them to > > > >>>>>>> choose between in-memory or rocksDB by setting "persistent" > > > >>>>>>> > > > >>>>>>> 3) I'm wondering if users might want to be able to plug in their > > > >> own > > > >>> custom > > > >>>>>>> stores as the underlying backend...should we support this as > > well? > > > >>> WDYT? > > > >>>>>>> > > > >>>>>>> 4) We probably want to make these stores available through the > > > >> public > > > >>>>>>> test-utils package (maybe not the stores themselves which should > > be > > > >>>>>>> internal, but should there be some kind of public API that gives > > > >>> access to > > > >>>>>>> them?) > > > >>>>>>> > > > >>>>>>> Cheers, > > > >>>>>>> Sophie > > > >>>>>>> > > > >>>>>>> On Tue, Apr 9, 2019 at 9:19 AM Yishun Guan <gyis...@gmail.com> > > > >>> wrote: > > > >>>>>>> > > > >>>>>>>> Bumping this up again, thanks! > > > >>>>>>>> > > > >>>>>>>> On Fri, Apr 5, 2019, 14:36 Yishun Guan <gyis...@gmail.com> > > wrote: > > > >>>>>>>> > > > >>>>>>>>> Hi, bumping this up again. Thanks! > > > >>>>>>>>> > > > >>>>>>>>> On Tue, Apr 2, 2019, 13:07 Yishun Guan <gyis...@gmail.com> > > > >> wrote: > > > >>>>>>>>> > > > >>>>>>>>>> Hi All, > > > >>>>>>>>>> > > > >>>>>>>>>> I like to start a discussion on KIP-448 > > > >>>>>>>>>> (https://cwiki.apache.org/confluence/x/SAeZBg). It is about > > > >>> adding > > > >>>>>>>>>> Mock state stores and relevant components for testing > > purposes. > > > >>>>>>>>>> > > > >>>>>>>>>> Here is the JIRA: > > > >>> https://issues.apache.org/jira/browse/KAFKA-6460 > > > >>>>>>>>>> > > > >>>>>>>>>> This is a rough KIP draft, review and comment are appreciated. > > > >> It > > > >>>>>>>>>> seems to be tricky and some requirements and details are still > > > >>> needed > > > >>>>>>>>>> to be discussed. > > > >>>>>>>>>> > > > >>>>>>>>>> Thanks, > > > >>>>>>>>>> Yishun > > > >>>>>>>>>> > > > >>>>>>>>> > > > >>>>>>>> > > > >>>>>>> > > > >>>>>> > > > >>>>>> > > > >>>>> > > > >>>> > > > >>> > > > >> > > > > > > > > >