diff --git a/game/src/main/org/apollo/game/message/handler/ItemOnObjectVerificationHandler.java b/game/src/main/org/apollo/game/message/handler/ItemOnObjectVerificationHandler.java index 9d17cc08..89a9260c 100644 --- a/game/src/main/org/apollo/game/message/handler/ItemOnObjectVerificationHandler.java +++ b/game/src/main/org/apollo/game/message/handler/ItemOnObjectVerificationHandler.java @@ -1,13 +1,20 @@ package org.apollo.game.message.handler; +import org.apollo.cache.def.ObjectDefinition; import org.apollo.game.message.impl.ItemOnObjectMessage; import org.apollo.game.model.Item; +import org.apollo.game.model.Position; import org.apollo.game.model.World; +import org.apollo.game.model.area.Region; +import org.apollo.game.model.entity.EntityType; import org.apollo.game.model.entity.Player; +import org.apollo.game.model.entity.obj.GameObject; import org.apollo.game.model.inter.bank.BankConstants; import org.apollo.game.model.inv.Inventory; import org.apollo.game.model.inv.SynchronizationInventoryListener; +import java.util.Set; + /** * A {@link MessageHandler} that verifies {@link ItemOnObjectMessage}s. * @@ -44,6 +51,21 @@ public final class ItemOnObjectVerificationHandler extends MessageHandler= ObjectDefinition.count()) { + message.terminate(); + return; + } + + Position position = message.getPosition(); + Region region = world.getRegionRepository().fromPosition(position); + Set objects = region.getEntities(position, EntityType.STATIC_OBJECT, EntityType.DYNAMIC_OBJECT); + + if (!player.getPosition().isWithinDistance(position, 15) || !ObjectActionVerificationHandler.containsObject(objectId, objects)) { + message.terminate(); + return; + } } } \ No newline at end of file diff --git a/game/src/main/org/apollo/game/message/handler/ObjectActionVerificationHandler.java b/game/src/main/org/apollo/game/message/handler/ObjectActionVerificationHandler.java index 862f59a9..8983cee0 100644 --- a/game/src/main/org/apollo/game/message/handler/ObjectActionVerificationHandler.java +++ b/game/src/main/org/apollo/game/message/handler/ObjectActionVerificationHandler.java @@ -26,7 +26,7 @@ public final class ObjectActionVerificationHandler extends MessageHandler objects) { + public static boolean containsObject(int id, Set objects) { return objects.stream().anyMatch(object -> object.getId() == id); } diff --git a/game/src/test/org/apollo/game/message/handler/ChatMessageHandlerTest.java b/game/src/test/org/apollo/game/message/handler/ChatMessageHandlerTest.java new file mode 100644 index 00000000..2cb25f47 --- /dev/null +++ b/game/src/test/org/apollo/game/message/handler/ChatMessageHandlerTest.java @@ -0,0 +1,34 @@ +package org.apollo.game.message.handler; + +import org.apollo.game.message.impl.ChatMessage; +import org.apollo.game.model.World; +import org.apollo.game.model.entity.Player; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.junit.Assert.*; +import static org.powermock.api.mockito.PowerMockito.*; + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({Player.class}) +public class ChatMessageHandlerTest { + + private final World world = new World(); + private final ChatMessageHandler chatMessageHandler = new ChatMessageHandler(world); + + @Test + public void testTerminatedIfMuted() throws Exception { + Player player = PowerMockito.mock(Player.class); + + when(player.isMuted()).thenReturn(true); + + ChatMessage chatMessage = new ChatMessage("Test", "Test".getBytes(), 0, 0); + chatMessageHandler.handle(player, chatMessage); + + assertTrue("ChatMessageHandler: player can send messages when muted", chatMessage.terminated()); + } +} \ No newline at end of file diff --git a/game/src/test/org/apollo/game/message/handler/ItemOnItemVerificationHandlerTest.java b/game/src/test/org/apollo/game/message/handler/ItemOnItemVerificationHandlerTest.java new file mode 100644 index 00000000..34d03c35 --- /dev/null +++ b/game/src/test/org/apollo/game/message/handler/ItemOnItemVerificationHandlerTest.java @@ -0,0 +1,49 @@ +package org.apollo.game.message.handler; + +import org.apollo.cache.def.ItemDefinition; +import org.apollo.game.message.impl.ItemOnItemMessage; +import org.apollo.game.model.Item; +import org.apollo.game.model.World; +import org.apollo.game.model.entity.Player; +import org.apollo.game.model.inter.bank.BankConstants; +import org.apollo.game.model.inv.Inventory; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.junit.Assert.*; +import static org.powermock.api.mockito.PowerMockito.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({Player.class, ItemDefinition.class}) +public class ItemOnItemVerificationHandlerTest { + + private World world = new World(); + + private ItemOnItemVerificationHandler itemOnItemVerificationHandler = new ItemOnItemVerificationHandler(world); + + @Before + public void setupTestItemDefinitions() { + mockStatic(ItemDefinition.class); + when(ItemDefinition.lookup(4151)).thenReturn(new ItemDefinition(4151)); + } + + @Test + public void testTerminateWithNoTargetItem() throws Exception { + Player player = mock(Player.class); + Inventory inventory = new Inventory(28); + inventory.set(1, new Item(4151, 1)); + + when(player.getInventory()).thenReturn(inventory); + + ItemOnItemMessage itemOnItemMessage = new ItemOnItemMessage(BankConstants.SIDEBAR_INVENTORY_ID, 4151, 1, + BankConstants.SIDEBAR_INVENTORY_ID, 4152, 2); + + itemOnItemVerificationHandler.handle(player, itemOnItemMessage); + + assertTrue("ItemOnItemVerificationHandler: failed terminating message with invalid target item", itemOnItemMessage.terminated()); + } +} \ No newline at end of file diff --git a/game/src/test/org/apollo/game/message/handler/ItemOnObjectVerificationHandlerTest.java b/game/src/test/org/apollo/game/message/handler/ItemOnObjectVerificationHandlerTest.java new file mode 100644 index 00000000..0f391776 --- /dev/null +++ b/game/src/test/org/apollo/game/message/handler/ItemOnObjectVerificationHandlerTest.java @@ -0,0 +1,135 @@ +package org.apollo.game.message.handler; + +import org.apollo.cache.def.ItemDefinition; +import org.apollo.cache.def.ObjectDefinition; +import org.apollo.game.message.impl.ItemOnObjectMessage; +import org.apollo.game.model.Item; +import org.apollo.game.model.Position; +import org.apollo.game.model.World; +import org.apollo.game.model.area.Region; +import org.apollo.game.model.area.RegionRepository; +import org.apollo.game.model.entity.Entity; +import org.apollo.game.model.entity.EntityType; +import org.apollo.game.model.entity.Player; +import org.apollo.game.model.entity.obj.StaticGameObject; +import org.apollo.game.model.inter.bank.BankConstants; +import org.apollo.game.model.inv.Inventory; +import org.apollo.game.model.inv.SynchronizationInventoryListener; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.assertTrue; +import static org.powermock.api.mockito.PowerMockito.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({Player.class, World.class, Region.class, RegionRepository.class, ObjectDefinition.class, + ItemDefinition.class}) +public class ItemOnObjectVerificationHandlerTest { + + @Before + public void setupTestItemDefinitions() { + mockStatic(ItemDefinition.class); + when(ItemDefinition.lookup(4151)).thenReturn(new ItemDefinition(4151)); + + mockStatic(ObjectDefinition.class); + when(ObjectDefinition.count()).thenReturn(2); + } + + + @Test + public void testTerminateIfInvalidItem() throws Exception { + Position playerPosition = new Position(3200, 3200); + Position objectPosition = new Position(3200, 3216); + + World world = mock(World.class); + Region region = mock(Region.class); + RegionRepository regionRepository = mock(RegionRepository.class); + Player player = mock(Player.class); + + Set entitySet = new HashSet<>(); + entitySet.add(new StaticGameObject(world, 4151, objectPosition, 0, 0)); + Inventory inventory = new Inventory(28); + + when(player.getInventory()).thenReturn(inventory); + when(world.getRegionRepository()).thenReturn(regionRepository); + when(regionRepository.fromPosition(objectPosition)).thenReturn(region); + when(player.getPosition()).thenReturn(playerPosition); + when(region.getEntities(objectPosition, EntityType.STATIC_OBJECT, EntityType.DYNAMIC_OBJECT)) + .thenReturn(entitySet); + + ItemOnObjectMessage itemOnObjectMessage = new ItemOnObjectMessage(SynchronizationInventoryListener.INVENTORY_ID, 4151, 1, + 1, objectPosition.getX(), objectPosition.getY()); + ItemOnObjectVerificationHandler itemOnObjectVerificationHandler = new ItemOnObjectVerificationHandler(world); + + itemOnObjectVerificationHandler.handle(player, itemOnObjectMessage); + + assertTrue("ObjectVerificationHandler: message not terminated valid item given!", itemOnObjectMessage.terminated()); + } + + @Test + public void testTerminateIfInvalidSlot() throws Exception { + Position playerPosition = new Position(3200, 3200); + Position objectPosition = new Position(3200, 3200); + + World world = mock(World.class); + Region region = mock(Region.class); + RegionRepository regionRepository = mock(RegionRepository.class); + Player player = mock(Player.class); + + Set entitySet = new HashSet<>(); + entitySet.add(new StaticGameObject(world, 4151, objectPosition, 0, 0)); + Inventory inventory = new Inventory(28); + + when(player.getInventory()).thenReturn(inventory); + when(world.getRegionRepository()).thenReturn(regionRepository); + when(regionRepository.fromPosition(objectPosition)).thenReturn(region); + when(player.getPosition()).thenReturn(playerPosition); + when(region.getEntities(objectPosition, EntityType.STATIC_OBJECT, EntityType.DYNAMIC_OBJECT)) + .thenReturn(entitySet); + + ItemOnObjectMessage itemOnObjectMessage = new ItemOnObjectMessage(SynchronizationInventoryListener.INVENTORY_ID, 4151, 30, + 1, objectPosition.getX(), objectPosition.getY()); + ItemOnObjectVerificationHandler itemOnObjectVerificationHandler = new ItemOnObjectVerificationHandler(world); + + itemOnObjectVerificationHandler.handle(player, itemOnObjectMessage); + + assertTrue("ObjectVerificationHandler: message not terminated when no valid slot given!", itemOnObjectMessage.terminated()); + } + + @Test + public void testTerminateIfObjectOutOfRange() throws Exception { + Position playerPosition = new Position(3200, 3200); + Position objectPosition = new Position(3200, 3200); + + World world = mock(World.class); + Region region = mock(Region.class); + RegionRepository regionRepository = mock(RegionRepository.class); + Player player = mock(Player.class); + + Set entitySet = new HashSet<>(); + entitySet.add(new StaticGameObject(world, 4151, objectPosition, 0, 0)); + Inventory inventory = new Inventory(28); + inventory.set(1, new Item(4151, 1)); + + when(player.getInventory()).thenReturn(inventory); + when(world.getRegionRepository()).thenReturn(regionRepository); + when(regionRepository.fromPosition(objectPosition)).thenReturn(region); + when(player.getPosition()).thenReturn(playerPosition); + when(region.getEntities(objectPosition, EntityType.STATIC_OBJECT, EntityType.DYNAMIC_OBJECT)) + .thenReturn(entitySet); + + ItemOnObjectMessage itemOnObjectMessage = new ItemOnObjectMessage(SynchronizationInventoryListener.INVENTORY_ID, 4151, 1, + 1, objectPosition.getX(), objectPosition.getY()); + ItemOnObjectVerificationHandler itemOnObjectVerificationHandler = new ItemOnObjectVerificationHandler(world); + + itemOnObjectVerificationHandler.handle(player, itemOnObjectMessage); + + assertTrue("ObjectVerificationHandler: message not terminated when object out of range!", itemOnObjectMessage.terminated()); + } +} \ No newline at end of file diff --git a/game/src/test/org/apollo/game/message/handler/ObjectActionVerificationHandlerTest.java b/game/src/test/org/apollo/game/message/handler/ObjectActionVerificationHandlerTest.java new file mode 100644 index 00000000..40cf72db --- /dev/null +++ b/game/src/test/org/apollo/game/message/handler/ObjectActionVerificationHandlerTest.java @@ -0,0 +1,92 @@ +package org.apollo.game.message.handler; + +import org.apollo.cache.def.ItemDefinition; +import org.apollo.cache.def.ObjectDefinition; +import org.apollo.game.message.impl.ObjectActionMessage; +import org.apollo.game.model.Position; +import org.apollo.game.model.World; +import org.apollo.game.model.area.Region; +import org.apollo.game.model.area.RegionRepository; +import org.apollo.game.model.entity.Entity; +import org.apollo.game.model.entity.EntityType; +import org.apollo.game.model.entity.Player; +import org.apollo.game.model.entity.obj.StaticGameObject; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.*; +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.when; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({World.class, Player.class, ObjectDefinition.class, RegionRepository.class, Region.class}) +public class ObjectActionVerificationHandlerTest { + + @Before + public void setupTestObjectDefinitions() { + mockStatic(ObjectDefinition.class); + when(ObjectDefinition.count()).thenReturn(4152); + } + + @Test + public void testTerminateIfOutOfRange() throws Exception { + Position playerPosition = new Position(3200, 3200); + Position objectPosition = new Position(3200, 3216); + + World world = mock(World.class); + Region region = mock(Region.class); + RegionRepository regionRepository = mock(RegionRepository.class); + Player player = mock(Player.class); + + Set entitySet = new HashSet<>(); + entitySet.add(new StaticGameObject(world, 4151, objectPosition, 0, 0)); + + when(world.getRegionRepository()).thenReturn(regionRepository); + when(regionRepository.fromPosition(objectPosition)).thenReturn(region); + when(player.getPosition()).thenReturn(playerPosition); + when(region.getEntities(objectPosition, EntityType.STATIC_OBJECT, EntityType.DYNAMIC_OBJECT)) + .thenReturn(entitySet); + + ObjectActionMessage objectActionMessage = new ObjectActionMessage(1, 4151, objectPosition); + ObjectActionVerificationHandler objectActionVerificationHandler = new ObjectActionVerificationHandler(world); + + objectActionVerificationHandler.handle(player, objectActionMessage); + + assertTrue("ObjectVerificationHandler: message not terminated when out of range!", objectActionMessage.terminated()); + } + + @Test + + public void testTerminateIfNoObject() throws Exception { + Position playerPosition = new Position(3200, 3200); + Position objectPosition = new Position(3200, 3201); + + World world = mock(World.class); + Region region = mock(Region.class); + RegionRepository regionRepository = mock(RegionRepository.class); + Player player = mock(Player.class); + + Set entitySet = new HashSet<>(); + + when(world.getRegionRepository()).thenReturn(regionRepository); + when(regionRepository.fromPosition(objectPosition)).thenReturn(region); + when(player.getPosition()).thenReturn(playerPosition); + when(region.getEntities(objectPosition, EntityType.STATIC_OBJECT, EntityType.DYNAMIC_OBJECT)) + .thenReturn(entitySet); + + ObjectActionMessage objectActionMessage = new ObjectActionMessage(1, 4151, objectPosition); + ObjectActionVerificationHandler objectActionVerificationHandler = new ObjectActionVerificationHandler(world); + + objectActionVerificationHandler.handle(player, objectActionMessage); + + assertTrue("ObjectVerificationHandler: message not terminated when no object exists!", objectActionMessage.terminated()); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 29a33b97..905cd3c5 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,21 @@ junit junit 4.12 + test + + + + org.powermock + powermock-module-junit4 + 1.6.2 + test + + + + org.powermock + powermock-api-mockito + 1.6.2 + test