fix: improve server test coverage and functionality

This commit is contained in:
punchready 2021-06-29 08:40:57 +02:00
parent bf3bd7d0a4
commit 1a8566895b

View File

@ -4,13 +4,16 @@ import org.java_websocket.WebSocket;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.mockito.MockedStatic; import org.mockito.MockedStatic;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.invocation.Invocation;
import org.tinylog.configuration.Configuration; import org.tinylog.configuration.Configuration;
import uulm.teamname.marvelous.gamelibrary.json.JSON; import uulm.teamname.marvelous.gamelibrary.json.JSON;
import uulm.teamname.marvelous.gamelibrary.messages.BasicMessage; import uulm.teamname.marvelous.gamelibrary.messages.BasicMessage;
import uulm.teamname.marvelous.gamelibrary.messages.ParticipantType;
import uulm.teamname.marvelous.gamelibrary.messages.RoleEnum; import uulm.teamname.marvelous.gamelibrary.messages.RoleEnum;
import uulm.teamname.marvelous.gamelibrary.messages.client.CharacterSelectionMessage; import uulm.teamname.marvelous.gamelibrary.messages.client.CharacterSelectionMessage;
import uulm.teamname.marvelous.gamelibrary.messages.client.HelloServerMessage; import uulm.teamname.marvelous.gamelibrary.messages.client.HelloServerMessage;
import uulm.teamname.marvelous.gamelibrary.messages.client.PlayerReadyMessage; import uulm.teamname.marvelous.gamelibrary.messages.client.PlayerReadyMessage;
import uulm.teamname.marvelous.gamelibrary.messages.client.ReconnectMessage;
import uulm.teamname.marvelous.gamelibrary.messages.server.*; import uulm.teamname.marvelous.gamelibrary.messages.server.*;
import uulm.teamname.marvelous.server.lobbymanager.LobbyConnection; import uulm.teamname.marvelous.server.lobbymanager.LobbyConnection;
import uulm.teamname.marvelous.server.lobbymanager.LobbyManager; import uulm.teamname.marvelous.server.lobbymanager.LobbyManager;
@ -66,7 +69,6 @@ class MarvelousServerTest extends BaseGameLogicTest {
// you should also understand the server, which serves as a good intro to it. You can - of course - also // you should also understand the server, which serves as a good intro to it. You can - of course - also
// just ignore it. // just ignore it.
@Test @Test
@Disabled("Work in progress complete server test")
void main() { void main() {
UserManager m = UserManager.getInstance(); UserManager m = UserManager.getInstance();
@ -96,15 +98,44 @@ class MarvelousServerTest extends BaseGameLogicTest {
ensurePlayerReady(m, p2, true, RoleEnum.PLAYER); ensurePlayerReady(m, p2, true, RoleEnum.PLAYER);
ensureSpectatorReady(m, s1, true, RoleEnum.SPECTATOR); ensureSpectatorReady(m, s1, true, RoleEnum.SPECTATOR);
//these are broken right now because Server doesn't get mocked in lobby threads ensureCharacterSelection(m, p1, true);
ensureCharacterSelection(m, p1, false); ensureCharacterSelection(m, p2, false);
ensureCharacterSelection(m, p2, true);
GameStructureMessage game = new GameStructureMessage();
game.playerOneName = "Player 1";
game.playerTwoName = "Player 2";
game.matchconfig = partyConfig;
game.scenarioconfig = scenarioConfig;
game.assignment = ParticipantType.PlayerOne;
ensureReceived(p1, game);
game.assignment = ParticipantType.PlayerTwo;
ensureReceived(p2, game);
game.assignment = ParticipantType.Spectator;
ensureReceived(s1, game);
EventMessage events = new EventMessage();
ensureReceived(p1, events);
ensureReceived(p2, events);
ensureReceived(s1, events);
clearInvocations(p1, p2, s1);
m.disconnectUser(p1, true);
m.connectUser(p1);
ensureHandshake(m, p1, "Player 1", "1234", true);
ReconnectMessage message = new ReconnectMessage();
message.reconnect = true;
sendMessage(m, p1, message);
ensureReceived(p1, new GeneralAssignmentMessage());
ensureReceived(p1, new GameStructureMessage()); ensureReceived(p1, new GameStructureMessage());
ensureReceived(p2, new GameStructureMessage());
ensureReceived(s1, new GameStructureMessage());
System.out.println("hi"); System.out.println("Test Completed");
} }
private void ensureHandshake(UserManager m, WebSocket c, String name, String deviceID, boolean runningGame) { private void ensureHandshake(UserManager m, WebSocket c, String name, String deviceID, boolean runningGame) {
@ -140,7 +171,7 @@ class MarvelousServerTest extends BaseGameLogicTest {
ensureResponse(m, c, message, response); ensureResponse(m, c, message, response);
} }
private void ensureCharacterSelection(UserManager m, WebSocket c, boolean selectionComplete) { private void ensureCharacterSelection(UserManager m, WebSocket c, boolean confirmSelection) {
CharacterSelectionMessage message = new CharacterSelectionMessage(); CharacterSelectionMessage message = new CharacterSelectionMessage();
message.characters = new Boolean[12]; message.characters = new Boolean[12];
for(int i = 0; i < 6; i++) { for(int i = 0; i < 6; i++) {
@ -150,13 +181,27 @@ class MarvelousServerTest extends BaseGameLogicTest {
message.characters[i] = false; message.characters[i] = false;
} }
ConfirmSelectionMessage response = new ConfirmSelectionMessage(); if(confirmSelection) {
response.selectionComplete = selectionComplete; ConfirmSelectionMessage response = new ConfirmSelectionMessage();
response.selectionComplete = false;
ensureResponse(m, c, message, response); ensureResponse(m, c, message, response);
} else {
sendMessage(m, c, message);
}
} }
/** Sends a message from the socket. */
private void sendMessage(UserManager m, WebSocket c, BasicMessage message) {
Optional<String> in = json.stringify(message);
if(in.isPresent()) {
m.messageReceived(c, in.get());
}else {
throw new IllegalArgumentException("[TEST] Message in test call could not be serialized!");
}
}
/** Ensures that the given socket received the given response in response to the given message. */ /** Ensures that the given socket received the given response in response to the given message. */
private void ensureResponse(UserManager m, WebSocket c, BasicMessage message, BasicMessage response) { private void ensureResponse(UserManager m, WebSocket c, BasicMessage message, BasicMessage response) {
Optional<String> in = json.stringify(message); Optional<String> in = json.stringify(message);
@ -173,10 +218,46 @@ class MarvelousServerTest extends BaseGameLogicTest {
} }
/** Ensures that the given socket received the given response. */ /** Ensures that the given socket received the given response. */
private void ensureReceived(WebSocket c, BasicMessage response) { private <T extends BasicMessage> void ensureReceived(WebSocket c, T response) {
verify(c).send((String)argThat( boolean found = false;
(out)->verifyResponse((String)out, response)
)); for(Invocation i: mockingDetails(c).getInvocations()) {
Optional<BasicMessage> received = json.parse(i.getArgument(0, String.class));
if(received.isPresent()) {
BasicMessage parsed = received.get();
if(parsed.getClass() != response.getClass()) {
continue; //message is not of the right type
}
T message = (T) parsed;
for(Field field: response.getClass().getDeclaredFields()) {
try {
Object value = field.get(response);
Object actualValue;
try {
actualValue = field.get(message);
}catch(IllegalArgumentException ignored) {
continue;
}
if(value != null && !value.equals(actualValue)) {
throw new IllegalArgumentException("[TEST] Field " + field.getName() + " expected to be '" + value + "' but was '" + field.get(message) + "'");
}
}catch(IllegalAccessException ignored) { }
}
found = true;
break;
}else {
throw new IllegalArgumentException("[TEST] Response in test call could not be deserialized!");
}
}
if(!found) {
throw new IllegalArgumentException("[TEST] Expected response " + response + " was not received!");
}
} }