Пример #1
0
 private int ReadFromNullRemovalStream(byte[] input, byte[] buffer, StringBuilder sb, bool addMark)
 {
     using (var memoryStream = new MemoryStream(input))
         using (var nullRemovalStream = new NullRemovalStream(memoryStream, addMark))
         {
             var readCount = nullRemovalStream.Read(buffer, 0, 4096);
             var total     = readCount;
             while (readCount != 0)
             {
                 sb.Append(Encoding.ASCII.GetString(buffer, 0, readCount));
                 readCount = nullRemovalStream.Read(buffer, 0, 4096);
                 total    += readCount;
             }
             return(total);
         }
 }
Пример #2
0
        public void TestInputWithRandomNullBytes(bool addMark, int maxNull)
        {
            var rand          = new Random();
            var size          = 4096 * 4096;
            var inputIndex    = 0;
            var input         = new byte[size];
            var expectedIndex = 0;
            var expected      = new byte[size];
            var totalNull     = 0;
            var totalRead     = 0;
            var result        = new StringBuilder();
            var markTemplate  = "[removed {0} null bytes]";

            while (inputIndex < size)
            {
                int numberOfNull = maxNull < 2 ? maxNull : rand.Next(1, Math.Min(maxNull, size - inputIndex));
                for (var i = inputIndex; i < inputIndex + numberOfNull; i++)
                {
                    input[i] = 0;
                    if (numberOfNull < 60)
                    {
                        expected[expectedIndex++] = 0;
                    }
                }
                if (numberOfNull >= 60 && addMark)
                {
                    foreach (var c in string.Format(markTemplate, numberOfNull))
                    {
                        expected[expectedIndex++] = (byte)c;
                    }
                }

                inputIndex += numberOfNull;
                totalNull  += numberOfNull;
                if (inputIndex < size)
                {
                    var numberOfChar = rand.Next(1, Math.Min(10, size - inputIndex));
                    for (var i = inputIndex; i < inputIndex + numberOfChar; i++)
                    {
                        input[i] = (byte)'a';
                        expected[expectedIndex++] = (byte)'a';
                    }
                    inputIndex += numberOfChar;
                }
            }

            using (var nullRemovalStream = new NullRemovalStream(new MemoryStream(input), addMark))
            {
                var buffer    = new byte[4096];
                var readCount = nullRemovalStream.Read(buffer, 0, 4096);
                while (readCount > 0)
                {
                    totalRead += readCount;
                    result.Append(Encoding.ASCII.GetString(buffer, 0, readCount));
                    readCount = nullRemovalStream.Read(buffer, 0, 4096);
                }
            }

            //File.WriteAllBytes($@"{Path.GetTempPath()}/1-input-{addMark}.txt",input);
            //File.WriteAllBytes($@"{Path.GetTempPath()}/2-expected-{addMark}.txt",expected);
            //File.WriteAllText($@"{Path.GetTempPath()}/3-result-{addMark}.txt",result.ToString());

            // if the number of consecutive null bytes >= threshold, shrinking is guaranteed
            Assert.True(maxNull < 60 ? totalRead == size : totalRead < size);
            Assert.True(totalRead == expectedIndex);
            var totalNumberOfA = input.Count(c => c == 'a');

            Assert.AreEqual(size - totalNull, totalNumberOfA, "(number of a) and (size - number of null) should be equal!");
            var expectedCount = expected.Count(c => c == 'a');

            Assert.AreEqual(totalNumberOfA, expectedCount, "Expected buffer should contain same number of a!");
            var processedCount = result.ToString().Count(c => c == 'a');

            Assert.AreEqual(totalNumberOfA, processedCount, "Result sbuilder should contain same number of a!");
            Assert.AreEqual(Encoding.ASCII.GetString(expected, 0, expectedIndex), result.ToString());
        }