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); } }
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()); }