package com.limegroup.gnutella.messages.vendor; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import org.limewire.io.GUID; import org.limewire.util.BaseTestCase; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.limegroup.gnutella.LimeTestUtils; import com.limegroup.gnutella.NetworkManager; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.messages.MessageFactory; import com.limegroup.gnutella.messages.Message.Network; import com.limegroup.gnutella.stubs.NetworkManagerStub; public class ReplyNumberVendorMessageTest extends BaseTestCase { private ReplyNumberVendorMessageFactory replyNumberVendorMessageFactory; private MessageFactory messageFactory; private NetworkManagerStub networkManagerStub; public ReplyNumberVendorMessageTest(String name) { super(name); } @Override protected void setUp() throws Exception { networkManagerStub = new NetworkManagerStub(); Injector injector = LimeTestUtils.createInjector(new AbstractModule() { @Override protected void configure() { bind(NetworkManager.class).toInstance(networkManagerStub); } }); replyNumberVendorMessageFactory = injector.getInstance(ReplyNumberVendorMessageFactory.class); messageFactory = injector.getInstance(MessageFactory.class); } public void testNumResults() { ReplyNumberVendorMessage msg = replyNumberVendorMessageFactory.createV3ReplyNumberVendorMessage(new GUID(), 10); assertEquals(10, msg.getNumResults()); for (int illegalResultNum : new int[] { 256, 0, -1 }) { try { msg = replyNumberVendorMessageFactory.createV3ReplyNumberVendorMessage(new GUID(), illegalResultNum); fail("Expected illegal argument exception for result: " + illegalResultNum); } catch (IllegalArgumentException iae) { } } } public void testVersion3AllowsLargerMessagesFromNetwork() throws BadPacketException { replyNumberVendorMessageFactory.createFromNetwork(GUID.makeGuid(), (byte)1, (byte)1, 3, new byte[11], Network.UNKNOWN); try { replyNumberVendorMessageFactory.createFromNetwork(GUID.makeGuid(), (byte)1, (byte)1, 2, new byte[11], Network.UNKNOWN); fail("BadPacketException expected, message too large"); } catch (BadPacketException e) { } } public void testOldVersionIsNotAcceptedFromNetwork() { try { replyNumberVendorMessageFactory.createFromNetwork(GUID.makeGuid(), (byte)0x01, (byte)0x01, 1, new byte[2], Network.UNKNOWN); fail("Old message versions should not be accpeted"); } catch (BadPacketException bpe) { } } public void testReplyNumber() throws Exception { try { GUID g = new GUID(GUID.makeGuid()); replyNumberVendorMessageFactory.createV3ReplyNumberVendorMessage(g, 0); assertTrue(false); } catch(IllegalArgumentException expected) {} try { GUID g = new GUID(GUID.makeGuid()); replyNumberVendorMessageFactory.createV3ReplyNumberVendorMessage(g, 256); assertTrue(false); } catch(IllegalArgumentException expected) {} for (int i = 1; i < 256; i++) { GUID guid = new GUID(GUID.makeGuid()); ReplyNumberVendorMessage vm = replyNumberVendorMessageFactory.createV3ReplyNumberVendorMessage(guid, i); 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()); ReplyNumberVendorMessage vmRead = (ReplyNumberVendorMessage) 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; ReplyNumberVendorMessage vm = null; // first test that it needs a payload of at least size 1 payload = new byte[0]; try { vm = replyNumberVendorMessageFactory.createFromNetwork(GUID.makeGuid(), (byte) 1, (byte) 0, 0, payload, Network.UNKNOWN); assertTrue(false); } catch (BadPacketException expected) {}; // first test that version 1 needs a payload of only size 1 payload = new byte[2]; try { vm = replyNumberVendorMessageFactory.createFromNetwork(GUID.makeGuid(), (byte) 1, (byte) 0, 1, payload, Network.UNKNOWN); assertTrue(false); } catch (BadPacketException expected) {}; //test that it can handle versions other than 1 payload = new byte[3]; try { vm = replyNumberVendorMessageFactory.createFromNetwork(GUID.makeGuid(), (byte) 1, (byte) 0, 3, payload, Network.UNKNOWN); assertEquals("Simple accessor is broken!", vm.getNumResults(), 0); } catch (BadPacketException expected) { assertTrue(false); } //test un/solicited byte networkManagerStub.setCanReceiveUnsolicited(false); vm = replyNumberVendorMessageFactory.createV3ReplyNumberVendorMessage(new GUID(GUID.makeGuid()),5); assertFalse(vm.canReceiveUnsolicited()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); vm.write(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ReplyNumberVendorMessage vm2 = (ReplyNumberVendorMessage) messageFactory.read(bais, Network.TCP); assertFalse(vm2.canReceiveUnsolicited()); networkManagerStub.setCanReceiveUnsolicited(true); vm = replyNumberVendorMessageFactory.createV3ReplyNumberVendorMessage(new GUID(GUID.makeGuid()),5); assertTrue(vm.canReceiveUnsolicited()); baos = new ByteArrayOutputStream(); vm.write(baos); bais = new ByteArrayInputStream(baos.toByteArray()); vm2 = (ReplyNumberVendorMessage) messageFactory.read(bais, Network.TCP); assertTrue(vm2.canReceiveUnsolicited()); } }