package com.limegroup.gnutella.auth;
import junit.framework.Test;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.messages.vendor.ContentResponse;
import com.limegroup.gnutella.settings.ContentSettings;
import com.limegroup.gnutella.util.BaseTestCase;
import com.limegroup.gnutella.util.ManagedThread;
import com.limegroup.gnutella.util.PrivilegedAccessor;
public class ContentManagerTest extends BaseTestCase {
private static final String S_URN_1 = "urn:sha1:GLSTHIPQGSSZTS5FJUPAKPZWUGYQYPFB";
private static final String S_URN_2 = "urn:sha1:PLSTHIPQGSSZTS5FJUPAKOZWUGZQYPFB";
private static final String S_URN_3 = "urn:sha1:PABCDEFGAPOJTS5FJUPAKOZWUGZQYPFB";
private static URN URN_1;
private static URN URN_2;
private static URN URN_3;
private ContentManager mgr;
private ContentResponse crOne;
private ContentResponse crTwo;
private Observer one;
private Observer two;
private Observer three;
public ContentManagerTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(ContentManagerTest.class);
}
public static void globalSetUp() throws Exception {
URN_1 = URN.createSHA1Urn(S_URN_1);
URN_2 = URN.createSHA1Urn(S_URN_2);
URN_3 = URN.createSHA1Urn(S_URN_3);
}
public void setUp() throws Exception {
ContentSettings.CONTENT_MANAGEMENT_ACTIVE.setValue(true);
ContentSettings.USER_WANTS_MANAGEMENTS.setValue(true);
mgr = new ContentManager();
crOne = new ContentResponse(URN_1, true);
crTwo = new ContentResponse(URN_2, false);
one = new Observer();
two = new Observer();
three = new Observer();
assertNull(mgr.getResponse(URN_1));
assertNull(mgr.getResponse(URN_2));
assertNull(mgr.getResponse(URN_3));
assertNull(one.urn);
assertNull(two.urn);
assertNull(one.response);
assertNull(two.response);
}
public void teardown() throws Exception {
mgr.shutdown();
}
/**
* Makes sure that content messages add responses.
*
* @throws Exception
*/
public void testResponseStored() throws Exception {
mgr.request(URN_1, one, 0);
mgr.handleContentResponse(crOne);
assertNotNull(mgr.getResponse(URN_1));
assertNull(mgr.getResponse(URN_2));
ContentResponseData res = mgr.getResponse(URN_1);
assertTrue(res.isOK());
mgr.request(URN_2, two, 0);
mgr.handleContentResponse(crTwo);
assertNotNull(mgr.getResponse(URN_2));
res = mgr.getResponse(URN_2);
assertFalse(res.isOK());
}
/** Makes sure that handleResponse is called rightly. */
public void testHandleResponseCalled() throws Exception {
mgr.request(URN_1, one, 0);
mgr.request(URN_2, two, 0);
assertNull(one.urn);
assertNull(two.urn);
assertNull(one.response);
assertNull(two.response);
mgr.handleContentResponse(crOne);
assertEquals(URN_1, one.urn);
assertTrue(one.response.isOK());
assertNull(two.urn);
assertNull(two.response);
mgr.handleContentResponse(crTwo);
assertEquals(URN_2, two.urn);
assertFalse(two.response.isOK());
}
/** Tests immediate response. */
public void testImmediateHandleResponse() throws Exception {
mgr.request(URN_1, one, 0);
mgr.request(URN_2, two, 0);
mgr.handleContentResponse(crOne);
mgr.handleContentResponse(crTwo);
one = new Observer();
two = new Observer();
mgr.request(URN_1, one, 0);
mgr.request(URN_2, two, 0);
assertEquals(URN_1, one.urn);
assertTrue(one.response.isOK());
assertEquals(URN_2, two.urn);
assertFalse(two.response.isOK());
}
/** Makes sure that stuff times out. */
public void testTimeout() throws Exception {
mgr.initialize(); // must start timeout thread.
mgr.request(URN_1, one, 1);
mgr.request(URN_2, two, 1);
Thread.sleep(5000);
assertEquals(URN_1, one.urn);
assertNull(one.response);
assertEquals(URN_2, two.urn);
assertNull(two.response);
}
/** Makes sure that responses without requests aren't processed. */
public void testResponseWithoutRequest() throws Exception {
mgr.handleContentResponse(crOne);
assertNull(mgr.getResponse(URN_1));
}
/** Makes sure that isVerified works */
public void testIsVerified() throws Exception {
mgr.initialize();
assertFalse(mgr.isVerified(URN_1));
mgr.request(URN_1, one, 2000);
assertFalse(mgr.isVerified(URN_1));
Thread.sleep(5000);
assertTrue(mgr.isVerified(URN_1)); // verified by timeout (no response).
assertFalse(mgr.isVerified(URN_2));
mgr.request(URN_2, two, 2000);
assertFalse(mgr.isVerified(URN_2));
mgr.handleContentResponse(new ContentResponse(URN_2, true));
assertTrue(mgr.isVerified(URN_2)); // verified by true response
assertFalse(mgr.isVerified(URN_3));
mgr.request(URN_3, one, 2000);
assertFalse(mgr.isVerified(URN_3));
mgr.handleContentResponse(new ContentResponse(URN_3, false));
assertTrue(mgr.isVerified(URN_3)); // verified by false response.
}
/** Checks blocking requests. */
public void testBlockingRequest() throws Exception {
mgr.initialize();
Thread responder = new ManagedThread() {
public void managedRun() {
ContentManagerTest.sleep(1000);
mgr.handleContentResponse(crOne);
ContentManagerTest.sleep(1000);
mgr.handleContentResponse(crTwo);
}
};
responder.setDaemon(true);
responder.start();
long now = System.currentTimeMillis();
ContentResponseData rOne = mgr.request(URN_1, 3000);
assertNotNull(rOne);
assertTrue(rOne.isOK());
assertGreaterThan(600, System.currentTimeMillis() - now);
now = System.currentTimeMillis();
ContentResponseData rTwo = mgr.request(URN_2, 3000);
assertNotNull(rTwo);
assertFalse(rTwo.isOK());
assertGreaterThan(600, System.currentTimeMillis() - now);
now = System.currentTimeMillis();
ContentResponseData rThree = mgr.request(URN_3, 1000);
assertNull(rThree);
assertGreaterThan(900, System.currentTimeMillis() - now);
}
public void testVaryingTimeouts() throws Exception {
mgr.initialize();
mgr.request(URN_1, one, 6000);
mgr.request(URN_2, two, 2000);
mgr.request(URN_3, three, 10000);
assertNull(one.urn);
assertNull(two.urn);
assertNull(three.urn);
Thread.sleep(4000);
assertEquals(URN_2, two.urn);
assertNull(two.response);
assertNull(one.urn);
assertNull(three.urn);
Thread.sleep(4000);
assertEquals(URN_1, one.urn);
assertNull(one.response);
assertNull(three.urn);
Thread.sleep(4000);
assertEquals(URN_3, three.urn);
assertNull(three.response);
}
private static void sleep(int milliseconds) {
try {
Thread.sleep(milliseconds);
} catch(InterruptedException ix) {
throw new RuntimeException(ix);
}
}
private static class Observer implements ContentResponseObserver {
private URN urn;
private ContentResponseData response;
public void handleResponse(URN urn, ContentResponseData response) {
this.urn = urn;
this.response = response;
}
}
}