Update tests to match new API.

This commit is contained in:
joo 2016-06-17 22:54:21 +01:00
parent c8b3e7a809
commit 3ff7662684
7 changed files with 85 additions and 62 deletions

View File

@ -1,7 +1,6 @@
from __future__ import print_function
from collections import deque
from collections import namedtuple
from threading import Lock
from zlib import decompress
from itertools import *

View File

@ -401,6 +401,10 @@ class PlayerListItemPacket(Packet):
self.uuid = UUID.read(file_object)
self._read(file_object)
def _read(self, file_object):
raise NotImplementedError(
'This abstract method must be overridden in a subclass.')
@classmethod
def type_from_id(cls, action_id):
subcls = {

View File

@ -84,7 +84,10 @@ class VarInt(Type):
def read(file_object):
number = 0
for i in range(5):
byte = ord(file_object.read(1))
byte = file_object.read(1)
if len(byte) < 1:
raise RuntimeError("Unexpected end of message.")
byte = ord(byte)
number |= (byte & 0x7F) << 7 * i
if not byte & 0x80:
break

View File

@ -3,6 +3,9 @@ import unittest
import string
from zlib import decompress
from random import choice
from minecraft import SUPPORTED_PROTOCOL_VERSIONS
from minecraft.networking.connection import ConnectionContext
from minecraft.networking.types import VarInt
from minecraft.networking.packets import (
PacketBuffer, ChatPacket, KeepAlivePacket, PacketListener)
@ -11,68 +14,79 @@ from minecraft.networking.packets import (
class PacketSerializatonTest(unittest.TestCase):
def test_packet(self):
packet = ChatPacket()
packet.message = u"κόσμε"
for protocol_version in SUPPORTED_PROTOCOL_VERSIONS:
context = ConnectionContext(protocol_version=protocol_version)
packet_buffer = PacketBuffer()
packet.write(packet_buffer)
packet_buffer.reset_cursor()
# Read the length and packet id
VarInt.read(packet_buffer)
packet_id = VarInt.read(packet_buffer)
self.assertEqual(packet_id, packet.id)
deserialized = ChatPacket()
deserialized.read(packet_buffer)
self.assertEqual(packet.message, deserialized.message)
packet = ChatPacket(context)
packet.message = u"κόσμε"
packet_buffer = PacketBuffer()
packet.write(packet_buffer)
packet_buffer.reset_cursor()
# Read the length and packet id
VarInt.read(packet_buffer)
packet_id = VarInt.read(packet_buffer)
self.assertEqual(packet_id, packet.id)
deserialized = ChatPacket(context)
deserialized.read(packet_buffer)
self.assertEqual(packet.message, deserialized.message)
def test_compressed_packet(self):
msg = ''.join(choice(string.ascii_lowercase) for i in range(500))
packet = ChatPacket()
packet.message = msg
for protocol_version in SUPPORTED_PROTOCOL_VERSIONS:
context = ConnectionContext(protocol_version=protocol_version)
self.write_read_packet(packet, 20)
self.write_read_packet(packet, -1)
msg = ''.join(choice(string.ascii_lowercase) for i in range(500))
packet = ChatPacket(context)
packet.message = msg
self.write_read_packet(packet, 20)
self.write_read_packet(packet, -1)
def write_read_packet(self, packet, compression_threshold):
for protocol_version in SUPPORTED_PROTOCOL_VERSIONS:
context = ConnectionContext(protocol_version=protocol_version)
packet_buffer = PacketBuffer()
packet.write(packet_buffer, compression_threshold)
packet_buffer.reset_cursor()
VarInt.read(packet_buffer)
compressed_size = VarInt.read(packet_buffer)
if compressed_size > 0:
decompressed = decompress(packet_buffer.read(compressed_size))
packet_buffer.reset()
packet_buffer.send(decompressed)
packet_buffer = PacketBuffer()
packet.write(packet_buffer, compression_threshold)
packet_buffer.reset_cursor()
packet_id = VarInt.read(packet_buffer)
self.assertEqual(packet_id, packet.id)
deserialized = ChatPacket()
deserialized.read(packet_buffer)
self.assertEqual(packet.message, deserialized.message)
VarInt.read(packet_buffer)
compressed_size = VarInt.read(packet_buffer)
if compressed_size > 0:
decompressed = decompress(packet_buffer.read(compressed_size))
packet_buffer.reset()
packet_buffer.send(decompressed)
packet_buffer.reset_cursor()
packet_id = VarInt.read(packet_buffer)
self.assertEqual(packet_id, packet.id)
deserialized = ChatPacket(context)
deserialized.read(packet_buffer)
self.assertEqual(packet.message, deserialized.message)
class PacketListenerTest(unittest.TestCase):
def test_listener(self):
message = "hello world"
def test_packet(chat_packet):
self.assertEqual(chat_packet.message, message)
listener = PacketListener(test_packet, ChatPacket)
for protocol_version in SUPPORTED_PROTOCOL_VERSIONS:
context = ConnectionContext(protocol_version=protocol_version)
packet = ChatPacket().set_values(message=message)
uncalled_packet = KeepAlivePacket().set_values(keep_alive_id=0)
listener.call_packet(packet)
listener.call_packet(uncalled_packet)
listener = PacketListener(test_packet, ChatPacket)
packet = ChatPacket().set_values(message=message)
uncalled_packet = KeepAlivePacket().set_values(keep_alive_id=0)
listener.call_packet(packet)
listener.call_packet(uncalled_packet)

View File

@ -53,8 +53,8 @@ class SerializationTest(unittest.TestCase):
base_type.send(None, None)
empty_socket = PacketBuffer()
with self.assertRaises(RuntimeError):
VarInt.read_socket(empty_socket)
with self.assertRaises(Exception):
VarInt.read(empty_socket)
def test_varint(self):
self.assertEqual(VarInt.size(2), 1)
@ -64,4 +64,4 @@ class SerializationTest(unittest.TestCase):
VarInt.send(50000, packet_buffer)
packet_buffer.reset_cursor()
self.assertEqual(VarInt.read_socket(packet_buffer), 50000)
self.assertEqual(VarInt.read(packet_buffer), 50000)

View File

@ -9,7 +9,9 @@ class VersionTest(unittest.TestCase):
SV(minecraft.__version__)
def test_minecraft_version_is_a_valid_pep_386_strict_version(self):
SV(minecraft.MINECRAFT_VERSION)
for version in minecraft.SUPPORTED_MINECRAFT_VERSIONS.keys():
SV(version)
def test_protocol_version_is_an_int(self):
self.assertTrue(type(minecraft.PROTOCOL_VERSION) is int)
for version in minecraft.SUPPORTED_PROTOCOL_VERSIONS:
self.assertTrue(type(version) is int)

17
tox.ini
View File

@ -4,7 +4,7 @@
# and then run "tox" from this directory.
[tox]
envlist = py27, py33, py34, pypy, cover, flake8, pylint-errors, pylint-full, verify-manifest
envlist = py27, py33, py34, py35, pypy, cover, flake8, pylint-errors, pylint-full, verify-manifest
[testenv]
commands = nosetests
@ -13,6 +13,7 @@ deps =
nose
requests
cryptography
future
[testenv:py27]
deps =
@ -25,7 +26,7 @@ deps =
mock
[testenv:cover]
basepython = python3.4
basepython = python3.5
commands =
nosetests --with-xunit --with-xcoverage --cover-package=minecraft --nocapture --cover-erase --cover-inclusive --cover-tests --cover-branches --cover-min-percentage=60
deps =
@ -43,7 +44,7 @@ deps =
coveralls
[testenv:flake8]
basepython = python3.4
basepython = python3.5
commands =
flake8 minecraft tests setup.py start.py bin/generate_travis_yml.py
deps =
@ -51,14 +52,14 @@ deps =
flake8
[testenv:pylint-errors]
basepython = python3.4
basepython = python3.5
deps =
{[testenv]deps}
pylint
commands = pylint minecraft -E
[testenv:pylint-full]
basepython = python3.4
basepython = python3.5
deps =
{[testenv]deps}
pylint
@ -66,7 +67,7 @@ commands =
- pylint minecraft --disable=E
[testenv:docs]
basepython = python3.4
basepython = python3.5
deps =
{[testenv:cover]deps}
sphinx
@ -75,9 +76,9 @@ commands =
{toxinidir}/bin/build_docs
[testenv:verify-manifest]
basepython = python3.4
basepython = python3.5
deps =
check-manifest
commands =
check-manifest