Just an FYI for anyone interested in this topic: Following review comments,
the latest patch set of https://git.opendaylight.org/gerrit/#/c/48077/ is
now significantly reworked from the original design from 3 days ago. More
+1/-1 welcome... BTW: That new ChainableDataTreeChangeListener API idea
could, later, perhaps even be moved from Genius to controller/mdsal?

On Mon, Nov 7, 2016 at 6:48 PM, Michael Vorburger <vorbur...@redhat.com>
wrote:

> Back to a thread from 3 months ago, read up previous exchange to jump in:
>
> On Fri, Aug 12, 2016 at 1:50 PM, Michael Vorburger <vorbur...@redhat.com>
> wrote:
>
>> Tomas, tx for your prompt reply. I hadn't seen Mockito's [1] [2]
>> timeout() before, thanks for pointing it out. Similar to e.g. awaitility
>> [3], but built in to Mockito - nice.
>>
>> FYI This particular test is an "end-to-end" test, so the listeners aren't
>> mocked but the real thing.. but the general approach you outline may still
>> work. I'd probably have to wrap the real ones somehow.. perhaps even just
>> Mock and use Mockito CallsRealMethods (or via my
>> CallsRealOrExceptionAnswer.java
>> <https://git.opendaylight.org/gerrit/#/c/42529/8/common/testutils/src/main/java/org/opendaylight/yangtools/testutils/mockito/CallsRealOrExceptionAnswer.java>
>> from [5], but not needed here) may help - I need to see if it's possible to
>> combine. I'd need to hook into the instantiation of the real listeners,
>> which ties in with some thinking I'm doing re. in-bundle DI (full
>> disclosure & tangent: I'm not a big fan of blueprints for that, in-bundle;
>> I see blueprints as one possible answer to the problem of wiring between
>> bundles; with DS another choice).
>>
>> All: Before jumping into pursuing this,
>>
>
> I now have jumped into this, and would like to propose
> https://git.opendaylight.org/gerrit/#/c/48077/ - how do you guys like the
> proposed idea?
>
> https://git.opendaylight.org/gerrit/#/c/48078/ has a usage example which
> illustrates how by introducing this I can avoid silly Thread.sleep() - and
> thus make those component tests run a bit faster.
>
> BTW: Testing async stuff is just a PITA in general;
> https://git.opendaylight.org/gerrit/#/c/48061/ has another thingie like
> that; that one isn't directly related to this thread re.  listeners, just
> mentioning it as a related proposed gerrit in the same area.
>
>
>> could I just ask once again if there isn't another way to tackle this
>> problem from "the other side" - instead of waiting on the Listener(s!),
>> could one not ask a DataBroker "have all of your listeners already
>> processed all of your pending puts" ?  From the POV of writing a functional
>> end2end test, this would seem easier to me. No way?
>>
>
> FTR: There never was any reply to this question, and from the little
> investigation I did, I couldn't figure out how to tackle this on that side
> - thus the approach proposed above.
>
>
>>
>> [1] http://site.mockito.org/mockito/docs/current/org/mockito/
>> Mockito.html#timeout(long)
>> [2]  https://github.com/mockito/mockito/blob/master/src/test/java
>> /org/mockitousage/verification/VerificationWithTimeoutTest.java
>> [3] https://github.com/awaitility/awaitility
>> [4] https://git.opendaylight.org/gerrit/#/c/42529/
>>
>> Tx,
>> M.
>> --
>> Michael Vorburger <vorbur...@redhat.com> | IRC: vorburger @freenode | ~
>> = http://vorburger.ch
>>
>>
>> On Thu, Aug 11, 2016 at 6:05 PM, Tomas Cere -X (tcere - PANTHEON
>> TECHNOLOGIES at Cisco) <tc...@cisco.com> wrote:
>>
>>> Did you try mocking the listeners? With mockito you can verify if/how
>>> many times a method has been called with a timeout and also
>>>
>>> use argument captors to check the value was as expected. I recently did
>>> something similar in [1]
>>>
>>>
>>>
>>> [1]: https://github.com/opendaylight/mdsal/blob/28e0ef3b11e12112c
>>> 0acc89ba07f59cc742f7417/dom/mdsal-dom-broker/src/test/java/
>>> org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeProdu
>>> cerMultiShardTest.java#L192-L214
>>>
>>>
>>>
>>> Tomas
>>>
>>>
>>>
>>> *From:* controller-dev-boun...@lists.opendaylight.org [mailto:
>>> controller-dev-boun...@lists.opendaylight.org] *On Behalf Of *Michael
>>> Vorburger
>>> *Sent:* Thursday, August 11, 2016 17:47
>>> *To:* controller-dev; Kitt, Stephen; Alexis de Talhouƫt; Tom Pantelis;
>>> Sam Hague; Robert Varga
>>> *Subject:* [controller-dev] How to correctly wait for events to have
>>> been processed in an AbstractDataBrokerTest?
>>>
>>>
>>>
>>> Ahoi controller-dev and others who may have an idea (please + anyone
>>> else applicable),
>>>
>>> How do you write an AbstractDataBrokerTest and in it wait for a put on
>>> the DataBroker to have processed by all of its registered
>>> DataTreeChangeListener ?
>>>
>>> Background with concrete example: The (Abstract)AclServiceTest  in
>>> https://git.opendaylight.org/gerrit/#/c/42109/ (see [1]) puts two
>>> entries into the DataBroker, the 2nd of which triggers a
>>> DataTreeChangeListener which ultimately calls some service. The test
>>> asserts that this service got called (slightly simplified, but that's the
>>> gist of that test).
>>>
>>> I've inserted a Thread.sleep(500) after the DataBroker put and before
>>> the assert, to give the DataTreeChangeListener a chance - I understand runs
>>> asynchronously, right?
>>>
>>> This sleep makes that test work just fine (contrary to without any
>>> sleep, when it fails, but just sometimes; that's always fun) - but I'm
>>> wondering if there would be better way to write these kind of tests,
>>> without sleep ... but not quite clear in my mind yet how.
>>>
>>> I've written tests like this before, using e.g.
>>> https://github.com/awaitility/awaitility, which is just a nice utility
>>> to poll say every 100ms for max. 2s for a certain condition to be true -
>>> but what is that condition in this scenario - what API / helper would one
>>> use to ask a DataBroker "have all of your listeners already processed all
>>> of your pending puts" ? If this is impossible as is today, would this seem
>>> like a fair enhancement request - would you consider adding something like
>>> this, specifically to aid in writing tests?
>>>
>>>
>>> [1] (Abstract)AclServiceTest is an AbstractDataBrokerTest, even if it
>>> doesn't extend AbstractDataBrokerTest; ignore that, it's just because of
>>> https://git.opendaylight.org/gerrit/#/c/43645/
>>>
>>> Thanks a lot,
>>>
>>> M.
>>>
>>> --
>>>
>>> Michael Vorburger <vorbur...@redhat.com> | IRC: vorburger @freenode | ~
>>> = http://vorburger.ch
>>>
>>
>>
>
>
> --
>
> Tx,
> M.
> --
> Michael Vorburger <vorbur...@redhat.com> | IRC: vorburger @freenode | ~ =
> http://vorburger.ch
>



-- 

Tx,
M.
--
Michael Vorburger <vorbur...@redhat.com> | IRC: vorburger @freenode | ~ =
http://vorburger.ch
_______________________________________________
controller-dev mailing list
controller-dev@lists.opendaylight.org
https://lists.opendaylight.org/mailman/listinfo/controller-dev

Reply via email to