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/[email protected]/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)