public void testUncompressed() { OutputCollector collect = new OutputCollector(); OutStream @out = new OutStream("test", 100, null, collect); PositionCollector[] positions = new PositionCollector[1024]; for (int i = 0; i < 1024; ++i) { positions[i] = new PositionCollector(); @out.getPosition(positions[i]); @out.WriteByte((byte)i); } @out.Flush(); Assert.Equal(1024, collect.buffer.size()); for (int i = 0; i < 1024; ++i) { Assert.Equal((byte)i, collect.buffer.get(i)); } ByteBuffer inBuf = ByteBuffer.allocate(collect.buffer.size()); collect.buffer.setByteBuffer(inBuf, 0, collect.buffer.size()); inBuf.flip(); #pragma warning disable 612 InStream @in = InStream.create(null, "test", new ByteBuffer[] { inBuf }, new long[] { 0 }, inBuf.remaining(), null, 100); #pragma warning restore 612 Assert.Equal("uncompressed stream test position: 0 length: 1024" + " range: 0 offset: 0 limit: 0", @in.ToString()); for (int i = 0; i < 1024; ++i) { int x = @in.ReadByte(); Assert.Equal(i & 0xff, x); } for (int i = 1023; i >= 0; --i) { @in.seek(positions[i]); Assert.Equal(i & 0xff, @in.ReadByte()); } }
public void testCorruptStream() { OutputCollector collect = new OutputCollector(); CompressionCodec codec = new ZlibCodec(); OutStream @out = new OutStream("test", 500, codec, collect); PositionCollector[] positions = new PositionCollector[1024]; for (int i = 0; i < 1024; ++i) { positions[i] = new PositionCollector(); @out.getPosition(positions[i]); @out.WriteByte((byte)i); } @out.Flush(); // now try to read the stream with a buffer that is too small ByteBuffer inBuf = ByteBuffer.allocate(collect.buffer.size()); collect.buffer.setByteBuffer(inBuf, 0, collect.buffer.size()); inBuf.flip(); InStream @in = InStream.create(null, "test", new ByteBuffer[] { inBuf }, new long[] { 0 }, inBuf.remaining(), codec, 100); byte[] contents = new byte[1024]; try { @in.Read(contents, 0, contents.Length); fail(); } catch (IllegalArgumentException iae) { // EXPECTED } // make a corrupted header inBuf.clear(); inBuf.put((byte)32); inBuf.put((byte)0); inBuf.flip(); @in = InStream.create(null, "test2", new ByteBuffer[] { inBuf }, new long[] { 0 }, inBuf.remaining(), codec, 300); try { @in.ReadByte(); fail(); } catch (InvalidOperationException ise) { // EXPECTED } }
public void testCompressed() { OutputCollector collect = new OutputCollector(); CompressionCodec codec = new ZlibCodec(); OutStream @out = new OutStream("test", 300, codec, collect); PositionCollector[] positions = new PositionCollector[1024]; for (int i = 0; i < 1024; ++i) { positions[i] = new PositionCollector(); @out.getPosition(positions[i]); @out.WriteByte((byte)i); } @out.Flush(); Assert.Equal("test", @out.ToString()); Assert.Equal(961, collect.buffer.size()); ByteBuffer inBuf = ByteBuffer.allocate(collect.buffer.size()); collect.buffer.setByteBuffer(inBuf, 0, collect.buffer.size()); inBuf.flip(); InStream @in = InStream.create(null, "test", new ByteBuffer[] { inBuf }, new long[] { 0 }, inBuf.remaining(), codec, 300); Assert.Equal("compressed stream test position: 0 length: 961 range: 0" + " offset: 0 limit: 0 range 0 = 0 to 961", @in.ToString()); for (int i = 0; i < 1024; ++i) { int x = @in.ReadByte(); Assert.Equal(i & 0xff, x); } Assert.Equal(0, @in.available()); for (int i = 1023; i >= 0; --i) { @in.seek(positions[i]); Assert.Equal(i & 0xff, @in.ReadByte()); } }
/// <summary> /// Reads a packet from a stream with the given size in bytes or returns null if the packet cannot be parsed. /// </summary> public static Packet Read(InStream Stream, int Size) { Packet packet = new Packet(); // Read flags and header if ((Size -= StreamSize.Byte + StreamSize.Int) < 0) return null; PacketFlags flags = (PacketFlags)Stream.ReadByte(); packet.SequenceNumber = Stream.ReadInt(); packet.PingRequest = (flags & PacketFlags.PingRequest) == PacketFlags.PingRequest; packet.PingResponse = (flags & PacketFlags.PingResponse) == PacketFlags.PingResponse; // Read additional information if ((flags & PacketFlags.Acknowledgement) == PacketFlags.Acknowledgement) { if ((Size -= StreamSize.Int) < 0) return null; packet.AcknowledgementNumber = Stream.ReadInt(); } if ((flags & PacketFlags.RoundTripTime) == PacketFlags.RoundTripTime) { if ((Size -= StreamSize.Double) < 0) return null; packet.RoundTripTime = Stream.ReadDouble(); } // Read chunk if any if ((flags & PacketFlags.Chunk) == PacketFlags.Chunk) { packet.ChunkInitial = (flags & PacketFlags.ChunkInitial) == PacketFlags.ChunkInitial; packet.ChunkFinal = (flags & PacketFlags.ChunkFinal) == PacketFlags.ChunkFinal; byte[] data = new byte[Size]; Stream.Read(data, 0, data.Length); packet.ChunkData = data; return packet; } else { // A packet can only be a disconnect if it does not have a chunk packet.Disconnect = (flags & PacketFlags.Disconnect) == PacketFlags.Disconnect; // Make sure this is the end of the packet if (Size == 0) return packet; else return null; } }
/// <summary> /// Reads a message from a stream. /// </summary> public static Message Read(InStream Stream) { MessageType type = MessageType.ForID(Stream.ReadByte()); return type.Read(Stream); }