/* PokerTH automated tests.
Copyright (C) 2010 Lothar May
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package pokerth_test;
import static org.junit.Assert.*;
import org.bn.*;
import org.junit.After;
import org.junit.Before;
import pokerth_protocol.*;
import pokerth_protocol.AnnounceMessage.AnnounceMessageSequenceType.ServerTypeEnumType;
import pokerth_protocol.AuthMessage.AuthMessageChoiceType;
import pokerth_protocol.InitMessage.InitMessageSequenceType;
import pokerth_protocol.InitMessage.InitMessageSequenceType.LoginChoiceType;
import pokerth_protocol.JoinGameRequestMessage.JoinGameRequestMessageSequenceType;
import pokerth_protocol.JoinGameRequestMessage.JoinGameRequestMessageSequenceType.JoinGameActionChoiceType;
import pokerth_protocol.NetGameInfo.EndRaiseModeEnumType;
import pokerth_protocol.NetGameInfo.NetGameTypeEnumType;
import pokerth_protocol.NetGameInfo.RaiseIntervalModeChoiceType;
import java.io.*;
import java.net.*;
import java.util.Collection;
public abstract class TestBase {
public final int PROTOCOL_VERSION_MAJOR = 2;
public final int PROTOCOL_VERSION_MINOR = 0;
public final String AuthUser = "user";
public final String AuthPassword = "pencil";
public final String GuestUser = "Guest112233";
public final String GamePassword = "äöü?ßÄÖÜ";
protected IEncoder encoder;
protected IDecoder decoder;
protected Socket sock;
@Before
public void setUp() throws Exception {
Thread.sleep(2000);
sock = new Socket("localhost", 7234);
encoder = CoderFactory.getInstance().newEncoder("BER");
decoder = CoderFactory.getInstance().newDecoder("BER");
}
@After
public void tearDown() throws IOException {
sock.close();
}
public void sendMessage(PokerTHMessage msg) throws Exception {
sendMessage(msg, sock);
}
public void sendMessage(PokerTHMessage msg, Socket s) throws Exception {
encoder.encode(msg, s.getOutputStream());
}
public PokerTHMessage receiveMessage() throws Exception {
return receiveMessage(sock);
}
public PokerTHMessage receiveMessage(Socket s) throws Exception {
return decoder.decode(s.getInputStream(), PokerTHMessage.class);
}
public long guestInit() throws Exception {
return guestInit(sock);
}
public long guestInit(Socket s) throws Exception {
long playerId = 0;
PokerTHMessage msg = receiveMessage(s);
assertTrue(msg.isAnnounceMessageSelected());
Version requestedVersion = new Version();
requestedVersion.setMajor(PROTOCOL_VERSION_MAJOR);
requestedVersion.setMinor(PROTOCOL_VERSION_MINOR);
GuestLogin guestLogin = new GuestLogin();
guestLogin.setNickName(GuestUser);
LoginChoiceType loginType = new LoginChoiceType();
loginType.selectGuestLogin(guestLogin);
InitMessageSequenceType msgType = new InitMessageSequenceType();
msgType.setBuildId(0L);
msgType.setLogin(loginType);
msgType.setRequestedVersion(requestedVersion);
InitMessage init = new InitMessage();
init.setValue(msgType);
msg = new PokerTHMessage();
msg.selectInitMessage(init);
sendMessage(msg, s);
msg = receiveMessage(s);
if (msg.isInitAckMessageSelected()) {
InitAckMessage initAck = msg.getInitAckMessage();
assertTrue(initAck.getValue().getYourPlayerId().getValue() != 0L);
assertTrue(!initAck.getValue().isYourAvatarPresent());
playerId = initAck.getValue().getYourPlayerId().getValue();
}
else {
failOnErrorMessage(msg);
fail("Invalid message.");
}
// Waiting for player list update.
msg = receiveMessage(s);
if (!msg.isPlayerListMessageSelected()) {
failOnErrorMessage(msg);
fail("Invalid message.");
}
return playerId;
}
public long userInit() throws Exception {
return userInit(sock, AuthUser, AuthPassword);
}
public long userInit(Socket s, String user, String password) throws Exception {
return userInit(s, user, password, null);
}
public long userInit(Socket s, String user, String password, byte[] avatarData) throws Exception {
long playerId = 0;
PokerTHMessage msg = receiveMessage(s);
AnnounceMessage announce = msg.getAnnounceMessage();
assertTrue(announce.getValue().getServerType().getValue() == ServerTypeEnumType.EnumType.serverTypeInternetAuth);
ScramSha1 scramAuth = new ScramSha1();
// Send challenge.
Version requestedVersion = new Version();
requestedVersion.setMajor(PROTOCOL_VERSION_MAJOR);
requestedVersion.setMinor(PROTOCOL_VERSION_MINOR);
AuthenticatedLogin authLogin = new AuthenticatedLogin();
AvatarHash avatar = null;
if (avatarData != null) {
avatar = new AvatarHash(avatarData);
}
authLogin.setAvatar(avatar);
authLogin.setClientUserData(scramAuth.executeStep1(user).getBytes());
LoginChoiceType loginType = new LoginChoiceType();
loginType.selectAuthenticatedLogin(authLogin);
InitMessageSequenceType msgType = new InitMessageSequenceType();
msgType.setBuildId(0L);
msgType.setLogin(loginType);
msgType.setRequestedVersion(requestedVersion);
InitMessage init = new InitMessage();
init.setValue(msgType);
msg = new PokerTHMessage();
msg.selectInitMessage(init);
sendMessage(msg, s);
msg = receiveMessage(s);
if (msg.isAuthMessageSelected() && msg.getAuthMessage().getValue().isAuthServerChallengeSelected())
{
String serverFirstMessage = new String(msg.getAuthMessage().getValue().getAuthServerChallenge().getServerChallenge());
AuthClientResponse authClient = new AuthClientResponse();
authClient.setClientResponse(scramAuth.executeStep2(password, serverFirstMessage).getBytes());
AuthMessageChoiceType authChoice = new AuthMessageChoiceType();
authChoice.selectAuthClientResponse(authClient);
AuthMessage authResponse = new AuthMessage();
authResponse.setValue(authChoice);
msg = new PokerTHMessage();
msg.selectAuthMessage(authResponse);
sendMessage(msg, s);
}
failOnErrorMessage(msg);
msg = receiveMessage(s);
failOnErrorMessage(msg);
msg = receiveMessage(s);
if (msg.isInitAckMessageSelected()) {
InitAckMessage initAck = msg.getInitAckMessage();
assertTrue(initAck.getValue().getYourPlayerId().getValue() != 0L);
assertTrue(!initAck.getValue().isYourAvatarPresent());
playerId = initAck.getValue().getYourPlayerId().getValue();
}
else {
failOnErrorMessage(msg);
fail("Invalid message.");
}
// Waiting for player list update.
do {
msg = receiveMessage(s);
} while (msg.isGameListMessageSelected() || msg.isGamePlayerMessageSelected());
if (!msg.isPlayerListMessageSelected()) {
failOnErrorMessage(msg);
fail("Invalid message.");
}
return playerId;
}
public PokerTHMessage createGameRequestMsg(NetGameInfo gameInfo, NetGameTypeEnumType.EnumType type, int playerActionTimeout, int guiSpeed, String password, boolean autoLeave) {
NetGameTypeEnumType gameType = new NetGameTypeEnumType();
gameType.setValue(type);
gameInfo.setNetGameType(gameType);
gameInfo.setPlayerActionTimeout(playerActionTimeout);
gameInfo.setProposedGuiSpeed(guiSpeed);
JoinNewGame joinNew = new JoinNewGame();
joinNew.setGameInfo(gameInfo);
JoinGameActionChoiceType joinAction = new JoinGameActionChoiceType();
joinAction.selectJoinNewGame(joinNew);
JoinGameRequestMessageSequenceType joinType = new JoinGameRequestMessageSequenceType();
joinType.setJoinGameAction(joinAction);
if (!password.isEmpty()) {
joinType.setPassword(password);
}
joinType.setAutoLeave(autoLeave);
JoinGameRequestMessage joinRequest = new JoinGameRequestMessage();
joinRequest.setValue(joinType);
PokerTHMessage msg = new PokerTHMessage();
msg.selectJoinGameRequestMessage(joinRequest);
return msg;
}
public PokerTHMessage joinGameRequestMsg(long gameId, String password, boolean autoLeave) {
JoinExistingGame joinExisting = new JoinExistingGame();
joinExisting.setGameId(new NonZeroId(gameId));
JoinGameActionChoiceType joinAction = new JoinGameActionChoiceType();
joinAction.selectJoinExistingGame(joinExisting);
JoinGameRequestMessageSequenceType joinType = new JoinGameRequestMessageSequenceType();
joinType.setJoinGameAction(joinAction);
if (!password.isEmpty()) {
joinType.setPassword(password);
}
joinType.setAutoLeave(autoLeave);
JoinGameRequestMessage joinRequest = new JoinGameRequestMessage();
joinRequest.setValue(joinType);
PokerTHMessage msg = new PokerTHMessage();
msg.selectJoinGameRequestMessage(joinRequest);
return msg;
}
public NetGameInfo createGameInfo(int delayBetweenHands, EndRaiseModeEnumType.EnumType endMode, int endRaiseValue, int sb, String gameName,
Collection manualBlinds, int maxNumPlayers, int raiseEveryMinutes, int raiseEveryHands, int startMoney) {
NetGameInfo gameInfo = new NetGameInfo();
EndRaiseModeEnumType endRaise = new EndRaiseModeEnumType();
endRaise.setValue(endMode);
gameInfo.setDelayBetweenHands(delayBetweenHands);
gameInfo.setEndRaiseMode(endRaise);
gameInfo.setEndRaiseSmallBlindValue(endRaiseValue);
gameInfo.setFirstSmallBlind(sb);
gameInfo.setGameName(gameName);
gameInfo.setManualBlinds(manualBlinds);
gameInfo.setMaxNumPlayers(maxNumPlayers);
RaiseIntervalModeChoiceType raiseInterval = new RaiseIntervalModeChoiceType();
if (raiseEveryMinutes > 0) {
raiseInterval.selectRaiseEveryMinutes(raiseEveryMinutes);
}
else {
raiseInterval.selectRaiseEveryHands(raiseEveryHands);
}
gameInfo.setRaiseIntervalMode(raiseInterval);
gameInfo.setStartMoney(startMoney);
return gameInfo;
}
void failOnErrorMessage(PokerTHMessage msg) {
if (msg.isErrorMessageSelected())
{
ErrorMessage error = msg.getErrorMessage();
fail("Received error: " + error.getValue().getErrorReason().getValue().toString());
}
}
}