ConnectionInfoTest.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. using System.Globalization;
  2. using System.Net;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. using Moq;
  5. using Renci.SshNet.Tests.Common;
  6. using Renci.SshNet.Tests.Properties;
  7. using System;
  8. namespace Renci.SshNet.Tests.Classes
  9. {
  10. /// <summary>
  11. /// Represents remote connection information class.
  12. /// </summary>
  13. [TestClass]
  14. public class ConnectionInfoTest : TestBase
  15. {
  16. [TestMethod]
  17. [TestCategory("ConnectionInfo")]
  18. public void ConstructorShouldNotThrowExceptionhenProxyTypesIsNoneAndProxyHostIsNull()
  19. {
  20. const string proxyHost = null;
  21. var connectionInfo = new ConnectionInfo(Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME,
  22. ProxyTypes.None, proxyHost, int.Parse(Resources.PORT), Resources.USERNAME, Resources.PASSWORD,
  23. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  24. Assert.IsNull(connectionInfo.ProxyHost);
  25. }
  26. [TestMethod]
  27. [TestCategory("ConnectionInfo")]
  28. public void ConstructorShouldThrowArgumentNullExceptionhenProxyTypesIsNotNoneAndProxyHostIsNull()
  29. {
  30. try
  31. {
  32. _ = new ConnectionInfo(Resources.HOST,
  33. int.Parse(Resources.PORT),
  34. Resources.USERNAME,
  35. ProxyTypes.Http,
  36. null,
  37. int.Parse(Resources.PORT),
  38. Resources.USERNAME,
  39. Resources.PASSWORD,
  40. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  41. Assert.Fail();
  42. }
  43. catch (ArgumentNullException ex)
  44. {
  45. Assert.IsNull(ex.InnerException);
  46. Assert.AreEqual("proxyHost", ex.ParamName);
  47. }
  48. }
  49. [TestMethod]
  50. [TestCategory("ConnectionInfo")]
  51. public void ConstructorShouldNotThrowExceptionWhenProxyTypesIsNotNoneAndProxyHostIsEmpty()
  52. {
  53. var proxyHost = string.Empty;
  54. var connectionInfo = new ConnectionInfo(Resources.HOST,
  55. int.Parse(Resources.PORT),
  56. Resources.USERNAME,
  57. ProxyTypes.Http,
  58. string.Empty,
  59. int.Parse(Resources.PORT),
  60. Resources.USERNAME,
  61. Resources.PASSWORD,
  62. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  63. Assert.AreSame(proxyHost, connectionInfo.ProxyHost);
  64. }
  65. [TestMethod]
  66. [TestCategory("ConnectionInfo")]
  67. public void ConstructorShouldThrowArgumentOutOfRangeExceptionWhenProxyTypesIsNotNoneAndProxyPortIsGreaterThanMaximumValue()
  68. {
  69. var maxPort = IPEndPoint.MaxPort;
  70. try
  71. {
  72. _ = new ConnectionInfo(Resources.HOST,
  73. int.Parse(Resources.PORT),
  74. Resources.USERNAME,
  75. ProxyTypes.Http,
  76. Resources.HOST,
  77. ++maxPort,
  78. Resources.USERNAME,
  79. Resources.PASSWORD,
  80. null);
  81. Assert.Fail();
  82. }
  83. catch (ArgumentOutOfRangeException ex)
  84. {
  85. Assert.IsNull(ex.InnerException);
  86. Assert.AreEqual("proxyPort", ex.ParamName);
  87. }
  88. }
  89. [TestMethod]
  90. [TestCategory("ConnectionInfo")]
  91. public void ConstructorShouldThrowArgumentOutOfRangeExceptionWhenProxyTypesIsNotNoneAndProxyPortIsLessThanMinimumValue()
  92. {
  93. var minPort = IPEndPoint.MinPort;
  94. try
  95. {
  96. _ = new ConnectionInfo(Resources.HOST,
  97. int.Parse(Resources.PORT),
  98. Resources.USERNAME,
  99. ProxyTypes.Http,
  100. Resources.HOST,
  101. --minPort,
  102. Resources.USERNAME,
  103. Resources.PASSWORD,
  104. null);
  105. Assert.Fail();
  106. }
  107. catch (ArgumentOutOfRangeException ex)
  108. {
  109. Assert.IsNull(ex.InnerException);
  110. Assert.AreEqual("proxyPort", ex.ParamName);
  111. }
  112. }
  113. [TestMethod]
  114. [TestCategory("ConnectionInfo")]
  115. public void Test_ConnectionInfo_ProxyPort_Valid()
  116. {
  117. var proxyPort = new Random().Next(IPEndPoint.MinPort, IPEndPoint.MaxPort);
  118. var connectionInfo = new ConnectionInfo(Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME,
  119. ProxyTypes.None, Resources.HOST, proxyPort, Resources.USERNAME, Resources.PASSWORD,
  120. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  121. Assert.AreEqual(proxyPort, connectionInfo.ProxyPort);
  122. }
  123. [TestMethod]
  124. [TestCategory("ConnectionInfo")]
  125. public void ConstructorShouldNotThrowExceptionWhenProxyTypesIsNotNoneAndProxyUsernameIsNull()
  126. {
  127. const string proxyUsername = null;
  128. var connectionInfo = new ConnectionInfo(Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME, ProxyTypes.Http,
  129. Resources.PROXY_HOST, int.Parse(Resources.PORT), proxyUsername, Resources.PASSWORD,
  130. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  131. Assert.IsNull(connectionInfo.ProxyUsername);
  132. }
  133. [TestMethod]
  134. [TestCategory("ConnectionInfo")]
  135. public void ConstructorShouldThrowArgumentNullExceptionhenHostIsNull()
  136. {
  137. try
  138. {
  139. _ = new ConnectionInfo(null,
  140. int.Parse(Resources.PORT),
  141. Resources.USERNAME,
  142. ProxyTypes.None,
  143. Resources.HOST,
  144. int.Parse(Resources.PORT),
  145. Resources.USERNAME,
  146. Resources.PASSWORD,
  147. null);
  148. }
  149. catch (ArgumentNullException ex)
  150. {
  151. Assert.IsNull(ex.InnerException);
  152. Assert.AreEqual("host", ex.ParamName);
  153. }
  154. }
  155. [TestMethod]
  156. [TestCategory("ConnectionInfo")]
  157. public void ConstructorShouldNotThrowExceptionWhenHostIsEmpty()
  158. {
  159. var host = string.Empty;
  160. var connectionInfo = new ConnectionInfo(host, int.Parse(Resources.PORT), Resources.USERNAME, ProxyTypes.None,
  161. Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME, Resources.PASSWORD,
  162. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  163. Assert.AreSame(host, connectionInfo.Host);
  164. }
  165. [TestMethod]
  166. [TestCategory("ConnectionInfo")]
  167. public void ConstructorShouldNotThrowExceptionWhenHostIsInvalidDnsName()
  168. {
  169. const string host = "in_valid_host.";
  170. var connectionInfo = new ConnectionInfo(host, int.Parse(Resources.PORT), Resources.USERNAME, ProxyTypes.None,
  171. Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME, Resources.PASSWORD,
  172. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  173. Assert.AreSame(host, connectionInfo.Host);
  174. }
  175. [TestMethod]
  176. [TestCategory("ConnectionInfo")]
  177. public void Test_ConnectionInfo_Host_Valid()
  178. {
  179. var host = new Random().Next().ToString(CultureInfo.InvariantCulture);
  180. var connectionInfo = new ConnectionInfo(host, int.Parse(Resources.PORT), Resources.USERNAME,
  181. ProxyTypes.None, Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME, Resources.PASSWORD,
  182. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  183. Assert.AreSame(host, connectionInfo.Host);
  184. }
  185. [TestMethod]
  186. [TestCategory("ConnectionInfo")]
  187. public void ConstructorShouldThrowArgumentOutOfRangeExceptionWhenPortIsGreaterThanMaximumValue()
  188. {
  189. const int port = IPEndPoint.MaxPort + 1;
  190. try
  191. {
  192. _ = new ConnectionInfo(Resources.HOST,
  193. port,
  194. Resources.USERNAME,
  195. ProxyTypes.None,
  196. Resources.HOST,
  197. int.Parse(Resources.PORT),
  198. Resources.USERNAME,
  199. Resources.PASSWORD,
  200. null);
  201. Assert.Fail();
  202. }
  203. catch (ArgumentOutOfRangeException ex)
  204. {
  205. Assert.IsNull(ex.InnerException);
  206. Assert.AreEqual("port", ex.ParamName);
  207. }
  208. }
  209. [TestMethod]
  210. [TestCategory("ConnectionInfo")]
  211. public void ConstructorShouldThrowArgumentOutOfRangeExceptionWhenPortIsLessThanMinimumValue()
  212. {
  213. const int port = IPEndPoint.MinPort - 1;
  214. try
  215. {
  216. _ = new ConnectionInfo(Resources.HOST,
  217. port,
  218. Resources.USERNAME,
  219. ProxyTypes.None,
  220. Resources.HOST,
  221. int.Parse(Resources.PORT),
  222. Resources.USERNAME,
  223. Resources.PASSWORD,
  224. null);
  225. Assert.Fail();
  226. }
  227. catch (ArgumentOutOfRangeException ex)
  228. {
  229. Assert.IsNull(ex.InnerException);
  230. Assert.AreEqual("port", ex.ParamName);
  231. }
  232. }
  233. [TestMethod]
  234. [TestCategory("ConnectionInfo")]
  235. public void Test_ConnectionInfo_Port_Valid()
  236. {
  237. var port = new Random().Next(IPEndPoint.MinPort, IPEndPoint.MaxPort);
  238. var connectionInfo = new ConnectionInfo(Resources.HOST, port, Resources.USERNAME, ProxyTypes.None,
  239. Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME, Resources.PASSWORD,
  240. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  241. Assert.AreEqual(port, connectionInfo.Port);
  242. }
  243. [TestMethod]
  244. [TestCategory("ConnectionInfo")]
  245. public void ConstructorShouldThrowArgumentExceptionhenUsernameIsNull()
  246. {
  247. const string username = null;
  248. try
  249. {
  250. _ = new ConnectionInfo(Resources.HOST,
  251. int.Parse(Resources.PORT),
  252. username,
  253. ProxyTypes.Http,
  254. Resources.USERNAME,
  255. int.Parse(Resources.PORT),
  256. Resources.USERNAME,
  257. Resources.PASSWORD,
  258. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  259. Assert.Fail();
  260. }
  261. catch (ArgumentNullException ex)
  262. {
  263. Assert.IsNull(ex.InnerException);
  264. Assert.AreEqual("username", ex.ParamName);
  265. }
  266. }
  267. [TestMethod]
  268. [TestCategory("ConnectionInfo")]
  269. public void ConstructorShouldThrowArgumentExceptionhenUsernameIsEmpty()
  270. {
  271. var username = string.Empty;
  272. try
  273. {
  274. _ = new ConnectionInfo(Resources.HOST,
  275. int.Parse(Resources.PORT),
  276. username,
  277. ProxyTypes.Http,
  278. Resources.USERNAME,
  279. int.Parse(Resources.PORT),
  280. Resources.USERNAME,
  281. Resources.PASSWORD,
  282. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  283. Assert.Fail();
  284. }
  285. catch (ArgumentException ex)
  286. {
  287. Assert.AreEqual(typeof(ArgumentException), ex.GetType());
  288. Assert.IsNull(ex.InnerException);
  289. Assert.AreEqual("username", ex.ParamName);
  290. }
  291. }
  292. [TestMethod]
  293. [TestCategory("ConnectionInfo")]
  294. public void ConstructorShouldThrowArgumentExceptionhenUsernameContainsOnlyWhitespace()
  295. {
  296. const string username = " \t\r";
  297. try
  298. {
  299. _ = new ConnectionInfo(Resources.HOST,
  300. int.Parse(Resources.PORT),
  301. username,
  302. ProxyTypes.Http,
  303. Resources.USERNAME,
  304. int.Parse(Resources.PORT),
  305. Resources.USERNAME,
  306. Resources.PASSWORD,
  307. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  308. Assert.Fail();
  309. }
  310. catch (ArgumentException ex)
  311. {
  312. Assert.AreEqual(typeof (ArgumentException), ex.GetType());
  313. Assert.IsNull(ex.InnerException);
  314. Assert.AreEqual("username", ex.ParamName);
  315. }
  316. }
  317. [TestMethod]
  318. [TestCategory("ConnectionInfo")]
  319. public void ConstructorShouldThrowArgumentNullExceptionWhenAuthenticationMethodsIsNull()
  320. {
  321. try
  322. {
  323. _ = new ConnectionInfo(Resources.HOST,
  324. int.Parse(Resources.PORT),
  325. Resources.USERNAME,
  326. ProxyTypes.None,
  327. Resources.HOST,
  328. int.Parse(Resources.PORT),
  329. Resources.USERNAME,
  330. Resources.PASSWORD,
  331. null);
  332. Assert.Fail();
  333. }
  334. catch (ArgumentNullException ex)
  335. {
  336. Assert.IsNull(ex.InnerException);
  337. Assert.AreEqual("authenticationMethods", ex.ParamName);
  338. }
  339. }
  340. [TestMethod]
  341. [TestCategory("ConnectionInfo")]
  342. public void ConstructorShouldThrowArgumentNullExceptionWhenAuthenticationMethodsIsZeroLength()
  343. {
  344. try
  345. {
  346. _ = new ConnectionInfo(Resources.HOST,
  347. int.Parse(Resources.PORT),
  348. Resources.USERNAME,
  349. ProxyTypes.None,
  350. Resources.HOST,
  351. int.Parse(Resources.PORT),
  352. Resources.USERNAME,
  353. Resources.PASSWORD,
  354. new AuthenticationMethod[0]);
  355. Assert.Fail();
  356. }
  357. catch (ArgumentException ex)
  358. {
  359. Assert.IsNull(ex.InnerException);
  360. Assert.AreEqual("authenticationMethods", ex.ParamName);
  361. }
  362. }
  363. [TestMethod]
  364. [TestCategory("ConnectionInfo")]
  365. public void AuthenticateShouldThrowArgumentNullExceptionWhenServiceFactoryIsNull()
  366. {
  367. var connectionInfo = new ConnectionInfo(Resources.HOST,
  368. int.Parse(Resources.PORT),
  369. Resources.USERNAME,
  370. ProxyTypes.None,
  371. Resources.HOST,
  372. int.Parse(Resources.PORT),
  373. Resources.USERNAME,
  374. Resources.PASSWORD,
  375. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  376. var session = new Mock<ISession>(MockBehavior.Strict).Object;
  377. const IServiceFactory serviceFactory = null;
  378. try
  379. {
  380. connectionInfo.Authenticate(session, serviceFactory);
  381. Assert.Fail();
  382. }
  383. catch (ArgumentNullException ex)
  384. {
  385. Assert.IsNull(ex.InnerException);
  386. Assert.AreEqual("serviceFactory", ex.ParamName);
  387. }
  388. }
  389. }
  390. }