public void PayloadLengthPart7bitsWitMaskTest()
        {
            var builder = new WebSocketFrameBuilder(ProxyConfig.MaxByteArrayLength);
            var data    = new byte[]
            {
                0b10000010, // FIN, Binary
                0b11111101, // Mask, 125bytes
                0b10101010, // Mask key
                0b10101010, // Mask key
                0b10101010, // Mask key
                0b10101010, // Mask key
            };

            builder.TryAddData(data, 0, data.Length, out var readSize, out _).IsFalse();
            readSize.Is(data.Length);

            var payload = Enumerable.Repeat((byte)'a', 125).ToArray();

            builder.TryAddData(payload, 0, payload.Length, out readSize, out var frame).IsTrue();
            readSize.Is(payload.Length);

            frame.Fin.IsTrue();
            frame.Opcode.Is(WebSocketOpcode.Binary);
            frame.Mask.IsTrue();
            frame.MaskKey.Is(new byte[] { 0b10101010, 0b10101010, 0b10101010, 0b10101010 });
        public void DecompressTest()
        {
            var source = "hogefugapiyo";

            byte[] destBytes;
            using (var stream = new MemoryStream())
            {
                using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true))
                {
                    var sourceBytes = Encoding.UTF8.GetBytes(source);
                    deflate.Write(sourceBytes, 0, sourceBytes.Length);
                }
                destBytes = stream.ToArray();
            }

            var builder = new WebSocketFrameBuilder(ProxyConfig.MaxByteArrayLength);
            var data    = new byte[]
            {
                0b11000010,
                0b00001110,
            };

            builder.TryAddData(data, 0, data.Length, out var readSize, out _).IsFalse();
            readSize.Is(data.Length);

            builder.TryAddData(destBytes, 0, destBytes.Length, out readSize, out var frame).IsTrue();
            readSize.Is(destBytes.Length);

            var ex      = new PerMessageDeflateExtension();
            var message = ex.Decompress(new WebSocketMessage(null, frame));

            Encoding.UTF8.GetString(message.PayloadData).Is(source);
        }
        public void BuildMessageTest()
        {
            var frameBuilder = new WebSocketFrameBuilder(ProxyConfig.MaxByteArrayLength);

            var data1 = new byte[]
            {
                0b00000010, // notFIN, Binary
                0b00000001, // noMask, 1bytes
                0b11111111, // Payload
            };

            frameBuilder.TryAddData(data1, 0, data1.Length, out var readSize1, out var frame1).IsTrue();
            readSize1.Is(data1.Length);

            var data2 = new byte[]
            {
                0b00000000, // notFIN, Continuation
                0b00000001, // noMask, 1bytes
                0b00000000, // Payload
            };

            frameBuilder.TryAddData(data2, 0, data2.Length, out var readSize2, out var frame2).IsTrue();
            readSize2.Is(data2.Length);

            var data3 = new byte[]
            {
                0b10000000, // FIN, Continuation
                0b00000001, // noMask, 1bytes
                0b01010101, // Payload
            };

            frameBuilder.TryAddData(data3, 0, data3.Length, out var readSize3, out var frame3).IsTrue();
            readSize3.Is(data3.Length);

            var builder = new WebSocketMessageBuilder(null, ProxyConfig.MaxByteArrayLength);

            builder.TryCreateOrAdd(frame1, out _).IsFalse();
            builder.TryCreateOrAdd(frame2, out _).IsFalse();
            builder.TryCreateOrAdd(frame3, out var message).IsTrue();

            message.HandshakeSession.IsNull();
            message.Opcode.Is(WebSocketOpcode.Binary);
            message.PayloadData[0].Is(0b11111111);
            message.PayloadData[1].Is(0b00000000);
            message.PayloadData[2].Is(0b01010101);
        }
        public void PayloadLengthPart7bitsWithoutMaskTest()
        {
            var builder = new WebSocketFrameBuilder(ProxyConfig.MaxByteArrayLength);
            var data    = new byte[]
            {
                0b10000010,  // FIN, Binary
                0b00000000,  // noMask, 0bytes
            };

            builder.TryAddData(data, 0, data.Length, out var readSize, out var frame).IsTrue();
            readSize.Is(data.Length);

            frame.Fin.IsTrue();
            frame.Opcode.Is(WebSocketOpcode.Binary);
            frame.Mask.IsFalse();
            frame.PayloadLength.Is(0);
            frame.PayloadData.Length.Is(0);
        }