SftpFileStreamTest_SetLength_SessionOpen_FileAccessReadWrite.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.IO;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. using Moq;
  7. using Renci.SshNet.Sftp;
  8. namespace Renci.SshNet.Tests.Classes.Sftp
  9. {
  10. [TestClass]
  11. public class SftpFileStreamTest_SetLength_SessionOpen_FileAccessReadWrite
  12. {
  13. private Mock<ISftpSession> _sftpSessionMock;
  14. private string _path;
  15. private SftpFileStream _sftpFileStream;
  16. private byte[] _handle;
  17. private uint _bufferSize;
  18. private uint _readBufferSize;
  19. private uint _writeBufferSize;
  20. private MockSequence _sequence;
  21. private long _length;
  22. private long _lengthPassedToRequestFSetStat;
  23. private DateTime _fileAttributesLastAccessTime;
  24. private DateTime _fileAttributesLastWriteTime;
  25. private long _fileAttributesSize;
  26. private int _fileAttributesUserId;
  27. private int _fileAttributesGroupId;
  28. private uint _fileAttributesPermissions;
  29. private IDictionary<string, string> _fileAttributesExtensions;
  30. private SftpFileAttributes _fileAttributes;
  31. [TestInitialize]
  32. public void Setup()
  33. {
  34. Arrange();
  35. Act();
  36. }
  37. protected void Arrange()
  38. {
  39. var random = new Random();
  40. _path = random.Next().ToString(CultureInfo.InvariantCulture);
  41. _handle = new[] { (byte)random.Next(byte.MinValue, byte.MaxValue) };
  42. _bufferSize = (uint)random.Next(1, 1000);
  43. _readBufferSize = (uint)random.Next(1, 1000);
  44. _writeBufferSize = (uint)random.Next(1, 1000);
  45. _length = 7777;
  46. _fileAttributesLastAccessTime = DateTime.UtcNow.AddSeconds(random.Next());
  47. _fileAttributesLastWriteTime = DateTime.UtcNow.AddSeconds(random.Next());
  48. _fileAttributesSize = random.Next();
  49. _fileAttributesUserId = random.Next();
  50. _fileAttributesGroupId = random.Next();
  51. _fileAttributesPermissions = (uint)random.Next();
  52. _fileAttributesExtensions = new Dictionary<string, string>();
  53. _fileAttributes = new SftpFileAttributes(_fileAttributesLastAccessTime,
  54. _fileAttributesLastWriteTime,
  55. _fileAttributesSize,
  56. _fileAttributesUserId,
  57. _fileAttributesGroupId,
  58. _fileAttributesPermissions,
  59. _fileAttributesExtensions);
  60. _sftpSessionMock = new Mock<ISftpSession>(MockBehavior.Strict);
  61. _sequence = new MockSequence();
  62. _sftpSessionMock.InSequence(_sequence)
  63. .Setup(p => p.RequestOpen(_path, Flags.Read | Flags.Write | Flags.Truncate, true))
  64. .Returns(_handle);
  65. _sftpSessionMock.InSequence(_sequence)
  66. .Setup(p => p.CalculateOptimalReadLength(_bufferSize))
  67. .Returns(_readBufferSize);
  68. _sftpSessionMock.InSequence(_sequence)
  69. .Setup(p => p.CalculateOptimalWriteLength(_bufferSize, _handle))
  70. .Returns(_writeBufferSize);
  71. _sftpSessionMock.InSequence(_sequence)
  72. .Setup(p => p.IsOpen)
  73. .Returns(true);
  74. _sftpSessionMock.InSequence(_sequence)
  75. .Setup(p => p.RequestFStat(_handle, false))
  76. .Returns(_fileAttributes);
  77. _sftpSessionMock.InSequence(_sequence)
  78. .Setup(p => p.RequestFSetStat(_handle, _fileAttributes))
  79. .Callback<byte[], SftpFileAttributes>((bytes, attributes) => _lengthPassedToRequestFSetStat = attributes.Size);
  80. _sftpFileStream = new SftpFileStream(_sftpSessionMock.Object, _path, FileMode.Create, FileAccess.ReadWrite, (int)_bufferSize);
  81. }
  82. protected void Act()
  83. {
  84. _sftpFileStream.SetLength(_length);
  85. }
  86. [TestMethod]
  87. public void PositionShouldReturnOriginalPosition()
  88. {
  89. _sftpSessionMock.InSequence(_sequence).Setup(p => p.IsOpen).Returns(true);
  90. Assert.AreEqual(0, _sftpFileStream.Position);
  91. _sftpSessionMock.Verify(p => p.IsOpen, Times.Exactly(2));
  92. }
  93. [TestMethod]
  94. public void RequestFSetStatOnSftpSessionShouldBeInvokedOnce()
  95. {
  96. _sftpSessionMock.Verify(p => p.RequestFSetStat(_handle, _fileAttributes), Times.Once);
  97. }
  98. [TestMethod]
  99. public void SizeOfSftpFileAttributesShouldBeModifiedToNewLengthBeforePassedToRequestFSetStat()
  100. {
  101. Assert.AreEqual(_length, _lengthPassedToRequestFSetStat);
  102. }
  103. [TestMethod]
  104. public void SizeOfSftpFileAttributesShouldBeEqualToNewLength()
  105. {
  106. Assert.AreEqual(_length, _fileAttributes.Size);
  107. }
  108. }
  109. }