2
0

ConnectionInfoTest.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. using System;
  2. using System.Globalization;
  3. using System.Net;
  4. using Microsoft.VisualStudio.TestTools.UnitTesting;
  5. using Moq;
  6. using Renci.SshNet.Tests.Common;
  7. using Renci.SshNet.Tests.Properties;
  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 ConstructorShouldNotThrowExceptionWhenProxyTypesIsNoneAndProxyHostIsNull()
  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 ConstructorShouldThrowArgumentNullExceptionWhenProxyTypesIsNotNoneAndProxyHostIsNull()
  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 ConstructorShouldThrowArgumentNullExceptionWhenHostIsNull()
  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 Test_ConnectionInfo_Timeout_Valid()
  246. {
  247. var connectionInfo = new ConnectionInfo(Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME, ProxyTypes.None,
  248. Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME,
  249. Resources.PASSWORD, new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  250. try
  251. {
  252. connectionInfo.Timeout = TimeSpan.FromMilliseconds(-2);
  253. }
  254. catch (ArgumentOutOfRangeException ex)
  255. {
  256. Assert.IsNull(ex.InnerException);
  257. ArgumentExceptionAssert.MessageEquals("The timeout must represent a value between -1 and Int32.MaxValue milliseconds, inclusive.", ex);
  258. Assert.AreEqual("Timeout", ex.ParamName);
  259. }
  260. connectionInfo.Timeout = TimeSpan.FromMilliseconds(-1);
  261. Assert.AreEqual(connectionInfo.Timeout, TimeSpan.FromMilliseconds(-1));
  262. connectionInfo.Timeout = TimeSpan.FromMilliseconds(int.MaxValue);
  263. Assert.AreEqual(connectionInfo.Timeout, TimeSpan.FromMilliseconds(int.MaxValue));
  264. try
  265. {
  266. connectionInfo.Timeout = TimeSpan.FromMilliseconds((double)int.MaxValue + 1);
  267. }
  268. catch (ArgumentOutOfRangeException ex)
  269. {
  270. Assert.IsNull(ex.InnerException);
  271. ArgumentExceptionAssert.MessageEquals("The timeout must represent a value between -1 and Int32.MaxValue milliseconds, inclusive.", ex);
  272. Assert.AreEqual("Timeout", ex.ParamName);
  273. }
  274. }
  275. [TestMethod]
  276. [TestCategory("ConnectionInfo")]
  277. public void Test_ConnectionInfo_ChannelCloseTimeout_Valid()
  278. {
  279. var connectionInfo = new ConnectionInfo(Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME, ProxyTypes.None,
  280. Resources.HOST, int.Parse(Resources.PORT), Resources.USERNAME,
  281. Resources.PASSWORD, new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  282. try
  283. {
  284. connectionInfo.ChannelCloseTimeout = TimeSpan.FromMilliseconds(-2);
  285. }
  286. catch (ArgumentOutOfRangeException ex)
  287. {
  288. Assert.IsNull(ex.InnerException);
  289. ArgumentExceptionAssert.MessageEquals("The timeout must represent a value between -1 and Int32.MaxValue milliseconds, inclusive.", ex);
  290. Assert.AreEqual("ChannelCloseTimeout", ex.ParamName);
  291. }
  292. connectionInfo.ChannelCloseTimeout = TimeSpan.FromMilliseconds(-1);
  293. Assert.AreEqual(connectionInfo.ChannelCloseTimeout, TimeSpan.FromMilliseconds(-1));
  294. connectionInfo.ChannelCloseTimeout = TimeSpan.FromMilliseconds(int.MaxValue);
  295. Assert.AreEqual(connectionInfo.ChannelCloseTimeout, TimeSpan.FromMilliseconds(int.MaxValue));
  296. try
  297. {
  298. connectionInfo.ChannelCloseTimeout = TimeSpan.FromMilliseconds((double)int.MaxValue + 1);
  299. }
  300. catch (ArgumentOutOfRangeException ex)
  301. {
  302. Assert.IsNull(ex.InnerException);
  303. ArgumentExceptionAssert.MessageEquals("The timeout must represent a value between -1 and Int32.MaxValue milliseconds, inclusive.", ex);
  304. Assert.AreEqual("ChannelCloseTimeout", ex.ParamName);
  305. }
  306. }
  307. [TestMethod]
  308. [TestCategory("ConnectionInfo")]
  309. public void ConstructorShouldThrowArgumentExceptionWhenUsernameIsNull()
  310. {
  311. const string username = null;
  312. try
  313. {
  314. _ = new ConnectionInfo(Resources.HOST,
  315. int.Parse(Resources.PORT),
  316. username,
  317. ProxyTypes.Http,
  318. Resources.USERNAME,
  319. int.Parse(Resources.PORT),
  320. Resources.USERNAME,
  321. Resources.PASSWORD,
  322. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  323. Assert.Fail();
  324. }
  325. catch (ArgumentNullException ex)
  326. {
  327. Assert.IsNull(ex.InnerException);
  328. Assert.AreEqual("username", ex.ParamName);
  329. }
  330. }
  331. [TestMethod]
  332. [TestCategory("ConnectionInfo")]
  333. public void ConstructorShouldThrowArgumentExceptionWhenUsernameIsEmpty()
  334. {
  335. var username = string.Empty;
  336. try
  337. {
  338. _ = new ConnectionInfo(Resources.HOST,
  339. int.Parse(Resources.PORT),
  340. username,
  341. ProxyTypes.Http,
  342. Resources.USERNAME,
  343. int.Parse(Resources.PORT),
  344. Resources.USERNAME,
  345. Resources.PASSWORD,
  346. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  347. Assert.Fail();
  348. }
  349. catch (ArgumentException ex)
  350. {
  351. Assert.AreEqual(typeof(ArgumentException), ex.GetType());
  352. Assert.IsNull(ex.InnerException);
  353. Assert.AreEqual("username", ex.ParamName);
  354. }
  355. }
  356. [TestMethod]
  357. [TestCategory("ConnectionInfo")]
  358. public void ConstructorShouldThrowArgumentExceptionWhenUsernameContainsOnlyWhitespace()
  359. {
  360. const string username = " \t\r";
  361. try
  362. {
  363. _ = new ConnectionInfo(Resources.HOST,
  364. int.Parse(Resources.PORT),
  365. username,
  366. ProxyTypes.Http,
  367. Resources.USERNAME,
  368. int.Parse(Resources.PORT),
  369. Resources.USERNAME,
  370. Resources.PASSWORD,
  371. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  372. Assert.Fail();
  373. }
  374. catch (ArgumentException ex)
  375. {
  376. Assert.AreEqual(typeof(ArgumentException), ex.GetType());
  377. Assert.IsNull(ex.InnerException);
  378. Assert.AreEqual("username", ex.ParamName);
  379. }
  380. }
  381. [TestMethod]
  382. [TestCategory("ConnectionInfo")]
  383. public void ConstructorShouldThrowArgumentNullExceptionWhenAuthenticationMethodsIsNull()
  384. {
  385. try
  386. {
  387. _ = new ConnectionInfo(Resources.HOST,
  388. int.Parse(Resources.PORT),
  389. Resources.USERNAME,
  390. ProxyTypes.None,
  391. Resources.HOST,
  392. int.Parse(Resources.PORT),
  393. Resources.USERNAME,
  394. Resources.PASSWORD,
  395. null);
  396. Assert.Fail();
  397. }
  398. catch (ArgumentNullException ex)
  399. {
  400. Assert.IsNull(ex.InnerException);
  401. Assert.AreEqual("authenticationMethods", ex.ParamName);
  402. }
  403. }
  404. [TestMethod]
  405. [TestCategory("ConnectionInfo")]
  406. public void ConstructorShouldThrowArgumentNullExceptionWhenAuthenticationMethodsIsZeroLength()
  407. {
  408. try
  409. {
  410. _ = new ConnectionInfo(Resources.HOST,
  411. int.Parse(Resources.PORT),
  412. Resources.USERNAME,
  413. ProxyTypes.None,
  414. Resources.HOST,
  415. int.Parse(Resources.PORT),
  416. Resources.USERNAME,
  417. Resources.PASSWORD,
  418. new AuthenticationMethod[0]);
  419. Assert.Fail();
  420. }
  421. catch (ArgumentException ex)
  422. {
  423. Assert.IsNull(ex.InnerException);
  424. Assert.AreEqual("authenticationMethods", ex.ParamName);
  425. }
  426. }
  427. [TestMethod]
  428. [TestCategory("ConnectionInfo")]
  429. public void AuthenticateShouldThrowArgumentNullExceptionWhenServiceFactoryIsNull()
  430. {
  431. var connectionInfo = new ConnectionInfo(Resources.HOST,
  432. int.Parse(Resources.PORT),
  433. Resources.USERNAME,
  434. ProxyTypes.None,
  435. Resources.HOST,
  436. int.Parse(Resources.PORT),
  437. Resources.USERNAME,
  438. Resources.PASSWORD,
  439. new KeyboardInteractiveAuthenticationMethod(Resources.USERNAME));
  440. var session = new Mock<ISession>(MockBehavior.Strict).Object;
  441. const IServiceFactory serviceFactory = null;
  442. try
  443. {
  444. connectionInfo.Authenticate(session, serviceFactory);
  445. Assert.Fail();
  446. }
  447. catch (ArgumentNullException ex)
  448. {
  449. Assert.IsNull(ex.InnerException);
  450. Assert.AreEqual("serviceFactory", ex.ParamName);
  451. }
  452. }
  453. }
  454. }