package com.limegroup.gnutella.lws.server;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Test;
import junit.textui.TestRunner;
import org.limewire.lws.server.LWSServerUtil;
import org.limewire.lws.server.LWSDispatcherSupport.Responses;
/**
* Makes sure
* {@link LWSManager#registerHandler(String, LWSManagerCommandResponseHandler)}
* is working.
*/
public class HandlersTest extends AbstractCommunicationSupportWithNoLocalServer {
public HandlersTest(String s) {
super(s);
}
public static Test suite() {
return buildTestSuite(HandlersTest.class);
}
public static void main(String[] args) {
TestRunner.run(suite());
}
private class Handler extends LWSManager.AbstractHandler {
public Handler(String command) {
super(command);
}
private boolean handled = false;
public boolean getHandled() {
return handled;
}
public void resetHandled() {
handled = false;
}
public String handle(Map<String, String> args) {
assertEquals("a1 should map to A1", args.get("a1"), "A1");
assertEquals("b1 should map to B1", args.get("b1"), "B1");
assertEquals("c1 should map to C1", args.get("c1"), "C1");
handled = true;
return Responses.OK;
}
}
private void doCommand(String command, Handler handler, boolean handlingExpected) {
Map<String, String> args = new HashMap<String, String>() {{
put("a1", "A1");
put("b1", "B1");
put("c1", "C1");
}};
String response = sendCommandToClient(command, args, true);
String responseSubstring = LWSServerUtil.removeCallback(response);
String expectedResponse = handlingExpected ? Responses.OK : "";
assertEquals("unexpected response",
expectedResponse, responseSubstring);
assertEquals("unexpected handled state",
handlingExpected, handler.getHandled());
}
private void testHandlers(int count) {
String [] commands = new String[count];
Handler [] handlers = new Handler[count];
// Create and register handlers
for (int i=0; i < count; i++) {
commands[i] = "Foo" + i;
handlers[i] = new Handler(commands[i]);
assertTrue("registration failed",
getLWSManager().registerHandler(commands[i], handlers[i]));
}
// Send messages and expect handling
for (int i=0; i < count; i++) {
doCommand(commands[i], handlers[i], true);
}
// Unregister handlers
for (int i=0; i < count; i++) {
assertTrue("unregistration failed",
getLWSManager().unregisterHandler(commands[i]));
}
// Send messages again and expect no handling
for (int i=0; i < count; i++) {
handlers[i].resetHandled();
doCommand(commands[i], handlers[i], false);
}
}
public void testAddTwoHandlers() {
testHandlers(2);
}
public void testAddThreeHandlers() {
testHandlers(3);
}
/**
* Registering more than one handler for the same command overwrites
* the old registration with the new one.
*/
public void testWithTowHandlersAndSameName() {
String command = "Foo";
Handler handler1 = new Handler(command);
assertTrue("first registration failed",
getLWSManager().registerHandler(command, handler1));
Handler handler2 = new Handler(command);
assertTrue("duplicate registration failed",
getLWSManager().registerHandler(command, handler2));
}
}