public void TestBodyOnly() { ObjectPool<byte[]> pool = new ObjectPool<byte[]>(() => { return new byte[1024]; }); Random rand = new Random(this.GetHashCode() ^ DateTime.Now.Millisecond); uint streamId = (uint)rand.Next(0, (int)(Math.Pow(2, 24) - 1)); byte[] bodyBuffer = new byte[rand.Next(1024, 1024*64)]; rand.NextBytes(bodyBuffer); ChunkedBuffer body = new ChunkedBuffer(pool); body.OfferRaw(bodyBuffer, 0, bodyBuffer.Length); GdsFrame frame = GdsFrame.NewContentFrame(streamId, null, false, body, true); Assert.AreEqual(true, frame.IsComplete); Assert.AreEqual(GdsFrame.GdsFrameType.BodyOnly, frame.Type); Assert.AreEqual(streamId, frame.StreamId); Assert.AreEqual(0, frame.Headers.Count); MemoryStream stream = new MemoryStream(); frame.Write(stream); Assert.AreEqual( 4 // frame definition + 4 // body definition + bodyBuffer.Length , stream.Position); stream.Position = 0; GdsFrame readFrame = GdsFrame.ParseFrame(stream, pool); Assert.AreEqual(true, readFrame.IsComplete); Assert.AreEqual(GdsFrame.GdsFrameType.BodyOnly, readFrame.Type); Assert.AreEqual(streamId, readFrame.StreamId); Assert.AreEqual(0, readFrame.Headers.Count); byte[] readBodyBuffer = new byte[readFrame.Body.AvailableBytesToRead]; readFrame.Body.Read(readBodyBuffer, 0, readBodyBuffer.Length); AssertEquals(bodyBuffer, readBodyBuffer); frame.Dispose(); readFrame.Dispose(); }
public void TestChunks() { ObjectPool<byte[]> pool = new ObjectPool<byte[]>(() => { return new byte[1024]; }); DummySockNetChannel channel = new DummySockNetChannel() { State = null, IsActive = true, BufferPool = pool }; channel.Pipe = new SockNetChannelPipe(channel); GdsSockNetChannelModule module = new GdsSockNetChannelModule(true); channel.AddModule(module); channel.Connect(); uint streamId = 1; ChunkedBuffer body = new ChunkedBuffer(pool); body.OfferRaw(Encoding.UTF8.GetBytes("This "), 0, Encoding.UTF8.GetByteCount("This ")); GdsFrame chunk1 = GdsFrame.NewContentFrame(streamId, new Dictionary<string, byte[]>() { { "test1", new byte[] { 1 } } , { "test", new byte[] { 1 } } , }, false, body, false); ChunkedBuffer buffer = ToBuffer(chunk1); object receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is ChunkedBuffer); body = new ChunkedBuffer(pool); body.OfferRaw(Encoding.UTF8.GetBytes("is "), 0, Encoding.UTF8.GetByteCount("is ")); GdsFrame chunk2 = GdsFrame.NewContentFrame(streamId, new Dictionary<string, byte[]>() { { "test2", new byte[] { 2 } } , { "test", new byte[] { 2 } } , }, false, body, false); buffer = ToBuffer(chunk2); receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is ChunkedBuffer); body = new ChunkedBuffer(pool); body.OfferRaw(Encoding.UTF8.GetBytes("awesome!"), 0, Encoding.UTF8.GetByteCount("awesome!")); GdsFrame chunk3 = GdsFrame.NewContentFrame(streamId, new Dictionary<string, byte[]>() { { "test3", new byte[] { 3 } } , { "test", new byte[] { 3 } } , }, false, body, true); buffer = ToBuffer(chunk3); receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is GdsFrame); Assert.AreEqual("This is awesome!", ((GdsFrame)receiveResponse).Body.ToString(Encoding.UTF8)); Assert.AreEqual(1, ((GdsFrame)receiveResponse).Headers["test1"][0]); Assert.AreEqual(2, ((GdsFrame)receiveResponse).Headers["test2"][0]); Assert.AreEqual(3, ((GdsFrame)receiveResponse).Headers["test3"][0]); Assert.AreEqual(3, ((GdsFrame)receiveResponse).Headers["test"][0]); body.Dispose(); chunk1.Dispose(); chunk2.Dispose(); chunk3.Dispose(); Console.WriteLine("Pool stats: " + pool.ObjectsInPool + "/" + pool.TotalNumberOfObjects); }
public void TestSimpleSslContent() { ObjectPool<byte[]> pool = new ObjectPool<byte[]>(() => { return new byte[1024]; }); GdsEchoServer server = new GdsEchoServer(pool); try { server.Start(true); BlockingCollection<object> blockingCollection = new BlockingCollection<object>(); ClientSockNetChannel client = (ClientSockNetChannel)SockNetClient.Create(server.Endpoint, ClientSockNetChannel.DefaultNoDelay, ClientSockNetChannel.DefaultTtl, pool) .AddModule(new GdsSockNetChannelModule(true)); client.ConnectWithTLS((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return true; }) .WaitForValue(TimeSpan.FromSeconds(5)); object currentObject; client.Pipe.AddIncomingLast<GdsFrame>((ISockNetChannel sockNetClient, ref GdsFrame data) => { blockingCollection.Add(data); }); ChunkedBuffer body = new ChunkedBuffer(pool); body.OfferRaw(Encoding.UTF8.GetBytes("some test"), 0, Encoding.UTF8.GetByteCount("some test")); client.Send(GdsFrame.NewContentFrame(1, null, false, body, true)); Assert.IsTrue(blockingCollection.TryTake(out currentObject, 5000)); Assert.IsTrue(currentObject is GdsFrame); Assert.AreEqual("some test", ((GdsFrame)currentObject).Body.ToString(Encoding.UTF8)); Console.WriteLine("Got response: \n" + ((GdsFrame)currentObject).Body); client.Disconnect().WaitForValue(TimeSpan.FromSeconds(5)); } finally { server.Stop(); } }
public void TestFullCompressed() { ObjectPool<byte[]> pool = new ObjectPool<byte[]>(() => { return new byte[1024]; }); Random rand = new Random(this.GetHashCode() ^ DateTime.Now.Millisecond); uint streamId = (uint)rand.Next(0, (int)(Math.Pow(2, 24) - 1)); string header1Key = "the first key"; byte[] header1Value = new byte[rand.Next(32, 1024 * 64)]; rand.NextBytes(header1Value); string header2Key = "the second key"; byte[] header2Value = new byte[rand.Next(32, 1024 * 64)]; rand.NextBytes(header2Value); byte[] bodyBuffer = new byte[rand.Next(1024, 1024 * 64)]; rand.NextBytes(bodyBuffer); ChunkedBuffer body = new ChunkedBuffer(pool); body.OfferRaw(bodyBuffer, 0, bodyBuffer.Length); GdsFrame frame = GdsFrame.NewContentFrame(streamId, new Dictionary<string, byte[]>() { { header1Key, header1Value }, { header2Key, header2Value } }, true, body, true); Assert.AreEqual(true, frame.IsComplete); Assert.AreEqual(GdsFrame.GdsFrameType.Full, frame.Type); Assert.AreEqual(streamId, frame.StreamId); Assert.AreEqual(2, frame.Headers.Count); MemoryStream stream = new MemoryStream(); frame.Write(stream); stream.Position = 0; GdsFrame readFrame = GdsFrame.ParseFrame(stream, pool); Assert.AreEqual(true, readFrame.IsComplete); Assert.AreEqual(GdsFrame.GdsFrameType.Full, readFrame.Type); Assert.AreEqual(streamId, readFrame.StreamId); Assert.AreEqual(2, readFrame.Headers.Count); byte[] readBodyBuffer = new byte[readFrame.Body.AvailableBytesToRead]; readFrame.Body.Read(readBodyBuffer, 0, readBodyBuffer.Length); AssertEquals(bodyBuffer, readBodyBuffer); frame.Dispose(); readFrame.Dispose(); }