SftpFileStreamTest_ReadAsync_ReadMode_NoDataInReaderBufferAndReadMoreBytesFromServerThanCount.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System;
  2. using System.IO;
  3. using System.Threading.Tasks;
  4. using Microsoft.VisualStudio.TestTools.UnitTesting;
  5. using Moq;
  6. using Renci.SshNet.Common;
  7. using Renci.SshNet.Sftp;
  8. namespace Renci.SshNet.Tests.Classes.Sftp
  9. {
  10. [TestClass]
  11. public class SftpFileStreamTest_ReadAsync_ReadMode_NoDataInReaderBufferAndReadMoreBytesFromServerThanCount : SftpFileStreamAsyncTestBase
  12. {
  13. private string _path;
  14. private SftpFileStream _target;
  15. private byte[] _handle;
  16. private uint _bufferSize;
  17. private uint _readBufferSize;
  18. private uint _writeBufferSize;
  19. private int _actual;
  20. private byte[] _buffer;
  21. private byte[] _serverData;
  22. private int _numberOfBytesToWriteToReadBuffer;
  23. private int _numberOfBytesToRead;
  24. protected override void SetupData()
  25. {
  26. base.SetupData();
  27. var random = new Random();
  28. _path = random.Next().ToString();
  29. _handle = GenerateRandom(5, random);
  30. _bufferSize = (uint)random.Next(1, 1000);
  31. _readBufferSize = 20;
  32. _writeBufferSize = 500;
  33. _numberOfBytesToRead = 20;
  34. _buffer = new byte[_numberOfBytesToRead];
  35. _numberOfBytesToWriteToReadBuffer = 10; // should be less than _readBufferSize
  36. _serverData = GenerateRandom(_numberOfBytesToRead + _numberOfBytesToWriteToReadBuffer, random);
  37. }
  38. protected override void SetupMocks()
  39. {
  40. SftpSessionMock.InSequence(MockSequence)
  41. .Setup(p => p.RequestOpenAsync(_path, Flags.Read, default))
  42. .ReturnsAsync(_handle);
  43. SftpSessionMock.InSequence(MockSequence)
  44. .Setup(p => p.CalculateOptimalReadLength(_bufferSize))
  45. .Returns(_readBufferSize);
  46. SftpSessionMock.InSequence(MockSequence)
  47. .Setup(p => p.CalculateOptimalWriteLength(_bufferSize, _handle))
  48. .Returns(_writeBufferSize);
  49. SftpSessionMock.InSequence(MockSequence)
  50. .Setup(p => p.IsOpen)
  51. .Returns(true);
  52. SftpSessionMock.InSequence(MockSequence)
  53. .Setup(p => p.RequestReadAsync(_handle, 0UL, _readBufferSize, default))
  54. .ReturnsAsync(_serverData);
  55. }
  56. [TestCleanup]
  57. public void TearDown()
  58. {
  59. SftpSessionMock.InSequence(MockSequence)
  60. .Setup(p => p.RequestClose(_handle));
  61. }
  62. protected override async Task ArrangeAsync()
  63. {
  64. await base.ArrangeAsync();
  65. _target = await SftpFileStream.OpenAsync(SftpSessionMock.Object,
  66. _path,
  67. FileMode.Open,
  68. FileAccess.Read,
  69. (int)_bufferSize,
  70. default);
  71. }
  72. protected override async Task ActAsync()
  73. {
  74. _actual = await _target.ReadAsync(_buffer, 0, _numberOfBytesToRead, default);
  75. }
  76. [TestMethod]
  77. public void ReadShouldHaveReturnedTheNumberOfBytesWrittenToCallerSuppliedBuffer()
  78. {
  79. Assert.AreEqual(_numberOfBytesToRead, _actual);
  80. }
  81. [TestMethod]
  82. public void ReadShouldHaveWrittenBytesToTheCallerSuppliedBuffer()
  83. {
  84. Assert.IsTrue(_serverData.Take(_actual).IsEqualTo(_buffer));
  85. }
  86. [TestMethod]
  87. public void PositionShouldReturnNumberOfBytesWrittenToCallerProvidedBuffer()
  88. {
  89. SftpSessionMock.InSequence(MockSequence).Setup(p => p.IsOpen).Returns(true);
  90. Assert.AreEqual(_actual, _target.Position);
  91. SftpSessionMock.Verify(p => p.IsOpen, Times.Exactly(2));
  92. }
  93. [TestMethod]
  94. public async Task SubsequentReadShouldReturnAllRemaningBytesFromReadBufferWhenCountIsEqualToNumberOfRemainingBytes()
  95. {
  96. SftpSessionMock.InSequence(MockSequence).Setup(p => p.IsOpen).Returns(true);
  97. var buffer = new byte[_numberOfBytesToWriteToReadBuffer];
  98. var actual = await _target.ReadAsync(buffer, 0, _numberOfBytesToWriteToReadBuffer, default);
  99. Assert.AreEqual(_numberOfBytesToWriteToReadBuffer, actual);
  100. Assert.IsTrue(_serverData.Take(_numberOfBytesToRead, _numberOfBytesToWriteToReadBuffer).IsEqualTo(buffer));
  101. SftpSessionMock.Verify(p => p.IsOpen, Times.Exactly(2));
  102. }
  103. [TestMethod]
  104. public async Task SubsequentReadShouldReturnAllRemaningBytesFromReadBufferAndReadAgainWhenCountIsGreaterThanNumberOfRemainingBytesAndNewReadReturnsZeroBytes()
  105. {
  106. SftpSessionMock.InSequence(MockSequence).Setup(p => p.IsOpen).Returns(true);
  107. SftpSessionMock.InSequence(MockSequence).Setup(p => p.RequestReadAsync(_handle, (ulong)(_serverData.Length), _readBufferSize, default)).ReturnsAsync(Array.Empty<byte>());
  108. var buffer = new byte[_numberOfBytesToWriteToReadBuffer + 1];
  109. var actual = await _target.ReadAsync(buffer, 0, buffer.Length);
  110. Assert.AreEqual(_numberOfBytesToWriteToReadBuffer, actual);
  111. Assert.IsTrue(_serverData.Take(_numberOfBytesToRead, _numberOfBytesToWriteToReadBuffer).IsEqualTo(buffer.Take(_numberOfBytesToWriteToReadBuffer)));
  112. Assert.AreEqual(0, buffer[_numberOfBytesToWriteToReadBuffer]);
  113. SftpSessionMock.Verify(p => p.IsOpen, Times.Exactly(2));
  114. SftpSessionMock.Verify(p => p.RequestReadAsync(_handle, (ulong)(_serverData.Length), _readBufferSize, default));
  115. }
  116. }
  117. }