package com.limegroup.gnutella.messages.vendor; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.net.InetAddress; import org.limewire.io.GUID; import org.limewire.security.AddressSecurityToken; import org.limewire.security.MACCalculatorRepositoryManager; import org.limewire.security.SecurityToken; import org.limewire.util.BaseTestCase; import com.google.inject.Injector; import com.limegroup.gnutella.LimeTestUtils; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.messages.MessageFactory; import com.limegroup.gnutella.messages.Message.Network; public class LimeACKVendorMessageTest extends BaseTestCase { private SecurityToken token; private MessageFactory messageFactory; public LimeACKVendorMessageTest(String name) { super(name); } @Override protected void setUp() throws Exception { Injector injector = LimeTestUtils.createInjector(); messageFactory = injector.getInstance(MessageFactory.class); token = new AddressSecurityToken(InetAddress.getLocalHost(), 5904, injector.getInstance(MACCalculatorRepositoryManager.class)); } public void testSecurityTokenBytesAreSet() { LimeACKVendorMessage msg = new LimeACKVendorMessage(new GUID(), 10, token); assertEquals(token.getBytes(), msg.getSecurityToken().getBytes()); } public void testSecurityTokenBytesFromNetWork() throws BadPacketException { LimeACKVendorMessage in = new LimeACKVendorMessage(new GUID(), 10, token); LimeACKVendorMessage msg = new LimeACKVendorMessage(GUID.makeGuid(), (byte)1, (byte)1, 3, in.getPayload(), Network.UNKNOWN); assertEquals(token.getBytes(), msg.getSecurityToken().getBytes()); assertEquals(10, msg.getNumResults()); } public void testResultNum() { LimeACKVendorMessage msg = new LimeACKVendorMessage(new GUID(), 10, token); assertEquals(10, msg.getNumResults()); for (int illegalNum : new int[] { 256, 0, -1 }) { try { msg = new LimeACKVendorMessage(new GUID(), illegalNum, token); fail("Expected IllegalArgumentException for " + illegalNum); } catch (IllegalArgumentException iae) { } } } public void testInvalidPayloadLengths() { for (int i = 0; i < 7; i++) { try { new LimeACKVendorMessage(GUID.makeGuid(), (byte)1, (byte)1, 3, new byte[i], Network.UNKNOWN); fail("payload is too short but no exception thrown"); } catch (BadPacketException e) { } } } public void testLimeACK() throws Exception { try { GUID g = new GUID(GUID.makeGuid()); new LimeACKVendorMessage(g, -1, token); assertTrue(false); } catch(IllegalArgumentException expected) {} try { GUID g = new GUID(GUID.makeGuid()); new LimeACKVendorMessage(g, 256, token); assertTrue(false); } catch(IllegalArgumentException expected) {} for (int i = 1; i < 256; i++) { GUID guid = new GUID(GUID.makeGuid()); LimeACKVendorMessage vm = new LimeACKVendorMessage(guid, i, token); assertEquals("Simple accessor is broken!", vm.getNumResults(), i); assertEquals("guids aren't equal!", guid, new GUID(vm.getGUID())); ByteArrayOutputStream baos = new ByteArrayOutputStream(); vm.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); LimeACKVendorMessage vmRead = (LimeACKVendorMessage) messageFactory.read(bais, Network.TCP); assertEquals(vm, vmRead); assertEquals("Read accessor is broken!", vmRead.getNumResults(), i); assertEquals("after Read guids aren't equal!", guid, new GUID(vmRead.getGUID())); } // test that the VM can be backwards compatible.... byte[] payload = null; LimeACKVendorMessage vm = null; // first test that it needs a payload of at least size 1 payload = new byte[0]; try { vm = new LimeACKVendorMessage(GUID.makeGuid(), (byte) 1, (byte) 0, 0, payload, Network.UNKNOWN); assertTrue(false); } catch (BadPacketException expected) {}; // first test that it rejects all versions of 1 payload = new byte[1]; try { vm = new LimeACKVendorMessage(GUID.makeGuid(), (byte) 1, (byte) 0, 1, payload, Network.UNKNOWN); assertTrue(false); } catch (BadPacketException expected) {}; // first test that version 2 needs a payload of only size 1 payload = new byte[2]; try { vm = new LimeACKVendorMessage(GUID.makeGuid(), (byte) 1, (byte) 0, 2, payload, Network.UNKNOWN); assertTrue(false); } catch (BadPacketException expected) {}; // test that it can handle versions other than 1 payload = new byte[7]; try { vm = new LimeACKVendorMessage(GUID.makeGuid(), (byte) 1, (byte) 0, 3, payload, Network.UNKNOWN); assertEquals("Simple accessor is broken!", vm.getNumResults(), 0); } catch (BadPacketException expected) { assertTrue(false); } } }