package com.limegroup.gnutella; import java.util.Collections; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import junit.framework.Test; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.api.Invocation; import org.jmock.lib.action.CustomAction; import org.limewire.io.GUID; import org.limewire.io.IpPort; import org.limewire.io.IpPortImpl; import org.limewire.io.IpPortSet; import org.limewire.io.NetworkInstanceUtils; import org.limewire.util.BaseTestCase; import com.google.inject.Injector; import com.limegroup.gnutella.uploader.HTTPHeaderUtils; public class PushEndpointCacheImplTest extends BaseTestCase { private PushEndpointCacheImpl pushEndpointCacheImpl; private Mockery context; private ScheduledExecutorService executorService; private Runnable weakCleaner; private HTTPHeaderUtils httpHeaderUtils; private NetworkInstanceUtils networkInstanceUtils; public PushEndpointCacheImplTest(String name) { super(name); } public static Test suite() { return buildTestSuite(PushEndpointCacheImplTest.class); } @Override protected void setUp() throws Exception { context = new Mockery(); executorService = context.mock(ScheduledExecutorService.class); context.checking(new Expectations() {{ allowing(executorService).scheduleWithFixedDelay(with(any(Runnable.class)), with(any(Long.class)), with(any(Long.class)), with(any(TimeUnit.class))); will(new CustomAction("savefield") { public Object invoke(Invocation invocation) throws Throwable { weakCleaner = (Runnable) invocation.getParameter(0); return null; } }); }}); Injector injector = LimeTestUtils.createInjector(); httpHeaderUtils = injector.getInstance(HTTPHeaderUtils.class); networkInstanceUtils = injector.getInstance(NetworkInstanceUtils.class); pushEndpointCacheImpl = new PushEndpointCacheImpl(executorService, httpHeaderUtils, networkInstanceUtils); } public void testCachedEntriesAreExpunged() throws Exception { assertNotNull(weakCleaner); Set<IpPort> proxies = Collections.emptySet(); GUID guid = new GUID(); PushEndpoint pushEndpoint = new PushEndpointImpl(guid.bytes(), proxies, (byte)0, 1, new IpPortImpl("127.0.0.1:6666"), pushEndpointCacheImpl, networkInstanceUtils); assertNull(pushEndpointCacheImpl.getCached(guid)); assertNull(pushEndpointCacheImpl.getPushEndpoint(guid)); pushEndpoint.updateProxies(true); assertNotNull(pushEndpointCacheImpl.getCached(guid)); assertNotNull(pushEndpointCacheImpl.getPushEndpoint(guid)); System.gc(); weakCleaner.run(); assertNotNull(pushEndpointCacheImpl.getCached(guid)); assertNotNull(pushEndpointCacheImpl.getPushEndpoint(guid)); // now lose instance pushEndpoint = null; System.gc(); weakCleaner.run(); assertNull(pushEndpointCacheImpl.getCached(guid)); assertNull(pushEndpointCacheImpl.getPushEndpoint(guid)); } public void testRemoveProxy() throws Exception { Set<IpPort> proxies = new IpPortSet(new IpPortImpl("199.19.49.4", 55), new IpPortImpl("119.1.49.4", 4545)); GUID guid = new GUID(); PushEndpoint pushEndpoint = new PushEndpointImpl(guid.bytes(), proxies, (byte)0, 1, new IpPortImpl("127.0.0.1:6666"), pushEndpointCacheImpl, networkInstanceUtils); assertNull(pushEndpointCacheImpl.getCached(guid)); assertNull(pushEndpointCacheImpl.getPushEndpoint(guid)); pushEndpoint.updateProxies(true); assertNotNull(pushEndpointCacheImpl.getCached(guid)); assertNotNull(pushEndpointCacheImpl.getPushEndpoint(guid)); assertEquals(2, pushEndpointCacheImpl.getPushEndpoint(guid).getProxies().size()); pushEndpointCacheImpl.removePushProxy(guid.bytes(), new IpPortImpl("199.19.49.4", 55)); assertEquals(1, pushEndpointCacheImpl.getPushEndpoint(guid).getProxies().size()); assertEquals(1, pushEndpoint.getProxies().size()); pushEndpointCacheImpl.removePushProxy(guid.bytes(), new IpPortImpl("119.1.49.4", 4545)); assertEquals(0, pushEndpointCacheImpl.getPushEndpoint(guid).getProxies().size()); assertEquals(0, pushEndpoint.getProxies().size()); } }