You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Pierre De Rop (JIRA)" <ji...@apache.org> on 2015/07/30 21:12:05 UTC

[jira] [Created] (FELIX-4984) Issues in CircularReferenceTest

Pierre De Rop created FELIX-4984:
------------------------------------

             Summary: Issues in CircularReferenceTest
                 Key: FELIX-4984
                 URL: https://issues.apache.org/jira/browse/FELIX-4984
             Project: Felix
          Issue Type: Bug
          Components: Declarative Services (SCR)
            Reporter: Pierre De Rop
            Priority: Minor


This issue is described in the dev mailing list, in http://www.mail-archive.com/dev@felix.apache.org/msg37281.html

while working on FELIX-4955, I sometimes have the CircularReferenceTest failing.

Everything is located in my sandbox, in http://svn.apache.org/repos/asf/felix/sandbox/pderop/dependencymanager.ds/

To reproduce the test:

install eclipse Mars

install latest bndtools using "install new software" from Eclipse, and then add latest stable release from http://dl.bintray.com/bndtools/bndtools/latest/

install a java8 runtime (I'm using oracle java8 1.8.0_45, 64 bit version). The whole new dependencymanager.ds project is intented to be build in java8.

checkout my sandbox:
$ svn checkout http://svn.apache.org/repos/asf/felix/sandbox/pderop/dependencymanager.ds

go to "dependencymanager.ds" directory:
$ cd dependencymanager.ds/

due to a pending issue, you have to first build the DM bnd annotation plugin before importing the project into eclipse. to do so, just type:
$ ./gradlew org.apache.felix.dependencymanager.annotation:jar

now launch eclipse and use the the dependencymanager/ds directory as the workspace dir for Eclipse.

switch to BndTools perpective.

import the bndtools project into eclipse: Import -> Existing Projects into Workspace -> Browse -> select dependencymanager.ds directory (it is proposed by default).

normally, and hopefully, everything should compile fine. Junit tests are left in org.apache.felix.dependencymanager.ds/ directory and integration tests are located in org.apache.felix.dependencymanager.ds.itest/ directory.

Open under Eclipse the org.apache.felix.dependencymanager.ds.itest/src/org/apache/felix/scr/integration/CircularReferenceTest.java
I slightly modified it in order to dump stack traces when A component is bound multiple times to the same B instance.

(I believe that only delayed components are concerned by the issue).

For example, in the test_A11_B0n_delayed_A_first() method, I added a call to "assertABoundToOneB(a)" like this:

{code}
    @Test
    public void test_A11_B0n_delayed_A_first() throws InvalidSyntaxException
    {
        String componentNameA = "4.1.A.1.1.dynamic";
        final ComponentConfigurationDTO componentA = findComponentConfigurationByName( componentNameA, ComponentConfigurationDTO.SATISFIED );

        String componentNameB = "4.1.B.0.n.dynamic";
        final ComponentConfigurationDTO componentB = findComponentConfigurationByName( componentNameB, ComponentConfigurationDTO.SATISFIED );

        delay();

        A a = getServiceFromConfiguration(componentA, A.class);
        assertABoundToOneB(a);
        delay(); //async binding of a to b after circular ref detected
        B b = getServiceFromConfiguration(componentB, B.class);
        assertEquals( 1, b.getAs().size() );
    }
{code}

the "assertABoundToOneB(a)" call does this:

{code}
    private void assertABoundToOneB(A a) {
        if (a.getBs().size() != 1) {
            System.err.println("detected problem ...");
            a.dumpStackTracesWhenBWasBound();
        }
        assertEquals( 1, a.getBs().size());
    }
{code}

And stacktraces will be dumped in order to determine why A was bound two times to the same B instance.

it's possible that you have to run several times the "CircularReferenceTest" test before having a failure (and some stacktraces).

Thanks.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)