package games.strategy.engine.lobby.server;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import games.strategy.engine.lobby.server.userDB.DBUserController;
import games.strategy.engine.message.MessageContext;
import games.strategy.net.IConnectionChangeListener;
import games.strategy.net.INode;
import games.strategy.net.IServerMessenger;
import games.strategy.net.Node;
import games.strategy.util.MD5Crypt;
import games.strategy.util.Util;
public class ModeratorControllerTest {
private final IServerMessenger serverMessenger = mock(IServerMessenger.class);
private ModeratorController moderatorController;
private ConnectionChangeListener connectionChangeListener;
private INode adminNode;
@Before
public void setUp() throws UnknownHostException {
moderatorController = new ModeratorController(serverMessenger, null);
final String adminName = Util.createUniqueTimeStamp();
new DBUserController().createUser(adminName, "n@n.n", MD5Crypt.crypt(adminName), true);
adminNode = new Node(adminName, InetAddress.getLocalHost(), 0);
}
@Test
public void testBoot() throws UnknownHostException {
MessageContext.setSenderNodeForThread(adminNode);
connectionChangeListener = new ConnectionChangeListener();
final INode booted = new Node("foo", InetAddress.getByAddress(new byte[] {1, 2, 3, 4}), 0);
doAnswer(new Answer<Void>() {
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
connectionChangeListener.connectionRemoved(invocation.getArgument(0));
return null;
}
}).when(serverMessenger).removeConnection(booted);
final INode dummyNode = new Node("dummy", InetAddress.getLocalHost(), 0);
when(serverMessenger.getServerNode()).thenReturn(dummyNode);
moderatorController.boot(booted);
assertTrue(connectionChangeListener.getRemoved().contains(booted));
}
@Test
public void testCantResetAdminPassword() {
MessageContext.setSenderNodeForThread(adminNode);
final String newPassword = MD5Crypt.crypt("" + System.currentTimeMillis());
assertNotNull(moderatorController.setPassword(adminNode, newPassword));
}
@Test
public void testResetUserPasswordUnknownUser() throws UnknownHostException {
MessageContext.setSenderNodeForThread(adminNode);
final String newPassword = MD5Crypt.crypt("" + System.currentTimeMillis());
final INode node = new Node(Util.createUniqueTimeStamp(), InetAddress.getLocalHost(), 0);
assertNotNull(moderatorController.setPassword(node, newPassword));
}
@Test
public void testAssertAdmin() {
MessageContext.setSenderNodeForThread(adminNode);
assertTrue(moderatorController.isAdmin());
}
private static class ConnectionChangeListener implements IConnectionChangeListener {
final List<INode> removed = new ArrayList<>();
@Override
public void connectionAdded(final INode to) {}
@Override
public void connectionRemoved(final INode to) {
removed.add(to);
}
public List<INode> getRemoved() {
return removed;
}
}
}