I also say +1.  I’d love to see the layers thinned out of the Arquillian test, 
but this could be done in another PR.

Sveltin, if you’re up for it I can probably use this as an excuse to pull some 
Arquillian devs over for some fun hacking :)


-- 
David Blevins
http://twitter.com/dblevins
http://www.tomitribe.com

> On Jul 14, 2017, at 5:14 AM, Romain Manni-Bucau <rmannibu...@gmail.com> wrote:
> 
> looks good to apply to me
> 
> 
> Romain Manni-Bucau
> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
> <https://blog-rmannibucau.rhcloud.com> | Old Blog
> <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
> LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE Factory
> <https://javaeefactory-rmannibucau.rhcloud.com>
> 
> 2017-07-14 12:55 GMT+02:00 Svetlin Zarev <svetlin.angelov.za...@gmail.com>:
> 
>> Hi,
>> 
>> Do you have any comments ? Do you thing that something is missing or maybe
>> that something additional is needed ?
>> 
>> Kind regards,
>> Svetlin
>> 
>> 2017-07-11 15:07 GMT+03:00 Romain Manni-Bucau <rmannibu...@gmail.com>:
>> 
>>> 2017-07-11 12:38 GMT+02:00 Svetlin Zarev <svetlin.angelov.zarev@gmail.
>> com
>>>> :
>>> 
>>>> I've added several JUnit test cases in openejb-core that should verify
>>>> IvmContext.list() behaviour, yet I'll feel safer if we keep the
>>> arquillian
>>>> test as well.
>>>> 
>>> 
>>> +1, both are needed
>>> 
>>> 
>>>> 
>>>> 2017-07-11 10:10 GMT+03:00 Romain Manni-Bucau <rmannibu...@gmail.com>:
>>>> 
>>>>> side note: embedded (not tomcat based) testing is needed to ensure we
>>>> don't
>>>>> break but doesn't fully test the ivmcontext code because the
>> federation
>>>> is
>>>>> different so guess starting with tomcat is not that bad.
>>>>> 
>>>>> 
>>>>> Romain Manni-Bucau
>>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>> <https://blog-rmannibucau.rhcloud.com> | Old Blog
>>>>> <http://rmannibucau.wordpress.com> | Github <https://github.com/
>>>>> rmannibucau> |
>>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE Factory
>>>>> <https://javaeefactory-rmannibucau.rhcloud.com>
>>>>> 
>>>>> 2017-07-11 8:28 GMT+02:00 Svetlin Zarev <svetlin.angelov.zarev@gmail.
>>> com
>>>>> :
>>>>> 
>>>>>> Hi David,
>>>>>> 
>>>>>> Thank you for sparing some time to look into my PR !
>>>>>> 
>>>>>>> I’m not sure I can see how the test actually works
>>>>>> 
>>>>>> The issue is that IvmContext.list() returns objects that are not
>>> really
>>>>>> bound into the listed context. For instance if you run the MCVE
>>>> attached
>>>>> to
>>>>>> the jira ticket you'll see that it returns [1]. There you can see
>>> that
>>>>>> TestEJB is bound in "java:" (and even appears several times!) or
>> that
>>>>>> "java:global" is bound in "java:module". But if you try to look up
>>>> those
>>>>>> entries, the lookup fails with a NameNotFoundException, because all
>>>> these
>>>>>> references are not really bound there. So the test recursively
>> lists
>>>> all
>>>>>> contexts in the JNDI tree and tries to lookup up every name-class
>>> pair
>>>>> that
>>>>>> is returned. If the lookup fails, it means that list() has returned
>>>>>> something that is not really there. You can compare [1] and [2]
>>> 9after
>>>>> the
>>>>>> fix) to see the difference in list()'s behaviour
>>>>>> 
>>>>>>> Is there a test for listBindings?  It’s mentioned as also broken,
>>>> but I
>>>>>> didn’t see a test for it.
>>>>>> 
>>>>>> IvmContext.listBindings() and IvmContext.list() use the very same
>>>>>> IvmContext.MyNamingEnumeration abstract class and share the very
>> same
>>>>> logic
>>>>>> to traverse the naming tree. I didn't write test for it because
>> they
>>>>> share
>>>>>> the same code, but I can easily modify it to run aginst both
>> methods.
>>>>>> 
>>>>>>> What is the PrintWriter used for?  It seems it could be useful to
>>>>> assert
>>>>>> it prints what we expect.  Not sure if that is there and I am
>> missing
>>>> it.
>>>>>> 
>>>>>> I thought it would be helpful to be able to see what went wrong if
>>> the
>>>>> test
>>>>>> fails. The IvmContextTest class collects the output from the
>>> servlet's
>>>>>> output stream (the print writer) and if the test fails it prints it
>>> in
>>>>> the
>>>>>> console.
>>>>>> 
>>>>>>> There is an IvmContextTest, could we put the test there?
>>>>>> 
>>>>>> That was my initial idea, but AppComposer's naming tree is very
>>>> different
>>>>>> that tomee's. For instance it does not have the "app", "global",
>> etc
>>>> top
>>>>>> level contexts and my fix has special code for such top-level
>>>> contexts. I
>>>>>> also was not bale to bind any env-entries to my EJB (I'm not really
>>>>>> familiar with how to write a proper appcomposer test, so I guess I
>>>> didn't
>>>>>> do something that I should have.). The env-entries are needed just
>> to
>>>>>> create a couple of branches to the tree in order to test if
>>>>>> MyNamingEnumeration.isMyChild() works correctly
>>>>>> 
>>>>>>> so we could potentially skip the plumbing of the
>>> test->servlet->ejb.
>>>>>> 
>>>>>> I'll look into it. I also have a few ideas for additioanl tests.
>>>>>> 
>>>>>> [1] https://gist.github.com/SvetlinZarev/
>>>> 6b9377fe05b7887d681491c3e9e538
>>>>> 21
>>>>>> [2] https://gist.github.com/SvetlinZarev/
>>>> db3b59404198cd494b45b23db7129e
>>>>> dd
>>>>>> 
>>>>>> Bets regards,
>>>>>> Svetlin
>>>>>> 
>>>>>> 2017-07-11 2:28 GMT+03:00 David Blevins <david.blev...@gmail.com>:
>>>>>> 
>>>>>>> Hi Svetlin!
>>>>>>> 
>>>>>>> This is an awesome catch.  Also, my apologies for the time you
>> had
>>> to
>>>>>>> spend in that code.  It literally hasn’t changed much since
>>> 1999/2000
>>>>> and
>>>>>>> it shows. :)
>>>>>>> 
>>>>>>> Looking at the PR I’m not sure I can see how the test actually
>>> works.
>>>>>>> Here’s what I can follow, any gaps you can fill in are excellent:
>>>>>>> 
>>>>>>> The call chain as I can see it:
>>>>>>> 
>>>>>>> - IvmContextTest.testListContextTree
>>>>>>> - IvmContextTest.validateTest("testListContextTree”)
>>>>>>> [network call]
>>>>>>> - IvmContextServlet.doGet     # invokes itself via reflection,
>>>> returns
>>>>>>> “true” if no exception
>>>>>>> [reflection call]
>>>>>>> - IvmContextServlet.testListContextTree
>>>>>>> - NamingBean.verifyListContext  # throws exception if
>> listContext
>>>>>> returns
>>>>>>> false
>>>>>>> - NamingBean.listContext
>>>>>>> 
>>>>>>> Looks like the essence of the test is in NamingBean.listContext.
>>>>> Inside
>>>>>>> it looks like the heart of it is that if we can’t lookup an item
>>>>> listed,
>>>>>> we
>>>>>>> return false.
>>>>>>> 
>>>>>>> Not sure if I got it perfectly, so definitely say so :)
>>>>>>> 
>>>>>>> Couple questions:
>>>>>>> 
>>>>>>>  - Is there a test for listBindings?  It’s mentioned as also
>>> broken,
>>>>> but
>>>>>>> I didn’t see a test for it.
>>>>>>> 
>>>>>>>  - What is the PrintWriter used for?  It seems it could be
>> useful
>>> to
>>>>>>> assert it prints what we expect.  Not sure if that is there and I
>>> am
>>>>>>> missing it.
>>>>>>> 
>>>>>>>  - There is an IvmContextTest, could we put the test there?
>>>>>>>    https://github.com/apache/tomee/blob/master/container/
>>>>>>> openejb-core/src/test/java/org/apache/openejb/ivm/naming/
>>>>>>> IvmContextTest.java
>>>>>>> 
>>>>>>> On the last one I noted the patched code mentions Tomcat, so
>> maybe
>>> it
>>>>>> does
>>>>>>> have to be Arquillian based.  If so, maybe we could still trim
>> out
>>>> some
>>>>>> of
>>>>>>> those layers.  I think Arquillian has the ability to execute
>> remote
>>>>> code,
>>>>>>> so we could potentially skip the plumbing of the
>>> test->servlet->ejb.
>>>>>>> 
>>>>>>> Regardless, looking IvmContext always makes my brain hurt so
>>>> incredibly
>>>>>>> well done surviving it.  You’re clearly quite sharp.
>>>>>>> 
>>>>>>> 
>>>>>>> -David
>>>>>>> 
>>>>>>> 
>>>>>>>> On Jul 10, 2017, at 4:08 AM, Svetlin Zarev
>>>>>> <svetlin.angelov.zarev@gmail.
>>>>>>> com> wrote:
>>>>>>>> 
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>>> I'd like to propose the following fix: [1]. It fixes
>>>>>>>> IvmContext.list()/listBindings(). There are several issues
>> that
>>>> are
>>>>>>> being
>>>>>>>> addressed:
>>>>>>>> 
>>>>>>>> * MyNamingEnumeration.gatherNodes() adds the wrong federated
>>>> context
>>>>>>>> entries in the result set. It should add the nodes belonging to
>>> the
>>>>>>>> "initiallyRequestedNode", otherwise in some cases we are adding
>>>> nodes
>>>>>>> from
>>>>>>>> two different parents (in other words we are mixing two
>> different
>>>>>>>> sub-contexts), which is incorrect.
>>>>>>>> 
>>>>>>>> * MyNamingEnumeration.isMyChild() considers entries that are
>> NOT
>>>>>>> children
>>>>>>>> to the "parent" tree as such - the original code was using
>>>>>> "parentTree",
>>>>>>> to
>>>>>>>> check if a given node is a child to another one, which is
>> wrong.
>>>> The
>>>>>>>> "parentTree" relationship indicates only the physical layout of
>>> the
>>>>>> tree,
>>>>>>>> and NOT the relationship between the sub-contexts and their
>>>> entries.
>>>>>>> Hence
>>>>>>>> it considers for instance "java:global" to be a child of
>>>>> "java:module"
>>>>>>>> which is obviously incorrect. The relationship between a
>> context
>>>> and
>>>>>> the
>>>>>>>> bound entries is denoted by the "parent" node. So when listing
>> a
>>>>>> context
>>>>>>>> isMyChild should rely only on the "parent" node. There is one
>>>>>> exception -
>>>>>>>> the top level contexts (app, global, etc) which do not have a
>>>> parent.
>>>>>>>> 
>>>>>>>> * Wrong parentNode is passed as argument to gatherNodes in case
>>> we
>>>>> are
>>>>>>>> listing the context for any "IvmContext != this. When we call
>>>>>>>> IvmContext.list(), it looks up the relevant IvmContext and
>> tries
>>> to
>>>>>>> build a
>>>>>>>> NamingEnumeration for its sub-tree. So far so good, but the
>>> looked
>>>> up
>>>>>>>> context might be different than the context on which we called
>>>>> list().
>>>>>> If
>>>>>>>> that's the case, the wrong NameNode is passed as "parent" to
>>>>>>> gatherNodes()
>>>>>>>> and as a result some nodes are not listed.
>>>>>>>> 
>>>>>>>> PS: This issue is relevant for tomee 1.7.x as well. i noticed
>> it
>>>> does
>>>>>> not
>>>>>>>> correctly list the naming tree as well. It also does not list
>> the
>>>>>>> federated
>>>>>>>> contexts which was implemented in  [3].
>>>>>>>> 
>>>>>>>> [1] https://github.com/apache/tomee/pull/88
>>>>>>>> [2] https://issues.apache.org/jira/browse/TOMEE-2087
>>>>>>>> [3] https://github.com/apache/tomee/pull/81
>>>>>>>> 
>>>>>>>> Best regards,
>>>>>>>> Svetlin
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 

Reply via email to