@Test public void testMaxHardReferences() { final List<Metadata> list = new ArrayList<Metadata>(); createInstances(NNNN, list); assertTrue(MetadataCachedLookup.referenceKeeper.size() == MetadataCachedLookup.LIVE_REFERENCE_COUNT); Collections.reverse(list); for (int i = 0; i < list.size(); i++) { assertEquals(i < MetadataCachedLookup.LIVE_REFERENCE_COUNT, MetadataCachedLookup.referenceKeeper.contains(list.get(i))); } }
@Test public void testWeakReference() { final Metadata m1 = lookup.lookup(Metadata.class); // Flush m1 out of the reference keeper final List<Metadata> list = new ArrayList<Metadata>(); createInstances(NNNN, list); assertFalse(MetadataCachedLookup.referenceKeeper.contains(m1)); // m1 is keeping the same object alive final Metadata m2 = lookup.lookup(Metadata.class); assertSame(m1, m2); }
@Test public void testWeakReference2() { Metadata m1 = lookup.lookup(Metadata.class); // Flush m1 out of the reference keeper final List<Metadata> list = new ArrayList<Metadata>(); createInstances(NNNN, list); assertFalse(MetadataCachedLookup.referenceKeeper.contains(m1)); m1 = null; // only weak reference from now metadataFactory.creationCount = 0; final Metadata m2 = lookup.lookup(Metadata.class); assertNotNull(m2); assertSame(dataObject, m2.getDataObject()); assertEquals(0, metadataFactory.creationCount); // not a new instance, the weak ref still keeps the old one alive }
@Test public void testGC() { Metadata m1 = lookup.lookup(Metadata.class); // Flush m1 out of the reference keeper final List<Metadata> list = new ArrayList<Metadata>(); createInstances(NNNN, list); assertFalse(MetadataCachedLookup.referenceKeeper.contains(m1)); m1 = null; // only weak reference from now consumeAllAvailableMemory(); metadataFactory.creationCount = 0; final Metadata m2 = lookup.lookup(Metadata.class); assertNotNull(m2); assertSame(dataObject, m2.getDataObject()); assertEquals(1, metadataFactory.creationCount); // a new instance has been created }