PipeStreamTest.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using System;
  2. using System.IO;
  3. using System.Threading.Tasks;
  4. using Microsoft.VisualStudio.TestTools.UnitTesting;
  5. #if NETFRAMEWORK
  6. using Renci.SshNet.Abstractions;
  7. #endif
  8. using Renci.SshNet.Common;
  9. using Renci.SshNet.Tests.Common;
  10. namespace Renci.SshNet.Tests.Classes.Common
  11. {
  12. [TestClass]
  13. public class PipeStreamTest : TestBase
  14. {
  15. [TestMethod]
  16. public void Test_PipeStream_Write_Read_Buffer()
  17. {
  18. var testBuffer = new byte[1024];
  19. new Random().NextBytes(testBuffer);
  20. var outputBuffer = new byte[1024];
  21. using (var stream = new PipeStream())
  22. {
  23. stream.Write(testBuffer, 0, 512);
  24. Assert.AreEqual(512, stream.Length);
  25. Assert.AreEqual(128, stream.Read(outputBuffer, 64, 128));
  26. Assert.AreEqual(384, stream.Length);
  27. CollectionAssert.AreEqual(new byte[64].Concat(testBuffer.Take(128)).Concat(new byte[832]), outputBuffer);
  28. }
  29. }
  30. [TestMethod]
  31. public void Test_PipeStream_Write_Read_Byte()
  32. {
  33. var testBuffer = new byte[1024];
  34. new Random().NextBytes(testBuffer);
  35. using (var stream = new PipeStream())
  36. {
  37. stream.Write(testBuffer, 0, testBuffer.Length);
  38. Assert.AreEqual(1024, stream.Length);
  39. Assert.AreEqual(testBuffer[0], stream.ReadByte());
  40. Assert.AreEqual(1023, stream.Length);
  41. Assert.AreEqual(testBuffer[1], stream.ReadByte());
  42. Assert.AreEqual(1022, stream.Length);
  43. }
  44. }
  45. [TestMethod]
  46. public void Read()
  47. {
  48. var target = new PipeStream();
  49. target.WriteByte(0x0a);
  50. target.WriteByte(0x0d);
  51. target.WriteByte(0x09);
  52. var readBuffer = new byte[2];
  53. var bytesRead = target.Read(readBuffer, 0, readBuffer.Length);
  54. Assert.AreEqual(2, bytesRead);
  55. Assert.AreEqual(0x0a, readBuffer[0]);
  56. Assert.AreEqual(0x0d, readBuffer[1]);
  57. var writeBuffer = new byte[] { 0x05, 0x03 };
  58. target.Write(writeBuffer, 0, writeBuffer.Length);
  59. readBuffer = new byte[4];
  60. bytesRead = target.Read(readBuffer, 0, readBuffer.Length);
  61. Assert.AreEqual(3, bytesRead);
  62. Assert.AreEqual(0x09, readBuffer[0]);
  63. Assert.AreEqual(0x05, readBuffer[1]);
  64. Assert.AreEqual(0x03, readBuffer[2]);
  65. Assert.AreEqual(0x00, readBuffer[3]);
  66. }
  67. [TestMethod]
  68. public async Task Read_NonEmptyArray_OnlyReturnsZeroAfterDispose()
  69. {
  70. // When there is no data available, a read should block,
  71. // but then unblock (and return 0) after disposal.
  72. var pipeStream = new PipeStream();
  73. Task<int> readTask = pipeStream.ReadAsync(new byte[16], 0, 16);
  74. await Task.Delay(50);
  75. Assert.IsFalse(readTask.IsCompleted);
  76. await pipeStream.DisposeAsync();
  77. Assert.AreEqual(0, await readTask);
  78. }
  79. [TestMethod]
  80. public async Task Read_EmptyArray_OnlyReturnsZeroAfterDispose()
  81. {
  82. // Similarly, zero byte reads should still block until after disposal.
  83. var pipeStream = new PipeStream();
  84. Task<int> readTask = pipeStream.ReadAsync(Array.Empty<byte>(), 0, 0);
  85. await Task.Delay(50);
  86. Assert.IsFalse(readTask.IsCompleted);
  87. await pipeStream.DisposeAsync();
  88. Assert.AreEqual(0, await readTask);
  89. }
  90. [TestMethod]
  91. public async Task Read_EmptyArray_OnlyReturnsZeroWhenDataAvailable()
  92. {
  93. // And zero byte reads should block but then return 0 once data
  94. // is available.
  95. var pipeStream = new PipeStream();
  96. Task<int> readTask = pipeStream.ReadAsync(Array.Empty<byte>(), 0, 0);
  97. await Task.Delay(50);
  98. Assert.IsFalse(readTask.IsCompleted);
  99. await pipeStream.WriteAsync(new byte[] { 1, 2, 3, 4 }, 0, 4);
  100. Assert.AreEqual(0, await readTask);
  101. }
  102. #if NET
  103. [TestMethod]
  104. public async Task Read_EmptySpan_OnlyReturnsZeroWhenDataAvailable()
  105. {
  106. // And zero byte reads should block but then return 0 once data
  107. // is available (the span version).
  108. var pipeStream = new PipeStream();
  109. ValueTask<int> readTask = pipeStream.ReadAsync(Memory<byte>.Empty);
  110. await Task.Delay(50);
  111. Assert.IsFalse(readTask.IsCompleted);
  112. await pipeStream.WriteAsync(new byte[] { 1, 2, 3, 4 });
  113. Assert.AreEqual(0, await readTask);
  114. }
  115. #endif
  116. [TestMethod]
  117. public void Read_AfterDispose_StillWorks()
  118. {
  119. var pipeStream = new PipeStream();
  120. pipeStream.Write(new byte[] { 1, 2, 3, 4 }, 0, 4);
  121. pipeStream.Dispose();
  122. #pragma warning disable S3966 // Objects should not be disposed more than once
  123. pipeStream.Dispose(); // Check that multiple Dispose is OK.
  124. #pragma warning restore S3966 // Objects should not be disposed more than once
  125. Assert.IsTrue(pipeStream.CanRead);
  126. Assert.AreEqual(4, pipeStream.Read(new byte[5], 0, 5));
  127. Assert.AreEqual(0, pipeStream.Read(new byte[5], 0, 5));
  128. }
  129. [TestMethod]
  130. public void SeekShouldThrowNotSupportedException()
  131. {
  132. var target = new PipeStream();
  133. Assert.Throws<NotSupportedException>(() => target.Seek(offset: 0, SeekOrigin.Begin));
  134. }
  135. [TestMethod]
  136. public void SetLengthShouldThrowNotSupportedException()
  137. {
  138. var target = new PipeStream();
  139. Assert.Throws<NotSupportedException>(() => target.SetLength(1));
  140. }
  141. [TestMethod]
  142. public void WriteTest()
  143. {
  144. var target = new PipeStream();
  145. var writeBuffer = new byte[] { 0x0a, 0x05, 0x0d };
  146. target.Write(writeBuffer, 0, 2);
  147. writeBuffer = new byte[] { 0x02, 0x04, 0x03, 0x06, 0x09 };
  148. target.Write(writeBuffer, 1, 2);
  149. var readBuffer = new byte[6];
  150. var bytesRead = target.Read(readBuffer, 0, 4);
  151. Assert.AreEqual(4, bytesRead);
  152. Assert.AreEqual(0x0a, readBuffer[0]);
  153. Assert.AreEqual(0x05, readBuffer[1]);
  154. Assert.AreEqual(0x04, readBuffer[2]);
  155. Assert.AreEqual(0x03, readBuffer[3]);
  156. Assert.AreEqual(0x00, readBuffer[4]);
  157. Assert.AreEqual(0x00, readBuffer[5]);
  158. }
  159. #if NET
  160. [TestMethod]
  161. public void WriteTest_Span()
  162. {
  163. var target = new PipeStream();
  164. var writeBuffer = new byte[] { 0x0a, 0x05, 0x0d };
  165. target.Write(writeBuffer.AsSpan(0, 2));
  166. writeBuffer = new byte[] { 0x02, 0x04, 0x03, 0x06, 0x09 };
  167. target.Write(writeBuffer.AsSpan(1, 2));
  168. var readBuffer = new byte[6];
  169. var bytesRead = target.Read(readBuffer.AsSpan(0, 4));
  170. Assert.AreEqual(4, bytesRead);
  171. Assert.AreEqual(0x0a, readBuffer[0]);
  172. Assert.AreEqual(0x05, readBuffer[1]);
  173. Assert.AreEqual(0x04, readBuffer[2]);
  174. Assert.AreEqual(0x03, readBuffer[3]);
  175. Assert.AreEqual(0x00, readBuffer[4]);
  176. Assert.AreEqual(0x00, readBuffer[5]);
  177. }
  178. #endif
  179. [TestMethod]
  180. public void CanReadTest()
  181. {
  182. var target = new PipeStream();
  183. Assert.IsTrue(target.CanRead);
  184. }
  185. [TestMethod]
  186. public void CanSeekTest()
  187. {
  188. var target = new PipeStream();
  189. Assert.IsFalse(target.CanSeek);
  190. }
  191. [TestMethod]
  192. public void CanWriteTest()
  193. {
  194. var target = new PipeStream();
  195. Assert.IsTrue(target.CanWrite);
  196. target.Dispose();
  197. Assert.IsFalse(target.CanWrite);
  198. }
  199. [TestMethod]
  200. public void LengthTest()
  201. {
  202. var target = new PipeStream();
  203. Assert.AreEqual(0L, target.Length);
  204. target.Write(new byte[] { 0x0a, 0x05, 0x0d }, 0, 2);
  205. Assert.AreEqual(2L, target.Length);
  206. target.WriteByte(0x0a);
  207. Assert.AreEqual(3L, target.Length);
  208. _ = target.Read(new byte[2], 0, 2);
  209. Assert.AreEqual(1L, target.Length);
  210. _ = target.ReadByte();
  211. Assert.AreEqual(0L, target.Length);
  212. }
  213. [TestMethod]
  214. public void Position_GetterAlwaysReturnsZero()
  215. {
  216. var target = new PipeStream();
  217. Assert.AreEqual(0, target.Position);
  218. target.WriteByte(0x0a);
  219. Assert.AreEqual(0, target.Position);
  220. _ = target.ReadByte();
  221. Assert.AreEqual(0, target.Position);
  222. }
  223. [TestMethod]
  224. public void Position_SetterAlwaysThrowsNotSupportedException()
  225. {
  226. var target = new PipeStream();
  227. Assert.Throws<NotSupportedException>(() => target.Position = 0);
  228. }
  229. }
  230. }