diff --git a/src/main/java/net/minestom/server/utils/PacketUtils.java b/src/main/java/net/minestom/server/utils/PacketUtils.java index 7e8ddcf89..8aaec93a7 100644 --- a/src/main/java/net/minestom/server/utils/PacketUtils.java +++ b/src/main/java/net/minestom/server/utils/PacketUtils.java @@ -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 void writeFramedPacket(@NotNull ByteBuffer buffer, int id, - @NotNull NetworkBuffer.Type type, - @NotNull ServerPacket packet, + @NotNull NetworkBuffer.Type type, + @NotNull T packet, int compressionThreshold) { NetworkBuffer networkBuffer = new NetworkBuffer(buffer, false); if (compressionThreshold <= 0) { diff --git a/src/test/java/net/minestom/server/network/PacketWriteReadTest.java b/src/test/java/net/minestom/server/network/PacketWriteReadTest.java index 8d6db2e23..86bb04e57 100644 --- a/src/test/java/net/minestom/server/network/PacketWriteReadTest.java +++ b/src/test/java/net/minestom/server/network/PacketWriteReadTest.java @@ -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 serializer = (NetworkBuffer.Type) 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 serializer = (NetworkBuffer.Type) packetClass.getField("SERIALIZER").get(packetClass); + testPacket(serializer, packet); + } + } + + private static void testPacket(NetworkBuffer.Type 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); } } diff --git a/src/test/java/net/minestom/server/network/SocketReadTest.java b/src/test/java/net/minestom/server/network/SocketReadTest.java index 4c8db0970..d2e607061 100644 --- a/src/test/java/net/minestom/server/network/SocketReadTest.java +++ b/src/test/java/net/minestom/server/network/SocketReadTest.java @@ -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); } diff --git a/src/test/java/net/minestom/server/network/SocketWriteTest.java b/src/test/java/net/minestom/server/network/SocketWriteTest.java index 3e8e01dc1..d1450cb01 100644 --- a/src/test/java/net/minestom/server/network/SocketWriteTest.java +++ b/src/test/java/net/minestom/server/network/SocketWriteTest.java @@ -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 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 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 diff --git a/src/test/java/net/minestom/server/network/packet/DeclareRecipesPacketTest.java b/src/test/java/net/minestom/server/network/packet/DeclareRecipesPacketTest.java index 9e5df2c3d..dd5c72fec 100644 --- a/src/test/java/net/minestom/server/network/packet/DeclareRecipesPacketTest.java +++ b/src/test/java/net/minestom/server/network/packet/DeclareRecipesPacketTest.java @@ -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))); } } diff --git a/src/test/java/net/minestom/server/particle/ParticleDataTest.java b/src/test/java/net/minestom/server/particle/ParticleDataTest.java index 43ef509f3..f7aa234f7 100644 --- a/src/test/java/net/minestom/server/particle/ParticleDataTest.java +++ b/src/test/java/net/minestom/server/particle/ParticleDataTest.java @@ -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)); } }