/*******************************************************************************
* Copyright (c) 2015
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*******************************************************************************/
package jsettlers.network.common.packets;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import jsettlers.network.NetworkConstants;
import jsettlers.network.NetworkConstants.ENetworkMessage;
import jsettlers.network.TestUtils;
import jsettlers.network.client.task.TestTaskPacket;
import jsettlers.network.client.task.packets.SyncTasksPacket;
import jsettlers.network.client.task.packets.TaskPacket;
import jsettlers.network.infrastructure.channel.Channel;
import jsettlers.network.infrastructure.channel.GenericDeserializer;
import jsettlers.network.infrastructure.channel.IDeserializingable;
import jsettlers.network.infrastructure.channel.listeners.BufferingPacketListener;
import jsettlers.network.infrastructure.channel.packet.EmptyPacket;
import jsettlers.network.infrastructure.channel.packet.Packet;
import jsettlers.network.infrastructure.channel.ping.PingPacket;
import jsettlers.network.infrastructure.channel.reject.RejectPacket;
import jsettlers.network.server.packets.ServersideSyncTasksPacket;
import jsettlers.network.server.packets.ServersideTaskPacket;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* This class tests the serialization and deserialization of multiple subclasses of {@link Packet} when sent over a {@link Channel}.
*
* @author Andreas Eberle
*
*/
@RunWith(value = Parameterized.class)
public class PacketSerializationTest {
private Channel c1;
private Channel c2;
@Before
public void setUp() throws IOException {
Channel[] channels = TestUtils.setUpLoopbackChannels();
c1 = channels[0];
c2 = channels[1];
}
@After
public void tearDown() {
c1.close();
c2.close();
}
private Packet packet;
private BufferingPacketListener<? extends Packet> listener;
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] {
{ new EmptyPacket(), EmptyPacket.DEFAULT_DESERIALIZER },
{ new PlayerInfoPacket("IDBLA82348-#�l�34r", "NameBKUIH893428())/\"�/", true), d(PlayerInfoPacket.class) },
{ new MapInfoPacket("id<30u9Hjdi w3", "Nameo8/(�\"(/!=�", "authorId8unsdkjfn8932", "authorName uHh89023u9h", 6),
d(MapInfoPacket.class) },
{ createMatchInfoPacket(), d(MatchInfoPacket.class) },
{ new ArrayOfMatchInfosPacket(new MatchInfoPacket[0]), d(ArrayOfMatchInfosPacket.class) },
{ new ArrayOfMatchInfosPacket(new MatchInfoPacket[] { createMatchInfoPacket(), createMatchInfoPacket() }),
d(ArrayOfMatchInfosPacket.class) },
{ new OpenNewMatchPacket("dfjosj", (byte) 5, new MapInfoPacket("id", "name", "authorid", "authorName", 6), -3453434534329434535L),
d(OpenNewMatchPacket.class) },
{ new RejectPacket(NetworkConstants.ENetworkMessage.UNAUTHORIZED, NetworkConstants.ENetworkKey.IDENTIFY_USER), d(RejectPacket.class) },
{ new MatchStartPacket(createMatchInfoPacket(), 23424L), d(MatchStartPacket.class) },
{ new MatchInfoUpdatePacket(ENetworkMessage.NO_LISTENER_FOUND, new PlayerInfoPacket("IDBLA82348-#�l�34r",
"NameBKUIH893428())/\"�/", true), createMatchInfoPacket()), d(MatchInfoUpdatePacket.class) },
{ new TimeSyncPacket(23424), d(TimeSyncPacket.class) },
{ new ServersideTaskPacket("sdfsfsdf".getBytes()), d(ServersideTaskPacket.class) },
{ new ServersideSyncTasksPacket(23, Arrays.asList(new ServersideTaskPacket("dsfjsfj".getBytes()),
new ServersideTaskPacket("ehgdhd".getBytes()))), d(ServersideSyncTasksPacket.class) },
{ new TestTaskPacket("tesdfk��l9/&%/%&\"\\u8u23jo", 23424, (byte) -2), TaskPacket.DEFAULT_DESERIALIZER },
{ new SyncTasksPacket(234, Arrays.asList((TaskPacket) new TestTaskPacket("dsfdsdf", 23, (byte) -3),
(TaskPacket) new TestTaskPacket("dsfs��#��dsdf", 4345, (byte) 5))), d(SyncTasksPacket.class) },
{ new BooleanMessagePacket(true), d(BooleanMessagePacket.class) },
{ new ChatMessagePacket("authorId(, message)U)(Z", "message'**�##\"\\ppoisudf08u("), d(ChatMessagePacket.class) },
{ new PingPacket(2324L, -2349879879787987234L), d(PingPacket.class) },
{ new IdPacket("()Z(/�\\\"THKJNI+�02i3ej"), d(IdPacket.class) }
};
return Arrays.asList(data);
}
private static MatchInfoPacket createMatchInfoPacket() {
MapInfoPacket mapInfo = new MapInfoPacket("sdjfij", "sdfsdflksjdlfk", "sdflnnp0928u30894", "sdlkfkjl�:�_�", 5);
PlayerInfoPacket[] players = new PlayerInfoPacket[] {
new PlayerInfoPacket("1dddsfsfd", "787(/(hdsfjhk2", true),
new PlayerInfoPacket("2lkkjsdofij", "0sdfsddfsfgw32dsfjhk2", false)
};
return new MatchInfoPacket("id28948298fedkj", "KHDHifuh(&/%T", (byte) 3, mapInfo, players);
}
private static <T extends Packet> Object d(Class<T> classType) {
return new GenericDeserializer<T>(classType);
}
/**
* Constructor to accept the parameters of the test.
*
* @param packet
* The packet to be sent over the channel and to be compared with the resulting packet.
* @param deserializer
* The {@link IDeserializingable} used to deserialize the given packet.
*/
public <T extends Packet> PacketSerializationTest(T packet, IDeserializingable<T> deserializer) {
this.packet = packet;
this.listener = new BufferingPacketListener<T>(NetworkConstants.ENetworkKey.TEST_PACKET, deserializer);
}
@Test
public void testSerializationAndDeserialization() throws InterruptedException {
c2.registerListener(listener);
c1.sendPacket(NetworkConstants.ENetworkKey.TEST_PACKET, packet);
Thread.sleep(150);
List<? extends Packet> bufferedPackets = listener.popBufferedPackets();
assertEquals(1, bufferedPackets.size());
assertEquals(packet, bufferedPackets.get(0));
assertEquals(packet.hashCode(), bufferedPackets.get(0).hashCode());
}
}