@Test public void subcomponentReleaseThenGc() { assertBindingCallCounts(); component.childReleasableScope1Manager().releaseStrongReferences(); // release scope 3 assertBindingCallCounts(); // no change to scoped bindings gcAndWaitUntilWeakReferencesCleared( ParentModule.class, ChildModule.class, ChildReleasableScope1.class); // GC childAsserts.expectedCallsForChildReleasableScope1Thing++; // expect scope 3 bindings again assertBindingCallCounts(); }
@Test public void twoInstancesOfSameSubcomponent() { // Two instances of the same subcomponent. ChildAsserts child2Asserts = parentAsserts.newChildAsserts(); childAsserts.assertBindingCallCounts(); child2Asserts.assertBindingCallCounts(); component.childReleasableScope1Manager().releaseStrongReferences(); // release scope 3 childAsserts.assertBindingCallCounts(); // no change to scoped bindings in child 1 child2Asserts.assertBindingCallCounts(); // no change to scoped bindings in child 2 gcAndWaitUntilWeakReferencesCleared( ParentModule.class, ChildModule.class, ChildReleasableScope1.class); // GC childAsserts.expectedCallsForChildReleasableScope1Thing++; // expect scope 3 bindings again childAsserts.assertBindingCallCounts(); // when calling child.things() child2Asserts.expectedCallsForChildReleasableScope1Thing++; // expect scope 3 bindings yet again child2Asserts.assertBindingCallCounts(); // when calling child2.things() }
@Test public void releasableReferenceManagers() { ImmutableMap<Class<? extends Annotation>, ReleasableReferenceManager> managers = Maps.uniqueIndex( component.managers(), new Function<ReleasableReferenceManager, Class<? extends Annotation>>() { @Override public Class<? extends Annotation> apply( ReleasableReferenceManager releasableReferenceManager) { return releasableReferenceManager.scope(); } }); assertThat(managers) .containsEntry(ParentReleasableScope1.class, component.parentReleasableScope1Manager()); assertThat(managers) .containsEntry(ParentReleasableScope2.class, component.parentReleasableScope2Manager()); assertThat(managers) .containsEntry(ChildReleasableScope1.class, component.childReleasableScope1Manager()); assertThat(managers) .containsEntry(ChildReleasableScope2.class, component.childReleasableScope2Manager()); // Should contain a manager for ChildReleasableScope3 even though // @ForReleasableReferences(Scope5.class) isn't needed. assertThat(managers).containsKey(ChildReleasableScope3.class); }