Adding unit test for WebSocket communication and fixing a bug found by the unit test.

This commit is contained in:
lotodore
2015-01-31 22:51:03 +01:00
parent 988d05e236
commit a57c344b11
2 changed files with 137 additions and 1 deletions
+1 -1
View File
@@ -57,7 +57,7 @@ SessionData::SessionData(boost::shared_ptr<boost::asio::ip::tcp::socket> sock, S
} }
SessionData::SessionData(boost::shared_ptr<WebSocketData> webData, SessionId id, SessionDataCallback &cb, boost::asio::io_service &ioService, int /*filler*/) SessionData::SessionData(boost::shared_ptr<WebSocketData> webData, SessionId id, SessionDataCallback &cb, boost::asio::io_service &ioService, int /*filler*/)
: m_webData(webData), m_id(id), m_state(SessionData::Init), m_readyFlag(false), m_wantsLobbyMsg(true), : m_webData(webData), m_id(id), m_state(SessionData::Auth), m_readyFlag(false), m_wantsLobbyMsg(true),
m_activityTimeoutSec(0), m_activityWarningRemainingSec(0), m_initTimeoutTimer(ioService), m_globalTimeoutTimer(ioService), m_activityTimeoutSec(0), m_activityWarningRemainingSec(0), m_initTimeoutTimer(ioService), m_globalTimeoutTimer(ioService),
m_activityTimeoutTimer(ioService), m_callback(cb), m_authSession(NULL), m_curAuthStep(0) m_activityTimeoutTimer(ioService), m_callback(cb), m_authSession(NULL), m_curAuthStep(0)
{ {
@@ -0,0 +1,136 @@
/* 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 de.pokerth.test;
import static org.junit.Assert.*;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.concurrent.ArrayBlockingQueue;
import org.junit.Test;
import de.pokerth.protocol.ProtoBuf.AnnounceMessage;
import de.pokerth.protocol.ProtoBuf.AuthClientRequestMessage;
import de.pokerth.protocol.ProtoBuf.AuthMessage;
import de.pokerth.protocol.ProtoBuf.InitDoneMessage;
import de.pokerth.protocol.ProtoBuf.AnnounceMessage.ServerType;
import de.pokerth.protocol.ProtoBuf.AuthMessage.AuthMessageType;
import de.pokerth.protocol.ProtoBuf.PokerTHMessage;
import de.pokerth.protocol.ProtoBuf.LobbyMessage.LobbyMessageType;
import de.pokerth.protocol.ProtoBuf.PokerTHMessage.PokerTHMessageType;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
public class WebSocketTest extends TestBase {
protected static final String POKERTHWEBSOCKET = "ws://localhost:7233/pokerthwebsocket";
class PokerTHWebSocketClient extends WebSocketClient {
public ArrayBlockingQueue<ByteBuffer> messageQueue;
public PokerTHWebSocketClient(URI serverUri) {
super(serverUri);
messageQueue = new ArrayBlockingQueue<ByteBuffer>(100);
}
@Override
public void onOpen(ServerHandshake handshakedata) {
}
@Override
public void onMessage(String message) {
fail("All messages should be binary.");
}
@Override
public void onMessage(ByteBuffer message) {
try {
messageQueue.put(message);
} catch (InterruptedException e) {
fail("Message interrupted");
}
}
@Override
public void onClose(int code, String reason, boolean remote) {
}
@Override
public void onError(Exception ex) {
fail("WebSocket error: " + ex.getStackTrace());
}
}
protected void TestAnnounceMsg(AnnounceMessage announce, int numPlayersOnServer) {
assertEquals(PROTOCOL_VERSION_MAJOR, announce.getProtocolVersion().getMajorVersion());
assertEquals(PROTOCOL_VERSION_MINOR, announce.getProtocolVersion().getMinorVersion());
assertEquals(ServerType.serverTypeInternetAuth, announce.getServerType());
assertEquals(numPlayersOnServer, announce.getNumPlayersOnServer());
}
@Test
public void testWebSocketGuestLogin() throws Exception {
PokerTHWebSocketClient webClient = new PokerTHWebSocketClient(new URI(POKERTHWEBSOCKET));
webClient.connectBlocking();
ByteBuffer buffer = webClient.messageQueue.take();
PokerTHMessage msg = PokerTHMessage.parseFrom(buffer.array());
assertTrue(msg.hasAnnounceMessage());
TestAnnounceMsg(msg.getAnnounceMessage(), 0);
AnnounceMessage.Version requestedVersion = AnnounceMessage.Version.newBuilder()
.setMajorVersion(PROTOCOL_VERSION_MAJOR)
.setMinorVersion(PROTOCOL_VERSION_MINOR)
.build();
AuthClientRequestMessage init = AuthClientRequestMessage.newBuilder()
.setBuildId(0)
.setLogin(AuthClientRequestMessage.LoginType.guestLogin)
.setRequestedVersion(requestedVersion)
.setNickName(GuestUser)
.build();
AuthMessage auth = AuthMessage.newBuilder()
.setMessageType(AuthMessageType.Type_AuthClientRequestMessage)
.setAuthClientRequestMessage(init)
.build();
msg = PokerTHMessage.newBuilder()
.setMessageType(PokerTHMessageType.Type_AuthMessage)
.setAuthMessage(auth)
.build();
webClient.send(msg.toByteArray());
buffer = webClient.messageQueue.take();
msg = PokerTHMessage.parseFrom(buffer.array());
if (msg.hasLobbyMessage() && msg.getMessageType() == PokerTHMessageType.Type_LobbyMessage
&& msg.getLobbyMessage().hasInitDoneMessage() && msg.getLobbyMessage().getMessageType() == LobbyMessageType.Type_InitDoneMessage) {
InitDoneMessage initDone = msg.getLobbyMessage().getInitDoneMessage();
assertTrue(initDone.getYourPlayerId() != 0L);
assertTrue(!initDone.hasYourAvatarHash());
}
else {
failOnErrorMessage(msg);
fail("Invalid message.");
}
webClient.close();
}
}