Пример #1
0
        public async Task EolCrCrCrLf()
        {
            {
                var(bb, eol) = await MakeBucket("\r\n").ReadUntilEolAsync(BucketEol.AnyEol, 1);

                Assert.AreEqual(1, bb.Length);
                Assert.AreEqual(BucketEol.CRSplit, eol);
            }

            var r     = MakeBucket("a", "t", "\r\r\r\ndo");
            var total = "";
            var state = new BucketEolState();

            while (true)
            {
                var(bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString(eol) + $"[{eol}]";
            }
            Assert.AreEqual("|at[CR]|[CR]|[CRLF]|do[None]",
                            total.Replace("\r", "/r/"));
        }
Пример #2
0
        public async Task EolVariantsFull(BucketEol acceptableEols)
        {
            var opts = new[] { "\r", "\n", "\r\n", "\0", " " };

            foreach (var c1 in opts)
            {
                foreach (var c2 in opts)
                {
                    foreach (var c3 in opts)
                    {
                        foreach (var c4 in opts)
                        {
                            string tst = $"st{c1}{c2}{c3}{c4}do";

                            for (int n1 = 1; n1 < tst.Length - 2; n1++)
                            {
                                for (int n2 = n1 + 1; n2 < tst.Length - 1; n2++)
                                {
                                    using var r = MakeBucket(tst.Substring(0, n1), tst.Substring(n1, n2 - n1), tst.Substring(n2));
                                    var state    = new BucketEolState();
                                    var total    = "";
                                    var expected = Escape(tst.Insert(n2, "|").Insert(n1, "|"));
                                    while (true)
                                    {
                                        var(bb, eol) = await r.ReadUntilEolFullAsync(acceptableEols, state);

                                        if (bb.IsEof)
                                        {
                                            break;
                                        }

                                        var s = bb.ToASCIIString();
                                        total += s;

                                        if (s.Length > 2 && 0 != (acceptableEols & BucketEol.LF) && s.LastIndexOf('\n', s.Length - 2) >= 0)
                                        {
                                            Assert.Fail($"Unexpected LF in test {expected}, result={Escape(total)}");
                                        }
                                        if (s.Length > 2 && 0 != (acceptableEols & BucketEol.Zero) && s.LastIndexOf('\0', s.Length - 2) >= 0)
                                        {
                                            Assert.Fail($"Unexpected Zero in test {expected}, part={Escape(s)}");
                                        }
                                        if (s.Length > 3 && 0 != (acceptableEols & BucketEol.CR) && s.LastIndexOf('\r', s.Length - 3) >= 0)
                                        {
                                            Assert.Fail($"Unexpected CR in test {expected}, part={Escape(s)}");
                                        }
                                    }

                                    Assert.AreEqual(expected, Escape(total.Insert(n2, "|").Insert(n1, "|")));
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #3
0
        public async Task EolCrCrCrCr()
        {
            var r     = MakeBucket("\r\r\r\rdo");
            var total = "";
            var state = new BucketEolState();

            while (true)
            {
                var(bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.CR, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString(eol) + $"[{eol}]";
            }
            Assert.AreEqual("|[CR]|[CR]|[CR]|[CR]|do[None]",
                            total.Replace("\r", "/r/"));
        }
Пример #4
0
        public async Task ReadEolsFull()
        {
            var(bb, eol) = await MakeBucket("abc\nabc").ReadUntilEolFullAsync(BucketEol.LF, new BucketEolState());

            Assert.AreEqual(4, bb.Length);
            Assert.AreEqual("abc\n", bb.ToASCIIString());
            Assert.AreEqual("abc", bb.ToASCIIString(eol));
            Assert.AreEqual(BucketEol.LF, eol);

            (bb, eol) = await MakeBucket("abc\0abc").ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState());

            Assert.AreEqual(4, bb.Length);
            Assert.AreEqual("abc", bb.ToASCIIString(eol));
            Assert.AreEqual(BucketEol.Zero, eol);

            var b = MakeBucket("a", "b", "c", "\0a", "bc", "d\0a", "b", "c", "\0", "a");

            (bb, eol) = await b.ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState());

            Assert.AreEqual(4, bb.Length);
            Assert.AreEqual("abc", bb.ToASCIIString(eol));
            Assert.AreEqual(BucketEol.Zero, eol);

            (bb, eol) = await b.ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState());

            Assert.AreEqual(5, bb.Length);
            Assert.AreEqual("abcd", bb.ToASCIIString(eol));
            Assert.AreEqual(BucketEol.Zero, eol);

            (bb, eol) = await b.ReadUntilEolFullAsync(BucketEol.Zero, new BucketEolState());

            Assert.AreEqual(4, bb.Length);
            Assert.AreEqual("abc", bb.ToASCIIString(eol));
            Assert.AreEqual(BucketEol.Zero, eol);

            var r     = MakeBucket("a", "b", "c", "\0");
            var total = "";
            var state = new BucketEolState();

            while (true)
            {
                (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.Zero, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString();

                if (eol != BucketEol.None)
                {
                    total += "!";
                }
            }

            Assert.AreEqual("abc\0", total.Replace("|", "").Replace("!", ""));
            Assert.AreEqual("|abc\0!", total);

            r = MakeBucket("a\r\nb\rcd\r", "\nefg\rhi\r\n", "j\r", "\rk");

            total = "";
            state = new BucketEolState();
            while (true)
            {
                (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString(eol) + $"[{eol}]";
            }
            Assert.AreEqual("|a[CRLF]|b[CR]|cd[CRLF]|efg[CR]|hi[CRLF]|j[CR]|[CR]|k[None]",
                            total.Replace("\r", "/r/"));

            r     = MakeBucket("a\r");
            total = "";
            state = new BucketEolState();
            while (true)
            {
                (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString(eol) + $"[{eol}]";
            }

            Assert.AreEqual("|a[CR]",
                            total.Replace("\r", "/r/"));


            r = MakeBucket("H", "T", "T", "P", "/", "1", ".", "1", "\r", "\n", "a");

            total = "";
            state = new BucketEolState();
            while (true)
            {
                (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString(eol) + $"[{eol}]";
            }

            Assert.AreEqual("|HTTP/1.1[CRLF]|a[None]",
                            total.Replace("\r", "/r/"));


            r = MakeBucket("H", "T", "T", "P", "/", "1", ".", "1", "\r", "\n\n\r", "\0a\r", "\r\nc", "\r", "\r\n", "qq\r", "q\r", "\r", "\n");

            total = "";
            state = new BucketEolState();
            while (true)
            {
                (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString(eol) + $"[{eol}]";
            }

            Assert.AreEqual("|HTTP/1.1[CRLF]|[LF]|[CR]|\0a[CR]|[CRLF]|c[CR]|[CRLF]|qq[CR]|q[CR]|[CRLF]",
                            total.Replace("\r", "/r/"));


            r = MakeBucket("H", "T", "T", "P", "/", "1", ".", "1", "\r", "\n\n\r", "\0a\r", "\r\nc", "\r", "\r\n", "qq\r", "q\r", "\r\0\r", "\0");

            total = "";
            state = new BucketEolState();
            while (true)
            {
                (bb, eol) = await r.ReadUntilEolFullAsync(BucketEol.AnyEol | BucketEol.Zero, state);

                if (bb.IsEof)
                {
                    break;
                }

                total += "|" + bb.ToASCIIString(eol) + $"[{eol}]";
            }
            Assert.AreEqual("|HTTP/1.1[CRLF]|[LF]|[CR]|[Zero]|a[CR]|[CRLF]|c[CR]|[CRLF]|qq[CR]|q[CR]|[CR]|[Zero]|[CR]|[Zero]",
                            total.Replace("\r", "/r/"));
        }