ChannelOpenMessageTest.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. using System;
  2. using System.Globalization;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. using Renci.SshNet.Common;
  7. using Renci.SshNet.Messages.Connection;
  8. namespace Renci.SshNet.Tests.Classes.Messages.Connection
  9. {
  10. [TestClass]
  11. public class ChannelOpenMessageTest
  12. {
  13. private Random _random;
  14. private Encoding _ascii;
  15. [TestInitialize]
  16. public void Init()
  17. {
  18. _random = new Random();
  19. _ascii = Encoding.ASCII;
  20. }
  21. [TestMethod]
  22. public void DefaultConstructor()
  23. {
  24. var target = new ChannelOpenMessage();
  25. Assert.IsNull(target.ChannelType);
  26. Assert.IsNull(target.Info);
  27. Assert.AreEqual(default, target.InitialWindowSize);
  28. Assert.AreEqual(default, target.LocalChannelNumber);
  29. Assert.AreEqual(default, target.MaximumPacketSize);
  30. }
  31. [TestMethod]
  32. public void Constructor_LocalChannelNumberAndInitialWindowSizeAndMaximumPacketSizeAndInfo()
  33. {
  34. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  35. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  36. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  37. var info = new DirectTcpipChannelInfo("host", 22, "originator", 25);
  38. var target = new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);
  39. Assert.AreEqual(info.ChannelType, _ascii.GetString(target.ChannelType));
  40. Assert.AreSame(info, target.Info);
  41. Assert.AreEqual(initialWindowSize, target.InitialWindowSize);
  42. Assert.AreEqual(localChannelNumber, target.LocalChannelNumber);
  43. Assert.AreEqual(maximumPacketSize, target.MaximumPacketSize);
  44. }
  45. [TestMethod]
  46. public void Constructor_LocalChannelNumberAndInitialWindowSizeAndMaximumPacketSizeAndInfo_ShouldThrowArgumentNullExceptionWhenInfoIsNull()
  47. {
  48. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  49. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  50. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  51. ChannelOpenInfo info = null;
  52. try
  53. {
  54. new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);
  55. Assert.Fail();
  56. }
  57. catch (ArgumentNullException ex)
  58. {
  59. Assert.IsNull(ex.InnerException);
  60. Assert.AreEqual("info", ex.ParamName);
  61. }
  62. }
  63. [TestMethod]
  64. public void GetBytes()
  65. {
  66. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  67. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  68. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  69. var info = new DirectTcpipChannelInfo("host", 22, "originator", 25);
  70. var infoBytes = info.GetBytes();
  71. var target = new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);
  72. var bytes = target.GetBytes();
  73. var expectedBytesLength = 1; // Type
  74. expectedBytesLength += 4; // ChannelType length
  75. expectedBytesLength += target.ChannelType.Length; // ChannelType
  76. expectedBytesLength += 4; // LocalChannelNumber
  77. expectedBytesLength += 4; // InitialWindowSize
  78. expectedBytesLength += 4; // MaximumPacketSize
  79. expectedBytesLength += infoBytes.Length; // Info
  80. Assert.AreEqual(expectedBytesLength, bytes.Length);
  81. var sshDataStream = new SshDataStream(bytes);
  82. Assert.AreEqual(target.MessageNumber, sshDataStream.ReadByte());
  83. var actualChannelTypeLength = sshDataStream.ReadUInt32();
  84. Assert.AreEqual((uint)target.ChannelType.Length, actualChannelTypeLength);
  85. var actualChannelType = new byte[actualChannelTypeLength];
  86. _ = sshDataStream.Read(actualChannelType, 0, (int)actualChannelTypeLength);
  87. Assert.IsTrue(target.ChannelType.SequenceEqual(actualChannelType));
  88. Assert.AreEqual(localChannelNumber, sshDataStream.ReadUInt32());
  89. Assert.AreEqual(initialWindowSize, sshDataStream.ReadUInt32());
  90. Assert.AreEqual(maximumPacketSize, sshDataStream.ReadUInt32());
  91. var actualInfo = new byte[infoBytes.Length];
  92. _ = sshDataStream.Read(actualInfo, 0, actualInfo.Length);
  93. Assert.IsTrue(infoBytes.SequenceEqual(actualInfo));
  94. Assert.IsTrue(sshDataStream.IsEndOfData);
  95. }
  96. [TestMethod]
  97. public void Load_DirectTcpipChannelInfo()
  98. {
  99. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  100. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  101. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  102. var info = new DirectTcpipChannelInfo("host", 22, "originator", 25);
  103. var target = new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);
  104. var bytes = target.GetBytes();
  105. target.Load(bytes, 1, bytes.Length - 1); // skip message type
  106. Assert.AreEqual(info.ChannelType, _ascii.GetString(target.ChannelType));
  107. Assert.IsNotNull(target.Info);
  108. Assert.AreEqual(initialWindowSize, target.InitialWindowSize);
  109. Assert.AreEqual(localChannelNumber, target.LocalChannelNumber);
  110. Assert.AreEqual(maximumPacketSize, target.MaximumPacketSize);
  111. var directTcpChannelInfo = target.Info as DirectTcpipChannelInfo;
  112. Assert.IsNotNull(directTcpChannelInfo);
  113. Assert.AreEqual(info.ChannelType, directTcpChannelInfo.ChannelType);
  114. Assert.AreEqual(info.HostToConnect, directTcpChannelInfo.HostToConnect);
  115. Assert.AreEqual(info.OriginatorAddress, directTcpChannelInfo.OriginatorAddress);
  116. Assert.AreEqual(info.OriginatorPort, directTcpChannelInfo.OriginatorPort);
  117. Assert.AreEqual(info.PortToConnect, directTcpChannelInfo.PortToConnect);
  118. }
  119. [TestMethod]
  120. public void Load_ForwardedTcpipChannelInfo()
  121. {
  122. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  123. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  124. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  125. var info = new ForwardedTcpipChannelInfo("connected", 25, "originator", 21);
  126. var target = new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);
  127. var bytes = target.GetBytes();
  128. target.Load(bytes, 1, bytes.Length - 1); // skip message type
  129. Assert.AreEqual(info.ChannelType, _ascii.GetString(target.ChannelType));
  130. Assert.IsNotNull(target.Info);
  131. Assert.AreEqual(initialWindowSize, target.InitialWindowSize);
  132. Assert.AreEqual(localChannelNumber, target.LocalChannelNumber);
  133. Assert.AreEqual(maximumPacketSize, target.MaximumPacketSize);
  134. var forwardedTcpipChannelInfo = target.Info as ForwardedTcpipChannelInfo;
  135. Assert.IsNotNull(forwardedTcpipChannelInfo);
  136. Assert.AreEqual(info.ChannelType, forwardedTcpipChannelInfo.ChannelType);
  137. Assert.AreEqual(info.ConnectedAddress, forwardedTcpipChannelInfo.ConnectedAddress);
  138. Assert.AreEqual(info.ConnectedPort, forwardedTcpipChannelInfo.ConnectedPort);
  139. Assert.AreEqual(info.OriginatorAddress, forwardedTcpipChannelInfo.OriginatorAddress);
  140. Assert.AreEqual(info.OriginatorPort, forwardedTcpipChannelInfo.OriginatorPort);
  141. }
  142. [TestMethod]
  143. public void Load_SessionChannelOpenInfo()
  144. {
  145. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  146. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  147. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  148. var info = new SessionChannelOpenInfo();
  149. var target = new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);
  150. var bytes = target.GetBytes();
  151. target.Load(bytes, 1, bytes.Length - 1); // skip message type
  152. Assert.AreEqual(info.ChannelType, _ascii.GetString(target.ChannelType));
  153. Assert.IsNotNull(target.Info);
  154. Assert.AreEqual(initialWindowSize, target.InitialWindowSize);
  155. Assert.AreEqual(localChannelNumber, target.LocalChannelNumber);
  156. Assert.AreEqual(maximumPacketSize, target.MaximumPacketSize);
  157. var sessionChannelOpenInfo = target.Info as SessionChannelOpenInfo;
  158. Assert.IsNotNull(sessionChannelOpenInfo);
  159. Assert.AreEqual(info.ChannelType, sessionChannelOpenInfo.ChannelType);
  160. }
  161. [TestMethod]
  162. public void Load_X11ChannelOpenInfo()
  163. {
  164. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  165. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  166. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  167. var info = new X11ChannelOpenInfo("address", 26);
  168. var target = new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);
  169. var bytes = target.GetBytes();
  170. target.Load(bytes, 1, bytes.Length - 1); // skip message type
  171. Assert.AreEqual(info.ChannelType, _ascii.GetString(target.ChannelType));
  172. Assert.IsNotNull(target.Info);
  173. Assert.AreEqual(initialWindowSize, target.InitialWindowSize);
  174. Assert.AreEqual(localChannelNumber, target.LocalChannelNumber);
  175. Assert.AreEqual(maximumPacketSize, target.MaximumPacketSize);
  176. var x11ChannelOpenInfo = target.Info as X11ChannelOpenInfo;
  177. Assert.IsNotNull(x11ChannelOpenInfo);
  178. Assert.AreEqual(info.ChannelType, x11ChannelOpenInfo.ChannelType);
  179. Assert.AreEqual(info.OriginatorAddress, x11ChannelOpenInfo.OriginatorAddress);
  180. Assert.AreEqual(info.OriginatorPort, x11ChannelOpenInfo.OriginatorPort);
  181. }
  182. [TestMethod]
  183. public void Load_ShouldThrowNotSupportedExceptionWhenChannelTypeIsNotSupported()
  184. {
  185. var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
  186. var initialWindowSize = (uint)_random.Next(0, int.MaxValue);
  187. var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
  188. var channelName = "dunno_" + _random.Next().ToString(CultureInfo.InvariantCulture);
  189. var channelType = _ascii.GetBytes(channelName);
  190. var target = new ChannelOpenMessage();
  191. var sshDataStream = new SshDataStream(1 + 4 + channelType.Length + 4 + 4 + 4);
  192. sshDataStream.WriteByte(target.MessageNumber);
  193. sshDataStream.Write((uint)channelType.Length);
  194. sshDataStream.Write(channelType, 0, channelType.Length);
  195. sshDataStream.Write(localChannelNumber);
  196. sshDataStream.Write(initialWindowSize);
  197. sshDataStream.Write(maximumPacketSize);
  198. var bytes = sshDataStream.ToArray();
  199. try
  200. {
  201. target.Load(bytes, 1, bytes.Length - 1); // skip message type
  202. Assert.Fail();
  203. }
  204. catch (NotSupportedException ex)
  205. {
  206. Assert.IsNull(ex.InnerException);
  207. Assert.AreEqual(string.Format("Channel type '{0}' is not supported.", channelName), ex.Message);
  208. }
  209. }
  210. }
  211. }