package games.strategy.net;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import java.net.SocketAddress;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import games.strategy.engine.ClientContext;
import games.strategy.engine.framework.startup.login.ClientLogin;
import games.strategy.engine.framework.startup.login.ClientLoginValidator;
import games.strategy.test.TestUtil;
import games.strategy.util.MD5Crypt;
public class MessengerLoginTest {
private int serverPort = -1;
@Before
public void setUp() {
serverPort = TestUtil.getUniquePort();
}
@Test
public void testSimple() throws Exception {
final ILoginValidator validator = new ILoginValidator() {
@Override
public String verifyConnection(final Map<String, String> propertiesSentToClient,
final Map<String, String> propertiesReadFromClient, final String clientName, final String mac,
final SocketAddress remoteAddress) {
return null;
}
@Override
public Map<String, String> getChallengeProperties(final String userName, final SocketAddress remoteAddress) {
return new HashMap<>();
}
};
final IConnectionLogin login = new IConnectionLogin() {
@Override
public void notifyFailedLogin(final String message) {
fail();
}
@Override
public Map<String, String> getProperties(final Map<String, String> challengProperties) {
return new HashMap<>();
}
};
final ServerMessenger server = new ServerMessenger("test", serverPort);
try {
server.setLoginValidator(validator);
server.setAcceptNewConnections(true);
final String mac = MacFinder.getHashedMacAddress();
final ClientMessenger client =
new ClientMessenger("localhost", serverPort, "fee", mac, new DefaultObjectStreamFactory(), login);
client.shutDown();
} finally {
server.shutDown();
}
}
@Test
public void testRefused() throws Exception {
final ILoginValidator validator = new ILoginValidator() {
@Override
public String verifyConnection(final Map<String, String> propertiesSentToClient,
final Map<String, String> propertiesReadFromClient, final String clientName, final String mac,
final SocketAddress remoteAddress) {
return "error";
}
@Override
public Map<String, String> getChallengeProperties(final String userName, final SocketAddress remoteAddress) {
return new HashMap<>();
}
};
final IConnectionLogin login = new IConnectionLogin() {
@Override
public void notifyFailedLogin(final String message) {}
@Override
public Map<String, String> getProperties(final Map<String, String> challengProperties) {
return new HashMap<>();
}
};
final ServerMessenger server = new ServerMessenger("test", serverPort);
try {
server.setLoginValidator(validator);
server.setAcceptNewConnections(true);
try {
final String mac = MacFinder.getHashedMacAddress();
new ClientMessenger("localhost", serverPort, "fee", mac, new DefaultObjectStreamFactory(), login);
fail("we should not have logged in");
} catch (final CouldNotLogInException expected) {
// we expect this exception
}
} finally {
server.shutDown();
}
}
@Test
public void testGetMagic() {
final String salt = "falafel";
final String password = "king";
final String encrypted = MD5Crypt.crypt(password, salt, MD5Crypt.MAGIC);
assertEquals(salt, MD5Crypt.getSalt(MD5Crypt.MAGIC, encrypted));
}
@Test
public void testPassword() throws Exception {
final ClientLoginValidator validator = new ClientLoginValidator(mock(IServerMessenger.class));
validator.setGamePassword("foo");
final IConnectionLogin login = new IConnectionLogin() {
@Override
public void notifyFailedLogin(final String message) {
fail();
}
@Override
public Map<String, String> getProperties(final Map<String, String> challengProperties) {
final String salt = challengProperties.get(ClientLoginValidator.SALT_PROPERTY);
final HashMap<String, String> rVal = new HashMap<>();
rVal.put(ClientLogin.PASSWORD_PROPERTY, MD5Crypt.crypt("foo", salt));
rVal.put(ClientLogin.ENGINE_VERSION_PROPERTY, ClientContext.engineVersion().toString());
return rVal;
}
};
final ServerMessenger server = new ServerMessenger("test", serverPort);
try {
server.setLoginValidator(validator);
server.setAcceptNewConnections(true);
final String mac = MacFinder.getHashedMacAddress();
final ClientMessenger client =
new ClientMessenger("localhost", serverPort, "fee", mac, new DefaultObjectStreamFactory(), login);
client.shutDown();
} finally {
server.shutDown();
}
}
}