Fix packet tests

This commit is contained in:
themode 2024-07-25 13:12:23 +02:00 committed by Matt Worzala
parent b5a53f8b6b
commit a561cd0a3e
6 changed files with 52 additions and 63 deletions

View File

@ -260,10 +260,10 @@ public final class PacketUtils {
writeFramedPacket(buffer, id, serializer, packet, compression ? MinecraftServer.getCompressionThreshold() : 0);
}
public static void writeFramedPacket(@NotNull ByteBuffer buffer,
public static <T> void writeFramedPacket(@NotNull ByteBuffer buffer,
int id,
@NotNull NetworkBuffer.Type<ServerPacket> type,
@NotNull ServerPacket packet,
@NotNull NetworkBuffer.Type<T> type,
@NotNull T packet,
int compressionThreshold) {
NetworkBuffer networkBuffer = new NetworkBuffer(buffer, false);
if (compressionThreshold <= 0) {

View File

@ -26,15 +26,12 @@ import net.minestom.server.recipe.RecipeCategory;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
/**
* Ensures that packet can be written and read correctly.
@ -160,32 +157,28 @@ public class PacketWriteReadTest {
}
@Test
public void serverTest() {
SERVER_PACKETS.forEach(PacketWriteReadTest::testPacket);
}
@Test
public void clientTest() {
CLIENT_PACKETS.forEach(PacketWriteReadTest::testPacket);
}
private static void testPacket(NetworkBuffer.Writer writeable) {
try {
byte[] bytes = NetworkBuffer.makeArray(buffer -> buffer.write(writeable));
var readerConstructor = writeable.getClass().getConstructor(NetworkBuffer.class);
NetworkBuffer reader = new NetworkBuffer();
reader.write(NetworkBuffer.RAW_BYTES, bytes);
var createdPacket = readerConstructor.newInstance(reader);
assertEquals(writeable, createdPacket);
} catch (NoSuchMethodException | InvocationTargetException | InstantiationException
| IllegalAccessException e) {
fail(writeable.toString(), e);
public void serverTest() throws NoSuchFieldException, IllegalAccessException {
for (var packet : SERVER_PACKETS) {
var packetClass = packet.getClass();
NetworkBuffer.Type<ServerPacket> serializer = (NetworkBuffer.Type<ServerPacket>) packetClass.getField("SERIALIZER").get(packetClass);
testPacket(serializer, packet);
}
}
private static byte[] generateByteArray(int size) {
byte[] array = new byte[size];
ThreadLocalRandom.current().nextBytes(array);
return array;
@Test
public void clientTest() throws NoSuchFieldException, IllegalAccessException {
for (var packet : CLIENT_PACKETS) {
var packetClass = packet.getClass();
NetworkBuffer.Type<ClientPacket> serializer = (NetworkBuffer.Type<ClientPacket>) packetClass.getField("SERIALIZER").get(packetClass);
testPacket(serializer, packet);
}
}
private static <T> void testPacket(NetworkBuffer.Type<T> networkType, T packet) {
byte[] bytes = NetworkBuffer.makeArray(buffer -> networkType.write(buffer, packet));
NetworkBuffer reader = new NetworkBuffer();
reader.write(NetworkBuffer.RAW_BYTES, bytes);
var createdPacket = networkType.read(reader);
assertEquals(packet, createdPacket);
}
}

View File

@ -24,7 +24,7 @@ public class SocketReadTest {
var packet = new ClientPluginMessagePacket("channel", new byte[2000]);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 0x0A, packet, compressed ? 256 : 0);
PacketUtils.writeFramedPacket(buffer, 0x0A, ClientPluginMessagePacket.SERIALIZER, packet, compressed ? 256 : 0);
var wrapper = BinaryBuffer.wrap(buffer);
wrapper.reset(0, buffer.position());
@ -37,7 +37,7 @@ public class SocketReadTest {
assertEquals(1, packets.size());
var rawPacket = packets.get(0);
assertEquals(0x0A, rawPacket.left());
var readPacket = new ClientPluginMessagePacket(new NetworkBuffer(rawPacket.right()));
var readPacket = ClientPluginMessagePacket.SERIALIZER.read(new NetworkBuffer(rawPacket.right()));
assertEquals("channel", readPacket.channel());
assertEquals(2000, readPacket.data().length);
}
@ -48,8 +48,8 @@ public class SocketReadTest {
var packet = new ClientPluginMessagePacket("channel", new byte[2000]);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 0x0A, packet, compressed ? 256 : 0);
PacketUtils.writeFramedPacket(buffer, 0x0A, packet, compressed ? 256 : 0);
PacketUtils.writeFramedPacket(buffer, 0x0A, ClientPluginMessagePacket.SERIALIZER, packet, compressed ? 256 : 0);
PacketUtils.writeFramedPacket(buffer, 0x0A, ClientPluginMessagePacket.SERIALIZER, packet, compressed ? 256 : 0);
var wrapper = BinaryBuffer.wrap(buffer);
wrapper.reset(0, buffer.position());
@ -62,7 +62,7 @@ public class SocketReadTest {
assertEquals(2, packets.size());
for (var rawPacket : packets) {
assertEquals(0x0A, rawPacket.left());
var readPacket = new ClientPluginMessagePacket(new NetworkBuffer(rawPacket.right()));
var readPacket = ClientPluginMessagePacket.SERIALIZER.read(new NetworkBuffer(rawPacket.right()));
assertEquals("channel", readPacket.channel());
assertEquals(2000, readPacket.data().length);
}
@ -76,7 +76,7 @@ public class SocketReadTest {
var packet = new ClientPluginMessagePacket("channel", new byte[2000]);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 0x0A, packet, compressed ? 256 : 0);
PacketUtils.writeFramedPacket(buffer, 0x0A, ClientPluginMessagePacket.SERIALIZER, packet, compressed ? 256 : 0);
Utils.writeVarInt(buffer, 200); // incomplete 200 bytes packet
var wrapper = BinaryBuffer.wrap(buffer);
@ -91,7 +91,7 @@ public class SocketReadTest {
assertEquals(1, packets.size());
var rawPacket = packets.get(0);
assertEquals(0x0A, rawPacket.left());
var readPacket = new ClientPluginMessagePacket(new NetworkBuffer(rawPacket.right()));
var readPacket = ClientPluginMessagePacket.SERIALIZER.read(new NetworkBuffer(rawPacket.right()));
assertEquals("channel", readPacket.channel());
assertEquals(2000, readPacket.data().length);
}
@ -104,7 +104,7 @@ public class SocketReadTest {
var packet = new ClientPluginMessagePacket("channel", new byte[2000]);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 0x0A, packet, compressed ? 256 : 0);
PacketUtils.writeFramedPacket(buffer, 0x0A, ClientPluginMessagePacket.SERIALIZER, packet, compressed ? 256 : 0);
buffer.put((byte) -85); // incomplete var-int length
var wrapper = BinaryBuffer.wrap(buffer);
@ -119,7 +119,7 @@ public class SocketReadTest {
assertEquals(1, packets.size());
var rawPacket = packets.get(0);
assertEquals(0x0A, rawPacket.left());
var readPacket = new ClientPluginMessagePacket(new NetworkBuffer(rawPacket.right()));
var readPacket = ClientPluginMessagePacket.SERIALIZER.read(new NetworkBuffer(rawPacket.right()));
assertEquals("channel", readPacket.channel());
assertEquals(2000, readPacket.data().length);
}

View File

@ -4,7 +4,6 @@ import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.utils.ObjectPool;
import net.minestom.server.utils.PacketUtils;
import net.minestom.server.utils.Utils;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
@ -17,19 +16,15 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals;
public class SocketWriteTest {
record IntPacket(int value) implements ServerPacket.Play {
@Override
public void write(@NotNull NetworkBuffer writer) {
writer.write(INT, value);
}
public static final NetworkBuffer.Type<IntPacket> SERIALIZER = NetworkBufferTemplate.template(
INT, IntPacket::value,
IntPacket::new);
}
record CompressiblePacket(String value) implements ServerPacket.Play {
@Override
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, value);
}
public static final NetworkBuffer.Type<CompressiblePacket> SERIALIZER = NetworkBufferTemplate.template(
STRING, CompressiblePacket::value,
CompressiblePacket::new);
}
@Test
@ -37,7 +32,7 @@ public class SocketWriteTest {
var packet = new IntPacket(5);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 1, packet, -1);
PacketUtils.writeFramedPacket(buffer, 1, IntPacket.SERIALIZER, packet, -1);
// 3 bytes length [var-int] + 1 byte packet id [var-int] + 4 bytes int
// The 3 bytes var-int length is hardcoded for performance purpose, could change in the future
@ -49,8 +44,8 @@ public class SocketWriteTest {
var packet = new IntPacket(5);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 1, packet, -1);
PacketUtils.writeFramedPacket(buffer, 1, packet, -1);
PacketUtils.writeFramedPacket(buffer, 1, IntPacket.SERIALIZER, packet, -1);
PacketUtils.writeFramedPacket(buffer, 1, IntPacket.SERIALIZER, packet, -1);
// 3 bytes length [var-int] + 1 byte packet id [var-int] + 4 bytes int
// The 3 bytes var-int length is hardcoded for performance purpose, could change in the future
@ -66,7 +61,7 @@ public class SocketWriteTest {
var packet = new CompressiblePacket(string);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 1, packet, 256);
PacketUtils.writeFramedPacket(buffer, 1, CompressiblePacket.SERIALIZER, packet, 256);
// 3 bytes packet length [var-int] + 3 bytes data length [var-int] + 1 byte packet id [var-int] + payload
// The 3 bytes var-int length is hardcoded for performance purpose, could change in the future
@ -78,7 +73,7 @@ public class SocketWriteTest {
var packet = new IntPacket(5);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 1, packet, 256);
PacketUtils.writeFramedPacket(buffer, 1, IntPacket.SERIALIZER, packet, 256);
// 3 bytes packet length [var-int] + 3 bytes data length [var-int] + 1 byte packet id [var-int] + 4 bytes int
// The 3 bytes var-int length is hardcoded for performance purpose, could change in the future
@ -90,8 +85,8 @@ public class SocketWriteTest {
var packet = new IntPacket(5);
var buffer = ObjectPool.PACKET_POOL.get();
PacketUtils.writeFramedPacket(buffer, 1, packet, 256);
PacketUtils.writeFramedPacket(buffer, 1, packet, 256);
PacketUtils.writeFramedPacket(buffer, 1, IntPacket.SERIALIZER, packet, 256);
PacketUtils.writeFramedPacket(buffer, 1, IntPacket.SERIALIZER, packet, 256);
// 3 bytes packet length [var-int] + 3 bytes data length [var-int] + 1 byte packet id [var-int] + 4 bytes int
// The 3 bytes var-int length is hardcoded for performance purpose, could change in the future

View File

@ -25,6 +25,7 @@ public class DeclareRecipesPacketTest {
)
));
assertThrows(IllegalArgumentException.class, () -> NetworkBuffer.makeArray(packet::write));
assertThrows(IllegalArgumentException.class, () -> NetworkBuffer.makeArray(networkBuffer ->
DeclareRecipesPacket.SERIALIZER.write(networkBuffer, packet)));
}
}

View File

@ -13,34 +13,34 @@ public class ParticleDataTest {
public void testDustParticleDefault() {
Particle particle = Particle.DUST;
ParticlePacket packet = new ParticlePacket(particle, true, 0, 0, 0, 0, 0, 0, 0, 0);
assertDoesNotThrow(() -> packet.write(new NetworkBuffer()));
assertDoesNotThrow(() -> ParticlePacket.SERIALIZER.write(new NetworkBuffer(), packet));
}
@Test
public void testDustParticleInvalid() {
var particle = Particle.DUST.withProperties(null, 1);
ParticlePacket packet = new ParticlePacket(particle, true, 0, 0, 0, 0, 0, 0, 0, 0);
assertThrows(NullPointerException.class, () -> packet.write(new NetworkBuffer()));
assertThrows(NullPointerException.class, () -> ParticlePacket.SERIALIZER.write(new NetworkBuffer(), packet));
}
@Test
public void testParticleValid() {
var particle = Particle.ENTITY_EFFECT;
ParticlePacket packet = new ParticlePacket(particle, true, 0, 0, 0, 0, 0, 0, 0, 0);
assertDoesNotThrow(() -> packet.write(new NetworkBuffer()));
assertDoesNotThrow(() -> ParticlePacket.SERIALIZER.write(new NetworkBuffer(), packet));
}
@Test
public void testParticleData() {
var particle = Particle.ENTITY_EFFECT;
ParticlePacket packet = new ParticlePacket(particle, true, 0, 0, 0, 0, 0, 0, 0, 0);
assertDoesNotThrow(() -> packet.write(new NetworkBuffer()));
assertDoesNotThrow(() -> ParticlePacket.SERIALIZER.write(new NetworkBuffer(), packet));
}
@Test
public void invalidBlock() {
var particle = Particle.BLOCK.withBlock(null);
ParticlePacket packet = new ParticlePacket(particle, true, 0, 0, 0, 0, 0, 0, 0, 0);
assertThrows(NullPointerException.class, () -> packet.write(new NetworkBuffer()));
assertThrows(NullPointerException.class, () -> ParticlePacket.SERIALIZER.write(new NetworkBuffer(), packet));
}
}