using System; using System.IO; using System.Linq; using System.Security.Cryptography; using NUnit.Framework; namespace OpenTap.Engine.UnitTests { [TestFixture] public class TeeStreamTest { [TestCase(100)] [TestCase(100000)] [TestCase(1000000)] public void TestReadWriteTeeStream(int len) { var rnd = new Random(123); var bytes = new byte[len]; rnd.NextBytes(bytes); var str = new MemoryStream(bytes); var tee = new TeeStream(str); var streams = tee.CreateClientStreams(2); var s1 = streams[0]; var s2 = streams[1]; byte[] h1 = null; byte[] h2 = null; byte[] readStream(Stream s) { using var sh1 = SHA1.Create(); return sh1.ComputeHash(s); } var t1 = TapThread.StartAwaitable(() => { h1 = readStream(s1); }); var t2 = TapThread.StartAwaitable(() => { h2 = readStream(s2); }); t1.Wait(); t2.Wait(); Assert.IsTrue(h1.SequenceEqual(h2)); using var sh2 = SHA1.Create(); var r2 = sh2.ComputeHash(bytes); Assert.IsTrue(r2.SequenceEqual(h1)); } [TestCase(0)] [TestCase(100)] [TestCase(10000)] [TestCase(10001)] [TestCase(100001)] [TestCase(1000001)] public void TestReadWriteTeeStream1(int len) { var rnd = new Random(123); var bytes = new byte[len]; rnd.NextBytes(bytes); var str = new MemoryStream(bytes); var tee = new TeeStream(str); var streams = tee.CreateClientStreams(1); var s1 = streams[0]; byte[] h1 = null; byte[] readStream(Stream s) { using var sh1 = SHA1.Create(); return sh1.ComputeHash(s); } var t1 = TapThread.StartAwaitable(() => { h1 = readStream(s1); }); t1.Wait(); using var sh2 = SHA1.Create(); var r2 = sh2.ComputeHash(bytes); Assert.IsTrue(r2.SequenceEqual(h1)); } } }