SftpFileStreamTest_Read_ReadMode_NoDataInReaderBufferAndReadLessBytesFromServerThanCountAndLessThanBufferSize.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System;
  2. using System.IO;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. using Moq;
  5. using Renci.SshNet.Common;
  6. using Renci.SshNet.Sftp;
  7. using Renci.SshNet.Tests.Common;
  8. namespace Renci.SshNet.Tests.Classes.Sftp
  9. {
  10. [TestClass]
  11. public class SftpFileStreamTest_Read_ReadMode_NoDataInReaderBufferAndReadLessBytesFromServerThanCountAndLessThanBufferSize : SftpFileStreamTestBase
  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 _serverDataLength;
  23. private int _numberOfBytesToRead;
  24. private byte[] _originalBuffer;
  25. protected override void SetupData()
  26. {
  27. base.SetupData();
  28. var random = new Random();
  29. _path = random.Next().ToString();
  30. _handle = GenerateRandom(5, random);
  31. _bufferSize = (uint)random.Next(1, 1000);
  32. _readBufferSize = 20;
  33. _writeBufferSize = 500;
  34. _numberOfBytesToRead = (int)_readBufferSize + 2; // greater than read buffer size
  35. _originalBuffer = GenerateRandom(_numberOfBytesToRead, random);
  36. _buffer = _originalBuffer.Copy();
  37. _serverDataLength = (int)_readBufferSize - 1; // less than read buffer size
  38. _serverData = GenerateRandom(_serverDataLength, random);
  39. Assert.IsTrue(_serverDataLength < _numberOfBytesToRead && _serverDataLength < _readBufferSize);
  40. }
  41. protected override void SetupMocks()
  42. {
  43. SftpSessionMock.InSequence(MockSequence)
  44. .Setup(p => p.RequestOpen(_path, Flags.Read, false))
  45. .Returns(_handle);
  46. SftpSessionMock.InSequence(MockSequence)
  47. .Setup(p => p.CalculateOptimalReadLength(_bufferSize))
  48. .Returns(_readBufferSize);
  49. SftpSessionMock.InSequence(MockSequence)
  50. .Setup(p => p.CalculateOptimalWriteLength(_bufferSize, _handle))
  51. .Returns(_writeBufferSize);
  52. SftpSessionMock.InSequence(MockSequence)
  53. .Setup(p => p.IsOpen)
  54. .Returns(true);
  55. SftpSessionMock.InSequence(MockSequence)
  56. .Setup(p => p.RequestRead(_handle, 0UL, _readBufferSize))
  57. .Returns(_serverData);
  58. }
  59. [TestCleanup]
  60. public void TearDown()
  61. {
  62. SftpSessionMock.InSequence(MockSequence)
  63. .Setup(p => p.RequestClose(_handle));
  64. }
  65. protected override void Arrange()
  66. {
  67. base.Arrange();
  68. _target = new SftpFileStream(SftpSessionMock.Object,
  69. _path,
  70. FileMode.Open,
  71. FileAccess.Read,
  72. (int)_bufferSize);
  73. }
  74. protected override void Act()
  75. {
  76. _actual = _target.Read(_buffer, 0, _numberOfBytesToRead);
  77. }
  78. [TestMethod]
  79. public void ReadShouldHaveReturnedTheNumberOfBytesReturnedByTheReadFromTheServer()
  80. {
  81. Assert.AreEqual(_serverDataLength, _actual);
  82. }
  83. [TestMethod]
  84. public void ReadShouldHaveWrittenBytesToTheCallerSuppliedBufferAndRemainingBytesShouldRemainUntouched()
  85. {
  86. Assert.IsTrue(_serverData.IsEqualTo(_buffer.Take(_serverDataLength)));
  87. Assert.IsTrue(_originalBuffer.Take(_serverDataLength, _originalBuffer.Length - _serverDataLength).IsEqualTo(_buffer.Take(_serverDataLength, _buffer.Length - _serverDataLength)));
  88. }
  89. [TestMethod]
  90. public void PositionShouldReturnNumberOfBytesWrittenToCallerProvidedBuffer()
  91. {
  92. SftpSessionMock.InSequence(MockSequence).Setup(p => p.IsOpen).Returns(true);
  93. Assert.AreEqual(_actual, _target.Position);
  94. SftpSessionMock.Verify(p => p.IsOpen, Times.Exactly(2));
  95. }
  96. [TestMethod]
  97. public void SubsequentReadShouldReadAgainFromCurrentPositionFromServerAndReturnZeroWhenServerReturnsZeroBytes()
  98. {
  99. SftpSessionMock.InSequence(MockSequence).Setup(p => p.IsOpen).Returns(true);
  100. SftpSessionMock.InSequence(MockSequence)
  101. .Setup(p => p.RequestRead(_handle, (ulong)_actual, _readBufferSize))
  102. .Returns(Array.Empty<byte>());
  103. var buffer = _originalBuffer.Copy();
  104. var actual = _target.Read(buffer, 0, buffer.Length);
  105. Assert.AreEqual(0, actual);
  106. Assert.IsTrue(_originalBuffer.IsEqualTo(buffer));
  107. SftpSessionMock.Verify(p => p.RequestRead(_handle, (ulong)_actual, _readBufferSize), Times.Once);
  108. SftpSessionMock.Verify(p => p.IsOpen, Times.Exactly(2));
  109. }
  110. [TestMethod]
  111. public void SubsequentReadShouldReadAgainFromCurrentPositionFromServerAndNotUpdatePositionWhenServerReturnsZeroBytes()
  112. {
  113. SftpSessionMock.InSequence(MockSequence).Setup(p => p.IsOpen).Returns(true);
  114. SftpSessionMock.InSequence(MockSequence)
  115. .Setup(p => p.RequestRead(_handle, (ulong)_actual, _readBufferSize))
  116. .Returns(Array.Empty<byte>());
  117. SftpSessionMock.InSequence(MockSequence).Setup(p => p.IsOpen).Returns(true);
  118. _ = _target.Read(new byte[10], 0, 10);
  119. Assert.AreEqual(_actual, _target.Position);
  120. SftpSessionMock.Verify(p => p.RequestRead(_handle, (ulong)_actual, _readBufferSize), Times.Once);
  121. SftpSessionMock.Verify(p => p.IsOpen, Times.Exactly(3));
  122. }
  123. }
  124. }