ChannelDataMessageTest.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System;
  2. using System.Linq;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. using Renci.SshNet.Abstractions;
  5. using Renci.SshNet.Common;
  6. using Renci.SshNet.Messages.Connection;
  7. using Renci.SshNet.Tests.Common;
  8. namespace Renci.SshNet.Tests.Classes.Messages.Connection
  9. {
  10. /// <summary>
  11. /// This is a test class for ChannelDataMessageTest and is intended
  12. /// to contain all ChannelDataMessageTest Unit Tests
  13. /// </summary>
  14. [TestClass]
  15. public class ChannelDataMessageTest : TestBase
  16. {
  17. [TestMethod]
  18. public void DefaultConstructor()
  19. {
  20. var target = new ChannelDataMessage();
  21. Assert.IsNull(target.Data);
  22. Assert.AreEqual(0, target.Offset);
  23. Assert.AreEqual(0, target.Size);
  24. }
  25. [TestMethod]
  26. public void Constructor_LocalChannelNumberAndData()
  27. {
  28. var random = new Random();
  29. var localChannelNumber = (uint)random.Next(0, int.MaxValue);
  30. var data = new byte[3];
  31. var target = new ChannelDataMessage(localChannelNumber, data);
  32. Assert.AreSame(data, target.Data);
  33. Assert.AreEqual(0, target.Offset);
  34. Assert.AreEqual(data.Length, target.Size);
  35. }
  36. [TestMethod]
  37. public void Constructor_LocalChannelNumberAndData_ShouldThrowArgumentNullExceptionWhenDataIsNull()
  38. {
  39. var localChannelNumber = (uint)new Random().Next(0, int.MaxValue);
  40. const byte[] data = null;
  41. try
  42. {
  43. new ChannelDataMessage(localChannelNumber, data);
  44. Assert.Fail();
  45. }
  46. catch (ArgumentNullException ex)
  47. {
  48. Assert.IsNull(ex.InnerException);
  49. Assert.AreEqual("data", ex.ParamName);
  50. }
  51. }
  52. [TestMethod]
  53. public void Constructor_LocalChannelNumberAndDataAndOffsetAndSize()
  54. {
  55. var localChannelNumber = (uint)new Random().Next(0, int.MaxValue);
  56. var data = new byte[4];
  57. const int offset = 2;
  58. const int size = 1;
  59. var target = new ChannelDataMessage(localChannelNumber, data, offset, size);
  60. Assert.AreSame(data, target.Data);
  61. Assert.AreEqual(offset, target.Offset);
  62. Assert.AreEqual(size, target.Size);
  63. }
  64. [TestMethod]
  65. public void Constructor_LocalChannelNumberAndDataAndOffsetAndSize_ShouldThrowArgumentNullExceptionWhenDataIsNull()
  66. {
  67. var localChannelNumber = (uint)new Random().Next(0, int.MaxValue);
  68. const byte[] data = null;
  69. const int offset = 0;
  70. const int size = 0;
  71. try
  72. {
  73. new ChannelDataMessage(localChannelNumber, data, offset, size);
  74. Assert.Fail();
  75. }
  76. catch (ArgumentNullException ex)
  77. {
  78. Assert.IsNull(ex.InnerException);
  79. Assert.AreEqual("data", ex.ParamName);
  80. }
  81. }
  82. [TestMethod]
  83. public void GetBytes()
  84. {
  85. var random = new Random();
  86. var localChannelNumber = (uint)random.Next(0, int.MaxValue);
  87. var data = CryptoAbstraction.GenerateRandom(random.Next(10, 20));
  88. var offset = random.Next(0, data.Length - 1);
  89. var size = random.Next(0, data.Length - offset);
  90. var target = new ChannelDataMessage(localChannelNumber, data, offset, size);
  91. var bytes = target.GetBytes();
  92. var expectedBytesLength = 1; // Type
  93. expectedBytesLength += 4; // LocalChannelNumber
  94. expectedBytesLength += 4; // Data length
  95. expectedBytesLength += size; // Data
  96. Assert.AreEqual(expectedBytesLength, bytes.Length);
  97. var sshDataStream = new SshDataStream(bytes);
  98. Assert.AreEqual(target.MessageNumber, sshDataStream.ReadByte());
  99. Assert.AreEqual(localChannelNumber, sshDataStream.ReadUInt32());
  100. Assert.AreEqual((uint)size, sshDataStream.ReadUInt32());
  101. var actualData = new byte[size];
  102. _ = sshDataStream.Read(actualData, 0, size);
  103. Assert.IsTrue(actualData.SequenceEqual(data.Take(offset, size)));
  104. Assert.IsTrue(sshDataStream.IsEndOfData);
  105. }
  106. [TestMethod]
  107. public void Load()
  108. {
  109. var random = new Random();
  110. var localChannelNumber = (uint)random.Next(0, int.MaxValue);
  111. var data = CryptoAbstraction.GenerateRandom(random.Next(10, 20));
  112. var offset = random.Next(0, data.Length - 1);
  113. var size = random.Next(0, data.Length - offset);
  114. var channelDataMessage = new ChannelDataMessage(localChannelNumber, data, offset, size);
  115. var bytes = channelDataMessage.GetBytes();
  116. var target = new ChannelDataMessage();
  117. target.Load(bytes, 1, bytes.Length - 1); // skip message type
  118. CollectionAssert.AreEqual(data.Take(offset, size), target.Data.Take(target.Offset, target.Size));
  119. }
  120. }
  121. }