Adding new java based test cases.
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
/* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package pokerth_test;
|
||||
|
||||
import org.junit.internal.TextListener;
|
||||
import org.junit.runner.JUnitCore;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Suite;
|
||||
|
||||
@RunWith(Suite.class)
|
||||
@Suite.SuiteClasses( {
|
||||
GuestLoginTest.class,
|
||||
AuthLoginTest.class,
|
||||
CreateGameTest.class
|
||||
})
|
||||
public class AllTests {
|
||||
public static void main(String[] args)
|
||||
{
|
||||
JUnitCore junit = new JUnitCore();
|
||||
junit.addListener(new TextListener(System.out));
|
||||
if (!junit.run(AllTests.class).wasSuccessful())
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
/* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package pokerth_test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import pokerth_protocol.*;
|
||||
import pokerth_protocol.AnnounceMessage.AnnounceMessageSequenceType.ServerTypeEnumType;
|
||||
import pokerth_protocol.AuthMessage.AuthMessageChoiceType;
|
||||
import pokerth_protocol.InitMessage.*;
|
||||
import pokerth_protocol.InitMessage.InitMessageSequenceType.LoginChoiceType;
|
||||
|
||||
public class AuthLoginTest extends TestBase {
|
||||
|
||||
@Test
|
||||
public void testAuthLogin() throws Exception {
|
||||
PokerTHMessage msg = receiveMessage();
|
||||
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();
|
||||
authLogin.setClientUserData(scramAuth.executeStep1(AuthUser).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);
|
||||
|
||||
msg = receiveMessage();
|
||||
|
||||
if (msg.isAuthMessageSelected() && msg.getAuthMessage().getValue().isAuthServerChallengeSelected())
|
||||
{
|
||||
String serverFirstMessage = new String(msg.getAuthMessage().getValue().getAuthServerChallenge().getServerChallenge());
|
||||
AuthClientResponse authClient = new AuthClientResponse();
|
||||
authClient.setClientResponse(scramAuth.executeStep2(AuthPassword, serverFirstMessage).getBytes());
|
||||
AuthMessageChoiceType authChoice = new AuthMessageChoiceType();
|
||||
authChoice.selectAuthClientResponse(authClient);
|
||||
AuthMessage authResponse = new AuthMessage();
|
||||
authResponse.setValue(authChoice);
|
||||
|
||||
msg = new PokerTHMessage();
|
||||
msg.selectAuthMessage(authResponse);
|
||||
sendMessage(msg);
|
||||
}
|
||||
else if (msg.isErrorMessageSelected())
|
||||
{
|
||||
ErrorMessage error = msg.getErrorMessage();
|
||||
fail("Received error: " + error.getValue().getErrorReason().getValue().toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
fail("Invalid auth message.");
|
||||
}
|
||||
|
||||
msg = receiveMessage();
|
||||
if (msg.isErrorMessageSelected())
|
||||
{
|
||||
ErrorMessage error = msg.getErrorMessage();
|
||||
fail("Received error: " + error.getValue().getErrorReason().getValue().toString());
|
||||
}
|
||||
else if (!msg.isAuthMessageSelected() || !msg.getAuthMessage().getValue().isAuthServerVerificationSelected())
|
||||
{
|
||||
fail("Invalid auth message.");
|
||||
}
|
||||
|
||||
msg = receiveMessage();
|
||||
if (msg.isInitAckMessageSelected())
|
||||
{
|
||||
InitAckMessage initAck = msg.getInitAckMessage();
|
||||
assertTrue(initAck.getValue().getYourPlayerId().getValue() != 0L);
|
||||
assertTrue(!initAck.getValue().isYourAvatarPresent());
|
||||
}
|
||||
else if (msg.isErrorMessageSelected())
|
||||
{
|
||||
ErrorMessage error = msg.getErrorMessage();
|
||||
fail("Received error: " + error.getValue().getErrorReason().getValue().toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
fail("Invalid response message.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,227 @@
|
||||
|
||||
//Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland
|
||||
//www.source-code.biz, www.inventec.ch/chdh
|
||||
//
|
||||
//This module is multi-licensed and may be used under the terms
|
||||
//of any of the following licenses:
|
||||
//
|
||||
//EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal
|
||||
//LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html
|
||||
//GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html
|
||||
//AL, Apache License, V2.0 or later, http://www.apache.org/licenses
|
||||
//BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php
|
||||
//
|
||||
//Please contact the author if you need another license.
|
||||
//This module is provided "as is", without warranties of any kind.
|
||||
|
||||
package pokerth_test;
|
||||
|
||||
/**
|
||||
* A Base64 encoder/decoder.
|
||||
*
|
||||
* <p>
|
||||
* This class is used to encode and decode data in Base64 format as described in RFC 1521.
|
||||
*
|
||||
* <p>
|
||||
* Project home page: <a href="http://www.source-code.biz/base64coder/java/">www.source-code.biz/base64coder/java</a><br>
|
||||
* Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>
|
||||
* Multi-licensed: EPL / LGPL / GPL / AL / BSD.
|
||||
*/
|
||||
public class Base64Coder {
|
||||
|
||||
//The line separator string of the operating system.
|
||||
private static final String systemLineSeparator = System.getProperty("line.separator");
|
||||
|
||||
//Mapping table from 6-bit nibbles to Base64 characters.
|
||||
private static char[] map1 = new char[64];
|
||||
static {
|
||||
int i=0;
|
||||
for (char c='A'; c<='Z'; c++) map1[i++] = c;
|
||||
for (char c='a'; c<='z'; c++) map1[i++] = c;
|
||||
for (char c='0'; c<='9'; c++) map1[i++] = c;
|
||||
map1[i++] = '+'; map1[i++] = '/'; }
|
||||
|
||||
//Mapping table from Base64 characters to 6-bit nibbles.
|
||||
private static byte[] map2 = new byte[128];
|
||||
static {
|
||||
for (int i=0; i<map2.length; i++) map2[i] = -1;
|
||||
for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }
|
||||
|
||||
/**
|
||||
* Encodes a string into Base64 format.
|
||||
* No blanks or line breaks are inserted.
|
||||
* @param s A String to be encoded.
|
||||
* @return A String containing the Base64 encoded data.
|
||||
*/
|
||||
public static String encodeString (String s) {
|
||||
return new String(encode(s.getBytes())); }
|
||||
|
||||
/**
|
||||
* Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters.
|
||||
* This method is compatible with <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>.
|
||||
* @param in An array containing the data bytes to be encoded.
|
||||
* @return A String containing the Base64 encoded data, broken into lines.
|
||||
*/
|
||||
public static String encodeLines (byte[] in) {
|
||||
return encodeLines(in, 0, in.length, 76, systemLineSeparator); }
|
||||
|
||||
/**
|
||||
* Encodes a byte array into Base 64 format and breaks the output into lines.
|
||||
* @param in An array containing the data bytes to be encoded.
|
||||
* @param iOff Offset of the first byte in <code>in</code> to be processed.
|
||||
* @param iLen Number of bytes to be processed in <code>in</code>, starting at <code>iOff</code>.
|
||||
* @param lineLen Line length for the output data. Should be a multiple of 4.
|
||||
* @param lineSeparator The line separator to be used to separate the output lines.
|
||||
* @return A String containing the Base64 encoded data, broken into lines.
|
||||
*/
|
||||
public static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) {
|
||||
int blockLen = (lineLen*3) / 4;
|
||||
if (blockLen <= 0) throw new IllegalArgumentException();
|
||||
int lines = (iLen+blockLen-1) / blockLen;
|
||||
int bufLen = ((iLen+2)/3)*4 + lines*lineSeparator.length();
|
||||
StringBuilder buf = new StringBuilder(bufLen);
|
||||
int ip = 0;
|
||||
while (ip < iLen) {
|
||||
int l = Math.min(iLen-ip, blockLen);
|
||||
buf.append (encode(in, iOff+ip, l));
|
||||
buf.append (lineSeparator);
|
||||
ip += l; }
|
||||
return buf.toString(); }
|
||||
|
||||
/**
|
||||
* Encodes a byte array into Base64 format.
|
||||
* No blanks or line breaks are inserted in the output.
|
||||
* @param in An array containing the data bytes to be encoded.
|
||||
* @return A character array containing the Base64 encoded data.
|
||||
*/
|
||||
public static char[] encode (byte[] in) {
|
||||
return encode(in, 0, in.length); }
|
||||
|
||||
/**
|
||||
* Encodes a byte array into Base64 format.
|
||||
* No blanks or line breaks are inserted in the output.
|
||||
* @param in An array containing the data bytes to be encoded.
|
||||
* @param iLen Number of bytes to process in <code>in</code>.
|
||||
* @return A character array containing the Base64 encoded data.
|
||||
*/
|
||||
public static char[] encode (byte[] in, int iLen) {
|
||||
return encode(in, 0, iLen); }
|
||||
|
||||
/**
|
||||
* Encodes a byte array into Base64 format.
|
||||
* No blanks or line breaks are inserted in the output.
|
||||
* @param in An array containing the data bytes to be encoded.
|
||||
* @param iOff Offset of the first byte in <code>in</code> to be processed.
|
||||
* @param iLen Number of bytes to process in <code>in</code>, starting at <code>iOff</code>.
|
||||
* @return A character array containing the Base64 encoded data.
|
||||
*/
|
||||
public static char[] encode (byte[] in, int iOff, int iLen) {
|
||||
int oDataLen = (iLen*4+2)/3; // output length without padding
|
||||
int oLen = ((iLen+2)/3)*4; // output length including padding
|
||||
char[] out = new char[oLen];
|
||||
int ip = iOff;
|
||||
int iEnd = iOff + iLen;
|
||||
int op = 0;
|
||||
while (ip < iEnd) {
|
||||
int i0 = in[ip++] & 0xff;
|
||||
int i1 = ip < iEnd ? in[ip++] & 0xff : 0;
|
||||
int i2 = ip < iEnd ? in[ip++] & 0xff : 0;
|
||||
int o0 = i0 >>> 2;
|
||||
int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
|
||||
int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
|
||||
int o3 = i2 & 0x3F;
|
||||
out[op++] = map1[o0];
|
||||
out[op++] = map1[o1];
|
||||
out[op] = op < oDataLen ? map1[o2] : '='; op++;
|
||||
out[op] = op < oDataLen ? map1[o3] : '='; op++; }
|
||||
return out; }
|
||||
|
||||
/**
|
||||
* Decodes a string from Base64 format.
|
||||
* No blanks or line breaks are allowed within the Base64 encoded input data.
|
||||
* @param s A Base64 String to be decoded.
|
||||
* @return A String containing the decoded data.
|
||||
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
|
||||
*/
|
||||
public static String decodeString (String s) {
|
||||
return new String(decode(s)); }
|
||||
|
||||
/**
|
||||
* Decodes a byte array from Base64 format and ignores line separators, tabs and blanks.
|
||||
* CR, LF, Tab and Space characters are ignored in the input data.
|
||||
* This method is compatible with <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>.
|
||||
* @param s A Base64 String to be decoded.
|
||||
* @return An array containing the decoded data bytes.
|
||||
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
|
||||
*/
|
||||
public static byte[] decodeLines (String s) {
|
||||
char[] buf = new char[s.length()];
|
||||
int p = 0;
|
||||
for (int ip = 0; ip < s.length(); ip++) {
|
||||
char c = s.charAt(ip);
|
||||
if (c != ' ' && c != '\r' && c != '\n' && c != '\t')
|
||||
buf[p++] = c; }
|
||||
return decode(buf, 0, p); }
|
||||
|
||||
/**
|
||||
* Decodes a byte array from Base64 format.
|
||||
* No blanks or line breaks are allowed within the Base64 encoded input data.
|
||||
* @param s A Base64 String to be decoded.
|
||||
* @return An array containing the decoded data bytes.
|
||||
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
|
||||
*/
|
||||
public static byte[] decode (String s) {
|
||||
return decode(s.toCharArray()); }
|
||||
|
||||
/**
|
||||
* Decodes a byte array from Base64 format.
|
||||
* No blanks or line breaks are allowed within the Base64 encoded input data.
|
||||
* @param in A character array containing the Base64 encoded data.
|
||||
* @return An array containing the decoded data bytes.
|
||||
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
|
||||
*/
|
||||
public static byte[] decode (char[] in) {
|
||||
return decode(in, 0, in.length); }
|
||||
|
||||
/**
|
||||
* Decodes a byte array from Base64 format.
|
||||
* No blanks or line breaks are allowed within the Base64 encoded input data.
|
||||
* @param in A character array containing the Base64 encoded data.
|
||||
* @param iOff Offset of the first character in <code>in</code> to be processed.
|
||||
* @param iLen Number of characters to process in <code>in</code>, starting at <code>iOff</code>.
|
||||
* @return An array containing the decoded data bytes.
|
||||
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
|
||||
*/
|
||||
public static byte[] decode (char[] in, int iOff, int iLen) {
|
||||
if (iLen%4 != 0) throw new IllegalArgumentException ("Length of Base64 encoded input string is not a multiple of 4.");
|
||||
while (iLen > 0 && in[iOff+iLen-1] == '=') iLen--;
|
||||
int oLen = (iLen*3) / 4;
|
||||
byte[] out = new byte[oLen];
|
||||
int ip = iOff;
|
||||
int iEnd = iOff + iLen;
|
||||
int op = 0;
|
||||
while (ip < iEnd) {
|
||||
int i0 = in[ip++];
|
||||
int i1 = in[ip++];
|
||||
int i2 = ip < iEnd ? in[ip++] : 'A';
|
||||
int i3 = ip < iEnd ? in[ip++] : 'A';
|
||||
if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
|
||||
throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
|
||||
int b0 = map2[i0];
|
||||
int b1 = map2[i1];
|
||||
int b2 = map2[i2];
|
||||
int b3 = map2[i3];
|
||||
if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
|
||||
throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
|
||||
int o0 = ( b0 <<2) | (b1>>>4);
|
||||
int o1 = ((b1 & 0xf)<<4) | (b2>>>2);
|
||||
int o2 = ((b2 & 3)<<6) | b3;
|
||||
out[op++] = (byte)o0;
|
||||
if (op<oLen) out[op++] = (byte)o1;
|
||||
if (op<oLen) out[op++] = (byte)o2; }
|
||||
return out; }
|
||||
|
||||
//Dummy constructor.
|
||||
private Base64Coder() {}
|
||||
|
||||
} // end class Base64Coder
|
||||
@@ -0,0 +1,115 @@
|
||||
/* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package pokerth_test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import pokerth_protocol.*;
|
||||
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;
|
||||
|
||||
public class CreateGameTest extends TestBase {
|
||||
|
||||
@Test
|
||||
public void testJoinGameRequestMessage() throws Exception {
|
||||
guestInit();
|
||||
|
||||
EndRaiseModeEnumType endRaise = new EndRaiseModeEnumType();
|
||||
endRaise.setValue(EndRaiseModeEnumType.EnumType.keepLastBlind);
|
||||
NetGameInfo gameInfo = new NetGameInfo();
|
||||
gameInfo.setDelayBetweenHands(6);
|
||||
gameInfo.setEndRaiseMode(endRaise);
|
||||
gameInfo.setEndRaiseSmallBlindValue(1000);
|
||||
gameInfo.setFirstSmallBlind(100);
|
||||
gameInfo.setGameName(GuestUser + " game test");
|
||||
Collection<Integer> l = new ArrayList<Integer>();
|
||||
l.add(250);
|
||||
l.add(600);
|
||||
l.add(1000);
|
||||
gameInfo.setManualBlinds(l);
|
||||
gameInfo.setMaxNumPlayers(10);
|
||||
NetGameTypeEnumType gameType = new NetGameTypeEnumType();
|
||||
gameType.setValue(NetGameTypeEnumType.EnumType.normalGame);
|
||||
gameInfo.setNetGameType(gameType);
|
||||
gameInfo.setPlayerActionTimeout(20);
|
||||
gameInfo.setProposedGuiSpeed(8);
|
||||
RaiseIntervalModeChoiceType raiseInterval = new RaiseIntervalModeChoiceType();
|
||||
raiseInterval.selectRaiseEveryHands(7);
|
||||
gameInfo.setRaiseIntervalMode(raiseInterval);
|
||||
gameInfo.setStartMoney(2000);
|
||||
JoinNewGame joinNew = new JoinNewGame();
|
||||
joinNew.setGameInfo(gameInfo);
|
||||
JoinGameActionChoiceType joinAction = new JoinGameActionChoiceType();
|
||||
joinAction.selectJoinNewGame(joinNew);
|
||||
JoinGameRequestMessageSequenceType joinType = new JoinGameRequestMessageSequenceType();
|
||||
joinType.setJoinGameAction(joinAction);
|
||||
joinType.setPassword(GamePassword);
|
||||
JoinGameRequestMessage joinRequest = new JoinGameRequestMessage();
|
||||
joinRequest.setValue(joinType);
|
||||
PokerTHMessage msg = new PokerTHMessage();
|
||||
msg.selectJoinGameRequestMessage(joinRequest);
|
||||
sendMessage(msg);
|
||||
|
||||
do {
|
||||
msg = receiveMessage();
|
||||
} while (msg.isPlayerListMessageSelected() || msg.isGameListMessageSelected());
|
||||
if (msg.isJoinGameReplyMessageSelected())
|
||||
{
|
||||
if (msg.getJoinGameReplyMessage().getValue().getJoinGameResult().isJoinGameAckSelected())
|
||||
{
|
||||
assertTrue(msg.getJoinGameReplyMessage().getValue().getGameId().getValue() != 0);
|
||||
NetGameInfo receivedGameInfo = msg.getJoinGameReplyMessage().getValue().getJoinGameResult().getJoinGameAck().getGameInfo();
|
||||
assertEquals(receivedGameInfo.getDelayBetweenHands(), gameInfo.getDelayBetweenHands());
|
||||
assertEquals(receivedGameInfo.getEndRaiseMode().getValue(), gameInfo.getEndRaiseMode().getValue());
|
||||
assertEquals(receivedGameInfo.getEndRaiseSmallBlindValue(), gameInfo.getEndRaiseSmallBlindValue());
|
||||
assertEquals(receivedGameInfo.getFirstSmallBlind(), gameInfo.getFirstSmallBlind());
|
||||
assertEquals(receivedGameInfo.getGameName(), gameInfo.getGameName());
|
||||
assertEquals(receivedGameInfo.getManualBlinds(), gameInfo.getManualBlinds());
|
||||
assertEquals(receivedGameInfo.getMaxNumPlayers(), gameInfo.getMaxNumPlayers());
|
||||
assertEquals(receivedGameInfo.getNetGameType().getValue(), gameInfo.getNetGameType().getValue());
|
||||
assertEquals(receivedGameInfo.getPlayerActionTimeout(), gameInfo.getPlayerActionTimeout());
|
||||
assertEquals(receivedGameInfo.getProposedGuiSpeed(), gameInfo.getProposedGuiSpeed());
|
||||
assertEquals(receivedGameInfo.getRaiseIntervalMode().getRaiseEveryHands(), gameInfo.getRaiseIntervalMode().getRaiseEveryHands());
|
||||
assertEquals(receivedGameInfo.getRaiseIntervalMode().getRaiseEveryMinutes(), gameInfo.getRaiseIntervalMode().getRaiseEveryMinutes());
|
||||
assertEquals(receivedGameInfo.getStartMoney(), gameInfo.getStartMoney());
|
||||
}
|
||||
else
|
||||
{
|
||||
fail("Game creation failed!");
|
||||
}
|
||||
}
|
||||
else if (msg.isErrorMessageSelected())
|
||||
{
|
||||
ErrorMessage error = msg.getErrorMessage();
|
||||
fail("Received error: " + error.getValue().getErrorReason().getValue().toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
fail("Invalid response message.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package pokerth_test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import pokerth_protocol.*;
|
||||
import pokerth_protocol.AnnounceMessage.AnnounceMessageSequenceType.ServerTypeEnumType;
|
||||
import pokerth_protocol.InitMessage.*;
|
||||
import pokerth_protocol.InitMessage.InitMessageSequenceType.LoginChoiceType;
|
||||
|
||||
public class GuestLoginTest extends TestBase {
|
||||
|
||||
@Test
|
||||
public void testInitMessage() throws Exception {
|
||||
guestInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
/* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package pokerth_test;
|
||||
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import de.rtner.security.auth.spi.MacBasedPRF;
|
||||
import de.rtner.security.auth.spi.PBKDF2Engine;
|
||||
import de.rtner.security.auth.spi.PBKDF2Parameters;
|
||||
|
||||
public class ScramSha1 {
|
||||
|
||||
String clientFirstMessageBare;
|
||||
SecureRandom random = new SecureRandom();
|
||||
|
||||
public String executeStep1(String username)
|
||||
{
|
||||
byte bytes[] = new byte[8];
|
||||
random.nextBytes(bytes);
|
||||
|
||||
String clientR = Base64Coder.encodeLines(bytes).trim();
|
||||
clientFirstMessageBare = "n=" + username + ",r=" + clientR + "\n";
|
||||
return "n,," + clientFirstMessageBare;
|
||||
}
|
||||
|
||||
public String executeStep2(String password, String serverFirstMessage) throws NoSuchAlgorithmException
|
||||
{
|
||||
MessageDigest md = MessageDigest.getInstance("SHA-1");
|
||||
MacBasedPRF hmac = new MacBasedPRF("HMacSha1");
|
||||
|
||||
StringTokenizer st = new StringTokenizer(serverFirstMessage, "=", true);
|
||||
st.nextToken("=");
|
||||
st.nextToken();
|
||||
String serverR = st.nextToken(",");
|
||||
st.nextToken();
|
||||
st.nextToken("=");
|
||||
st.nextToken();
|
||||
byte[] serverSalt = Base64Coder.decodeLines(st.nextToken(","));
|
||||
st.nextToken();
|
||||
st.nextToken("=");
|
||||
st.nextToken();
|
||||
String iterationCount = st.nextToken(",");
|
||||
|
||||
// SaltedPassword := Hi(Normalize(password), salt, i)
|
||||
PBKDF2Engine engine = new PBKDF2Engine(new PBKDF2Parameters("HMacSHA1", null, serverSalt, Integer.parseInt(iterationCount)));
|
||||
byte[] saltedPassword = engine.deriveKey(password, 20);
|
||||
|
||||
// ClientKey := HMAC(SaltedPassword, "Client Key")
|
||||
hmac.init(saltedPassword);
|
||||
byte[] clientKey = hmac.doFinal("Client Key".getBytes());
|
||||
|
||||
// StoredKey := H(ClientKey)
|
||||
byte[] storedKey = md.digest(clientKey);
|
||||
|
||||
// AuthMessage := client-first-message-bare + "," +
|
||||
// server-first-message + "," +
|
||||
// client-final-message-without-proof
|
||||
String clientFinalMessage = "c=biws,r=" + serverR;
|
||||
String strAuthMessage = clientFirstMessageBare + "," + serverFirstMessage + "," + clientFinalMessage;
|
||||
|
||||
// ClientSignature := HMAC(StoredKey, AuthMessage)
|
||||
hmac = new MacBasedPRF("HMacSha1");
|
||||
hmac.init(storedKey);
|
||||
byte[] clientSignature = hmac.doFinal(strAuthMessage.getBytes());
|
||||
|
||||
// ClientProof := ClientKey XOR ClientSignature
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
clientKey[i] ^= clientSignature[i];
|
||||
}
|
||||
|
||||
String clientProof = Base64Coder.encodeLines(clientKey).trim();
|
||||
clientFinalMessage += ",p=" + clientProof;
|
||||
return clientFinalMessage;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
/* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package pokerth_test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.bn.*;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import pokerth_protocol.AnnounceMessage;
|
||||
import pokerth_protocol.ErrorMessage;
|
||||
import pokerth_protocol.GuestLogin;
|
||||
import pokerth_protocol.InitAckMessage;
|
||||
import pokerth_protocol.InitMessage;
|
||||
import pokerth_protocol.PokerTHMessage;
|
||||
import pokerth_protocol.Version;
|
||||
import pokerth_protocol.AnnounceMessage.AnnounceMessageSequenceType.ServerTypeEnumType;
|
||||
import pokerth_protocol.InitMessage.InitMessageSequenceType;
|
||||
import pokerth_protocol.InitMessage.InitMessageSequenceType.LoginChoiceType;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
|
||||
public abstract class TestBase {
|
||||
|
||||
public final int PROTOCOL_VERSION_MAJOR = 1;
|
||||
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<PokerTHMessage> encoder;
|
||||
protected IDecoder decoder;
|
||||
private Socket sock;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
InetAddress localaddr = InetAddress.getLocalHost();
|
||||
sock = new Socket(localaddr, 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 void guestInit() throws Exception {
|
||||
guestInit(sock);
|
||||
}
|
||||
|
||||
public void guestInit(Socket s) throws Exception {
|
||||
PokerTHMessage msg = receiveMessage(s);
|
||||
AnnounceMessage announce = msg.getAnnounceMessage();
|
||||
assertTrue(announce.getValue().getServerType().getValue() == ServerTypeEnumType.EnumType.serverTypeInternetAuth);
|
||||
|
||||
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());
|
||||
}
|
||||
else if (msg.isErrorMessageSelected())
|
||||
{
|
||||
ErrorMessage error = msg.getErrorMessage();
|
||||
fail("Received error: " + error.getValue().getErrorReason().getValue().toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
fail("Invalid response message.");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user