Пример #1
0
 def setUp(self):
     set_config('quarto_game_store', tempfile.mkdtemp())
     game_server = GameServer(configuration)
     game_wrapper.set_game_server(game_server)
     game_wrapper.set_flask_app(app)
     game_wrapper.set_socket_io(socketio)
     self.app = app.test_client()
 def setUp(self, _, __):
     self._server = GameServer(HOST, PORT)
class TestGameServer(unittest.TestCase):
    @unittest.mock.patch('socket.socket.bind')
    @unittest.mock.patch('socket.socket.listen')
    def setUp(self, _, __):
        self._server = GameServer(HOST, PORT)

    def test_is_active_player(self):
        expected_value = True
        actual_value = self._server._is_active_player(0)

        assert expected_value == actual_value

    def test_is_active_player_false(self):
        expected_value = False
        actual_value = self._server._is_active_player(1)

        assert expected_value == actual_value

    @unittest.mock.patch('socket.socket.accept',
                         return_value=(socket.socket(), None))
    @unittest.mock.patch('socket.socket.setblocking')
    def test_accept_new_connection(self, patched_blocking, patched_accept):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._accept_new_connection(sock)

        assert len(self._server._inputs) == 2
        assert len(self._server._message_queues.keys()) == 1

    @unittest.mock.patch.object(GameServer,
                                '_parse_command',
                                return_value='response')
    def test_read_client_data(self, patched_parse):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._message_queues[sock] = queue.Queue()

        data = b'input'

        self._server._read_client_data(sock, data)

        patched_parse.assert_called_once()
        assert sock in self._server._outputs

    @unittest.mock.patch.object(GameServer,
                                '_parse_command',
                                return_value='response')
    @unittest.mock.patch.object(GameServer, '_start_game')
    def test_read_client_data_starts_game(self, patched_start_game,
                                          patched_parse):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._message_queues[sock] = queue.Queue()
        self._server._connected_clients = 2

        data = b'input'

        self._server._read_client_data(sock, data)

        patched_parse.assert_called_once()
        patched_start_game.assert_called_once()
        assert sock in self._server._outputs

    @unittest.mock.patch('socket.socket.close')
    @unittest.mock.patch.object(GameServer, '_end_game_if_started')
    def test_disconnect_client(self, patched_end_game_if_started,
                               patched_close):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock)
        self._server._message_queues[sock] = queue.Queue()

        self._server._disconnect_client(sock)

        patched_close.assert_called_once()
        patched_end_game_if_started.assert_called_once()

    @unittest.mock.patch('socket.socket.close')
    @unittest.mock.patch.object(GameServer, '_end_game_if_started')
    def test_disconnect_client_removed_from_output(self,
                                                   patched_end_game_if_started,
                                                   patched_close):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock)
        self._server._outputs.append(sock)
        self._server._message_queues[sock] = queue.Queue()

        self._server._disconnect_client(sock)

        patched_close.assert_called_once()
        patched_end_game_if_started.assert_called_once()
        assert sock not in self._server._outputs

    @unittest.mock.patch('socket.socket.close')
    @unittest.mock.patch.object(GameServer, '_end_game_if_started')
    def test_handle_client_exception(self, patched_end_game_if_started,
                                     patched_close):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock)
        self._server._message_queues[sock] = queue.Queue()

        self._server._handle_client_exception(sock)

        patched_close.assert_called_once()
        patched_end_game_if_started.assert_called_once()

    @unittest.mock.patch('socket.socket.close')
    @unittest.mock.patch.object(GameServer, '_end_game_if_started')
    def test_handle_client_exception_removed_from_outputs(
            self, patched_end_game_if_started, patched_close):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock)
        self._server._outputs.append(sock)
        self._server._message_queues[sock] = queue.Queue()

        self._server._handle_client_exception(sock)

        patched_close.assert_called_once()
        patched_end_game_if_started.assert_called_once()
        assert sock not in self._server._outputs

    def test_shut_down(self):
        self._server._shut_down()
        assert len(self._server._inputs) == 0

    @unittest.mock.patch('queue.Queue.put')
    def test_end_game_if_started(self, patched_put):
        sock_one = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock_two = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock_one)
        self._server._inputs.append(sock_two)
        self._server._message_queues[sock_one] = queue.Queue()
        self._server._message_queues[sock_two] = queue.Queue()
        self._server._game_started = True

        self._server._end_game_if_started(sock_one)

        patched_put.assert_called_once()

    @unittest.mock.patch('queue.Queue.put')
    def test_end_game_if_started_game_not_started(self, patched_put):
        self._server._end_game_if_started(None)

        patched_put.assert_not_called()

    @unittest.mock.patch.object(GameServer, '_help_text')
    def test_parse_command_help(self, patched_help_text):
        test_name = 'Name'
        test_command = 'help'
        self._server._client_names[0] = test_name
        test_input = f'{test_name},{test_command}'

        self._server._parse_command(test_input, None)

        patched_help_text.assert_called_once()

    @unittest.mock.patch.object(GameBoard,
                                'game_board',
                                new_callable=unittest.mock.PropertyMock)
    def test_parse_command_board_game_not_started(self, patched_game_board):
        test_name = 'Name'
        test_command = 'board'
        self._server._client_names[0] = test_name
        test_input = f'{test_name},{test_command}'

        self._server._parse_command(test_input, None)

        patched_game_board.assert_not_called()

    @unittest.mock.patch.object(GameBoard,
                                'game_board',
                                new_callable=unittest.mock.PropertyMock)
    def test_parse_command_board_game_started(self, patched_game_board):
        test_name = 'Name'
        test_command = 'board'
        self._server._client_names[0] = test_name
        self._server._game_started = True
        test_input = f'{test_name},{test_command}'

        self._server._parse_command(test_input, None)

        patched_game_board.assert_called_once()

    def test_parse_command_turn(self):
        test_name = 'Name'
        test_command = 'turn'
        self._server._client_names[0] = test_name
        self._server._game_started = True
        test_input = f'{test_name},{test_command}'

        output = self._server._parse_command(test_input, None)

        assert output == 'It is Names turn.'

    def test_parse_command_digit_not_active_player(self):
        test_name = 'Name'
        test_command = '1'
        self._server._client_names[1] = test_name
        self._server._game_started = False
        test_input = f'{test_name},{test_command}'

        output = self._server._parse_command(test_input, None)

        assert output == 'Please wait for your turn.'

    def test_parse_command_digit_game_not_started(self):
        test_name = 'Name'
        test_command = '1'
        self._server._client_names[0] = test_name
        self._server._game_started = False
        test_input = f'{test_name},{test_command}'

        output = self._server._parse_command(test_input, None)

        assert output == 'Game has not started.'

    def test_parse_command_digit_game_invalid_number(self):
        test_name = 'Name'
        test_command = '0'
        self._server._client_names[0] = test_name
        self._server._game_started = True
        test_input = f'{test_name},{test_command}'

        output = self._server._parse_command(test_input, None)

        assert output == "That's an invalid number. Try again."

    @unittest.mock.patch.object(GameServer, '_manage_piece_drop')
    def test_parse_command_digit_game_success(self, patched_manage_piece_drop):
        test_name = 'Name'
        test_command = '1'
        self._server._client_names[0] = test_name
        self._server._game_started = True
        test_input = f'{test_name},{test_command}'

        self._server._parse_command(test_input, None)

        patched_manage_piece_drop.assert_called_once()

    def test_parse_command_disconnect(self):
        test_command = 'disconnect'

        output = self._server._parse_command(test_command, None)

        assert output == 'Disconnecting...'

    @unittest.mock.patch.object(GameServer, '_name_new_client')
    def test_parse_command_name_success(self, patched_name_new_client):
        test_name = 'Name'

        self._server._parse_command(test_name, None)

        patched_name_new_client.assert_called_once()

    def test_parse_command_name_server_full(self):
        test_name = 'Name'
        self._server._connected_clients = 2

        output = self._server._parse_command(test_name, None)

        assert output == 'Server is full.'

    def test_parse_command_invalid(self):
        test_name = 'Name'
        test_command = 'invalid'
        self._server._client_names[0] = test_name
        test_input = f'{test_name},{test_command}'

        output = self._server._parse_command(test_input, None)

        assert output == 'Invalid command, try again.'

    def test_cannot_send_to_sock_false(self):
        sock_one = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock_two = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        expected_result = False
        actual_result = self._server._cannot_send_to_sock(sock_one, sock_two)

        assert expected_result == actual_result

    def test_cannot_send_to_sock_true(self):
        sock_one = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        expected_result = True
        actual_result = self._server._cannot_send_to_sock(sock_one, sock_one)

        assert expected_result == actual_result

    def test_change_active_player(self):
        expected_result = 1

        self._server._change_active_player()

        assert expected_result == self._server._active_player

    def test_start_game(self):
        expected_active_player = 0
        expected_game_started = True

        self._server._start_game()

        assert expected_active_player == self._server._active_player
        assert expected_game_started == self._server._game_started

    @unittest.mock.patch('queue.Queue.put')
    def test_send_loss(self, patched_put):
        sock_one = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock_two = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock_one)
        self._server._inputs.append(sock_two)
        self._server._message_queues[sock_one] = queue.Queue()
        self._server._message_queues[sock_two] = queue.Queue()

        self._server._send_loss(sock_one)

        patched_put.assert_called_once()

    @unittest.mock.patch('queue.Queue.put')
    def test_send_loss_no_clients_to_send_to(self, patched_put):
        sock_one = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock_one)
        self._server._message_queues[sock_one] = queue.Queue()

        self._server._send_loss(sock_one)

        patched_put.assert_not_called()

    @unittest.mock.patch('queue.Queue.put')
    def test_send_board_to_other_player(self, patched_put):
        sock_one = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock_two = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock_one)
        self._server._inputs.append(sock_two)
        self._server._message_queues[sock_one] = queue.Queue()
        self._server._message_queues[sock_two] = queue.Queue()

        self._server._send_board_to_other_player(sock_one)

        patched_put.assert_called_once()

    @unittest.mock.patch('queue.Queue.put')
    def test_send_board_to_other_player_no_other_player(self, patched_put):
        sock_one = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._server._inputs.append(sock_one)
        self._server._message_queues[sock_one] = queue.Queue()

        self._server._send_board_to_other_player(sock_one)

        patched_put.assert_not_called()
Пример #4
0

@app.route("/api/v1/game/quarto/<game_uuid>/join", methods=["POST"])
def join_game(game_uuid):
    player_name = _get_required_param('player_name')

    app.game_server.join_game(game_uuid, player_name)
    return jsonify({'message': 'ok'})


@app.route("/api/v1/game/quarto/<game_uuid>/pick", methods=["POST"])
def pick_piece(game_uuid):
    player_name = _get_required_param('player_name')
    number = _get_required_param('number', int)
    app.game_server.picking_move(game_uuid, player_name, number)
    return jsonify({'message': 'ok'})


@app.route("/api/v1/game/quarto/<game_uuid>/place", methods=["POST"])
def place_piece(game_uuid):
    player_name = _get_required_param('player_name')
    x = _get_required_param('x', int)
    y = _get_required_param('y', int)
    app.game_server.placement_move(game_uuid, player_name, x, y)
    return jsonify({'message': 'ok'})


if __name__ == "__main__":
    set_game_server(GameServer(configuration))
    app.run(debug=True)
Пример #5
0
    x = _get_required_param('x', int, data=json)
    y = _get_required_param('y', int, data=json)
    game_wrapper.place_piece(game_uuid, player_name, x, y)


@socketio.on('pick_piece')
def handle_pick_piece(json):
    game_uuid = _get_required_param('game_uuid', data=json)
    player_name = _get_required_param('player_name', data=json)
    number = _get_required_param('number', int, data=json)
    game_wrapper.pick_piece(game_uuid, player_name, number)


@socketio.on('join_lobby')
def handle_join_lobby(json):
    name = _get_required_param('name', data=json)


@socketio.on_error()
def error_handler(e):
    print('There was an error', str(e))


if __name__ == "__main__":
    game_server = GameServer(configuration)
    game_wrapper.set_game_server(game_server)
    game_wrapper.set_flask_app(app)
    game_wrapper.set_socket_io(socketio)

    socketio.run(app)
Пример #6
0
 def setUp(self):
     set_config('quarto_game_store', tempfile.mkdtemp())
     game_server = GameServer(configuration)
     set_game_server(game_server)
     self.app = app.test_client()
Пример #7
0
	def __init__(self, port=9617, timeout=None):
		GameServer.__init__(self, MyGame=Bingo, port=port, timeout=timeout)
Пример #8
0
class TestGameServer(unittest.TestCase):
    def setUp(self):
        set_config('quarto_game_store', tempfile.mkdtemp())
        self.game_server = GameServer(configuration)

    def test_create_game(self):
        game_uuid, game = self.game_server.create_game('paul')
        self.assertTrue(
            os.path.exists(
                os.path.join(
                    get_config('quarto_game_store'),
                    game_uuid
                )
            )
        )

    def test_get_game_does_not_exist(self):
        with self.assertRaises(GameNotFound):
            self.game_server.load_game('bob')

    def test_get_game_exists(self):
        game_uuid, game = self.game_server.create_game('paul')

        game2 = self.game_server.load_game(game_uuid)
        self.assertEqual(
            game.to_dict(),
            game2.to_dict()
        )

    def test_join_game(self):
        game_uuid, game = self.game_server.create_game('paul')

        game = self.game_server.join_game(game_uuid, 'sam')
        self.assertEqual(
            game.player_b.name, 'sam'
        )

    def test_join_game_full(self):
        game_uuid, game = self.game_server.create_game('paul')

        self.game_server.join_game(game_uuid, 'sam')
        with self.assertRaises(Exception):
            self.game_server.join_game(game_uuid, 'bob')

    def test_join_game_already_joined(self):
        game_uuid, game = self.game_server.create_game('paul')
        with self.assertRaises(Exception):
            self.game_server.join_game(game_uuid, 'paul')

    def test_pick_piece_ok(self):
        game_uuid, game = self.game_server.create_game('paul')
        self.game_server.join_game(game_uuid, 'sam')
        self.game_server.picking_move(
            game_uuid, 'paul', 1
        )

    def test_pick_piece_game_not_ready(self):
        game_uuid, game = self.game_server.create_game('paul')
        with self.assertRaises(Exception):
            self.game_server.picking_move(
                game_uuid, 'paul', 1
            )

    def test_pick_piece_wrong_player(self):
        game_uuid, game = self.game_server.create_game('paul')
        self.game_server.join_game(game_uuid, 'sam')
        with self.assertRaises(Exception):
            self.game_server.picking_move(
                game_uuid, 'sam', 1
            )
        with self.assertRaises(Exception):
            self.game_server.picking_move(
                game_uuid, 'bob', 1
            )

    def test_pick_piece_doesnt_exist(self):
        game_uuid, game = self.game_server.create_game('paul')
        self.game_server.join_game(game_uuid, 'sam')
        with self.assertRaises(Exception):
            self.game_server.picking_move(
                game_uuid, 'paul', 16
            )

    def test_pick_piece_already_picked(self):
        game_uuid, game = self.game_server.create_game('paul')
        self.game_server.join_game(game_uuid, 'sam')
        self.game_server.picking_move(
            game_uuid, 'paul', 15
        )
        self.game_server.placement_move(
            game_uuid, 'sam', 0, 0
        )
        with self.assertRaises(Exception):
            self.game_server.picking_move(
                game_uuid, 'sam', 15
            )
Пример #9
0
 def setUp(self):
     set_config('quarto_game_store', tempfile.mkdtemp())
     self.game_server = GameServer(configuration)
Пример #10
0
from server.game_server import GameServer

if __name__ == "__main__":
    server = GameServer()
    server.start()