SshCommandTest.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. using System.Diagnostics;
  2. using Renci.SshNet.Common;
  3. namespace Renci.SshNet.IntegrationTests.OldIntegrationTests
  4. {
  5. /// <summary>
  6. /// Represents SSH command that can be executed.
  7. /// </summary>
  8. [TestClass]
  9. public class SshCommandTest : IntegrationTestBase
  10. {
  11. [TestMethod]
  12. public void Test_Run_SingleCommand()
  13. {
  14. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  15. {
  16. #region Example SshCommand RunCommand Result
  17. client.Connect();
  18. var testValue = Guid.NewGuid().ToString();
  19. var command = client.RunCommand(string.Format("echo {0}", testValue));
  20. var result = command.Result;
  21. result = result.Substring(0, result.Length - 1); // Remove \n character returned by command
  22. client.Disconnect();
  23. #endregion
  24. Assert.IsTrue(result.Equals(testValue));
  25. }
  26. }
  27. [TestMethod]
  28. public void Test_Execute_SingleCommand()
  29. {
  30. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  31. {
  32. #region Example SshCommand CreateCommand Execute
  33. client.Connect();
  34. var testValue = Guid.NewGuid().ToString();
  35. var command = string.Format("echo {0}", testValue);
  36. var cmd = client.CreateCommand(command);
  37. var result = cmd.Execute();
  38. result = result.Substring(0, result.Length - 1); // Remove \n character returned by command
  39. client.Disconnect();
  40. #endregion
  41. Assert.IsTrue(result.Equals(testValue));
  42. }
  43. }
  44. [TestMethod]
  45. [Timeout(5000)]
  46. public void Test_CancelAsync_Unfinished_Command()
  47. {
  48. using var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password);
  49. #region Example SshCommand CancelAsync Unfinished Command Without Sending exit-signal
  50. client.Connect();
  51. var testValue = Guid.NewGuid().ToString();
  52. var command = $"sleep 15s; echo {testValue}";
  53. using var cmd = client.CreateCommand(command);
  54. var asyncResult = cmd.BeginExecute();
  55. cmd.CancelAsync();
  56. Assert.ThrowsException<OperationCanceledException>(() => cmd.EndExecute(asyncResult));
  57. Assert.IsTrue(asyncResult.IsCompleted);
  58. client.Disconnect();
  59. Assert.AreEqual(string.Empty, cmd.Result.Trim());
  60. #endregion
  61. }
  62. [TestMethod]
  63. public async Task Test_CancelAsync_Finished_Command()
  64. {
  65. using var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password);
  66. #region Example SshCommand CancelAsync Finished Command
  67. client.Connect();
  68. var testValue = Guid.NewGuid().ToString();
  69. var command = $"echo {testValue}";
  70. using var cmd = client.CreateCommand(command);
  71. var asyncResult = cmd.BeginExecute();
  72. while (!asyncResult.IsCompleted)
  73. {
  74. await Task.Delay(200);
  75. }
  76. cmd.CancelAsync();
  77. cmd.EndExecute(asyncResult);
  78. client.Disconnect();
  79. Assert.IsTrue(asyncResult.IsCompleted);
  80. Assert.AreEqual(testValue, cmd.Result.Trim());
  81. #endregion
  82. }
  83. [TestMethod]
  84. public void Test_Execute_OutputStream()
  85. {
  86. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  87. {
  88. #region Example SshCommand CreateCommand Execute OutputStream
  89. client.Connect();
  90. var cmd = client.CreateCommand("ls -l"); // very long list
  91. var asynch = cmd.BeginExecute();
  92. var reader = new StreamReader(cmd.OutputStream);
  93. while (!asynch.IsCompleted)
  94. {
  95. var result = reader.ReadToEnd();
  96. if (string.IsNullOrEmpty(result))
  97. {
  98. continue;
  99. }
  100. Console.Write(result);
  101. }
  102. _ = cmd.EndExecute(asynch);
  103. client.Disconnect();
  104. #endregion
  105. Assert.Inconclusive();
  106. }
  107. }
  108. [TestMethod]
  109. public void Test_Execute_ExtendedOutputStream()
  110. {
  111. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  112. {
  113. #region Example SshCommand CreateCommand Execute ExtendedOutputStream
  114. client.Connect();
  115. var cmd = client.CreateCommand("echo 12345; echo 654321 >&2");
  116. var result = cmd.Execute();
  117. Console.Write(result);
  118. var reader = new StreamReader(cmd.ExtendedOutputStream);
  119. Console.WriteLine("DEBUG:");
  120. Console.Write(reader.ReadToEnd());
  121. client.Disconnect();
  122. #endregion
  123. Assert.Inconclusive();
  124. }
  125. }
  126. [TestMethod]
  127. [ExpectedException(typeof(SshOperationTimeoutException))]
  128. public void Test_Execute_Timeout()
  129. {
  130. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  131. {
  132. #region Example SshCommand CreateCommand Execute CommandTimeout
  133. client.Connect();
  134. var cmd = client.CreateCommand("sleep 10s");
  135. cmd.CommandTimeout = TimeSpan.FromSeconds(5);
  136. cmd.Execute();
  137. client.Disconnect();
  138. #endregion
  139. }
  140. }
  141. [TestMethod]
  142. public void Test_Execute_Infinite_Timeout()
  143. {
  144. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  145. {
  146. client.Connect();
  147. var cmd = client.CreateCommand("sleep 10s");
  148. cmd.Execute();
  149. client.Disconnect();
  150. }
  151. }
  152. [TestMethod]
  153. public void Test_Execute_InvalidCommand()
  154. {
  155. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  156. {
  157. client.Connect();
  158. var cmd = client.CreateCommand(";");
  159. cmd.Execute();
  160. if (string.IsNullOrEmpty(cmd.Error))
  161. {
  162. Assert.Fail("Operation should fail");
  163. }
  164. Assert.IsTrue(cmd.ExitStatus > 0);
  165. client.Disconnect();
  166. }
  167. }
  168. [TestMethod]
  169. public void Test_Execute_InvalidCommand_Then_Execute_ValidCommand()
  170. {
  171. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  172. {
  173. client.Connect();
  174. var cmd = client.CreateCommand(";");
  175. cmd.Execute();
  176. if (string.IsNullOrEmpty(cmd.Error))
  177. {
  178. Assert.Fail("Operation should fail");
  179. }
  180. Assert.IsTrue(cmd.ExitStatus > 0);
  181. var result = ExecuteTestCommand(client);
  182. client.Disconnect();
  183. Assert.IsTrue(result);
  184. }
  185. }
  186. [TestMethod]
  187. public void Test_Execute_Command_with_ExtendedOutput()
  188. {
  189. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  190. {
  191. client.Connect();
  192. var cmd = client.CreateCommand("echo 12345; echo 654321 >&2");
  193. cmd.Execute();
  194. //var extendedData = Encoding.ASCII.GetString(cmd.ExtendedOutputStream.ToArray());
  195. var extendedData = new StreamReader(cmd.ExtendedOutputStream, Encoding.ASCII).ReadToEnd();
  196. client.Disconnect();
  197. Assert.AreEqual("12345\n", cmd.Result);
  198. Assert.AreEqual("654321\n", extendedData);
  199. }
  200. }
  201. [TestMethod]
  202. public void Test_Execute_Command_Reconnect_Execute_Command()
  203. {
  204. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  205. {
  206. client.Connect();
  207. var result = ExecuteTestCommand(client);
  208. Assert.IsTrue(result);
  209. client.Disconnect();
  210. client.Connect();
  211. result = ExecuteTestCommand(client);
  212. Assert.IsTrue(result);
  213. client.Disconnect();
  214. }
  215. }
  216. [TestMethod]
  217. public void Test_Execute_Command_ExitStatus()
  218. {
  219. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  220. {
  221. #region Example SshCommand RunCommand ExitStatus
  222. client.Connect();
  223. var cmd = client.RunCommand("exit 128");
  224. Console.WriteLine(cmd.ExitStatus);
  225. client.Disconnect();
  226. #endregion
  227. Assert.IsTrue(cmd.ExitStatus == 128);
  228. }
  229. }
  230. [TestMethod]
  231. public void Test_Execute_Command_Asynchronously()
  232. {
  233. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  234. {
  235. client.Connect();
  236. var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  237. var asyncResult = cmd.BeginExecute(null, null);
  238. while (!asyncResult.IsCompleted)
  239. {
  240. Thread.Sleep(100);
  241. }
  242. cmd.EndExecute(asyncResult);
  243. Assert.IsTrue(cmd.Result == "test\n");
  244. client.Disconnect();
  245. }
  246. }
  247. [TestMethod]
  248. public void Test_Execute_Command_Asynchronously_With_Error()
  249. {
  250. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  251. {
  252. client.Connect();
  253. var cmd = client.CreateCommand("sleep 5s; ;");
  254. var asyncResult = cmd.BeginExecute(null, null);
  255. while (!asyncResult.IsCompleted)
  256. {
  257. Thread.Sleep(100);
  258. }
  259. cmd.EndExecute(asyncResult);
  260. Assert.IsFalse(string.IsNullOrEmpty(cmd.Error));
  261. client.Disconnect();
  262. }
  263. }
  264. [TestMethod]
  265. public void Test_Execute_Command_Asynchronously_With_Callback()
  266. {
  267. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  268. {
  269. client.Connect();
  270. using var callbackCalled = new ManualResetEventSlim();
  271. using var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  272. var asyncResult = cmd.BeginExecute(new AsyncCallback((s) =>
  273. {
  274. callbackCalled.Set();
  275. }), null);
  276. cmd.EndExecute(asyncResult);
  277. Assert.IsTrue(callbackCalled.Wait(TimeSpan.FromSeconds(1)));
  278. client.Disconnect();
  279. }
  280. }
  281. [TestMethod]
  282. public void Test_Execute_Command_Asynchronously_With_Callback_On_Different_Thread()
  283. {
  284. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  285. {
  286. client.Connect();
  287. var currentThreadId = Thread.CurrentThread.ManagedThreadId;
  288. int callbackThreadId = 0;
  289. using var callbackCalled = new ManualResetEventSlim();
  290. using var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  291. var asyncResult = cmd.BeginExecute(new AsyncCallback((s) =>
  292. {
  293. callbackThreadId = Thread.CurrentThread.ManagedThreadId;
  294. callbackCalled.Set();
  295. }), null);
  296. cmd.EndExecute(asyncResult);
  297. Assert.IsTrue(callbackCalled.Wait(TimeSpan.FromSeconds(1)));
  298. Assert.AreNotEqual(currentThreadId, callbackThreadId);
  299. client.Disconnect();
  300. }
  301. }
  302. /// <summary>
  303. /// Tests for Issue 563.
  304. /// </summary>
  305. [WorkItem(563), TestMethod]
  306. public void Test_Execute_Command_Same_Object_Different_Commands()
  307. {
  308. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  309. {
  310. client.Connect();
  311. var cmd = client.CreateCommand("echo 12345");
  312. cmd.Execute();
  313. Assert.AreEqual("12345\n", cmd.Result);
  314. cmd.Execute("echo 23456");
  315. Assert.AreEqual("23456\n", cmd.Result);
  316. client.Disconnect();
  317. }
  318. }
  319. [TestMethod]
  320. public void Test_Get_Result_Without_Execution()
  321. {
  322. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  323. {
  324. client.Connect();
  325. var cmd = client.CreateCommand("ls -l");
  326. Assert.IsTrue(string.IsNullOrEmpty(cmd.Result));
  327. client.Disconnect();
  328. }
  329. }
  330. [TestMethod]
  331. public void Test_Get_Error_Without_Execution()
  332. {
  333. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  334. {
  335. client.Connect();
  336. var cmd = client.CreateCommand("ls -l");
  337. Assert.IsTrue(string.IsNullOrEmpty(cmd.Error));
  338. client.Disconnect();
  339. }
  340. }
  341. [WorkItem(703), TestMethod]
  342. [ExpectedException(typeof(ArgumentNullException))]
  343. public void Test_EndExecute_Before_BeginExecute()
  344. {
  345. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  346. {
  347. client.Connect();
  348. var cmd = client.CreateCommand("ls -l");
  349. cmd.EndExecute(null);
  350. client.Disconnect();
  351. }
  352. }
  353. /// <summary>
  354. ///A test for BeginExecute
  355. ///</summary>
  356. [TestMethod()]
  357. public void BeginExecuteTest()
  358. {
  359. string expected = "123\n";
  360. string result;
  361. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  362. {
  363. #region Example SshCommand CreateCommand BeginExecute IsCompleted EndExecute
  364. client.Connect();
  365. var cmd = client.CreateCommand("sleep 15s;echo 123"); // Perform long running task
  366. var asynch = cmd.BeginExecute();
  367. while (!asynch.IsCompleted)
  368. {
  369. // Waiting for command to complete...
  370. Thread.Sleep(2000);
  371. }
  372. result = cmd.EndExecute(asynch);
  373. client.Disconnect();
  374. #endregion
  375. Assert.IsNotNull(asynch);
  376. Assert.AreEqual(expected, result);
  377. }
  378. }
  379. [TestMethod]
  380. public void Test_Execute_Invalid_Command()
  381. {
  382. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  383. {
  384. #region Example SshCommand CreateCommand Error
  385. client.Connect();
  386. var cmd = client.CreateCommand(";");
  387. cmd.Execute();
  388. if (!string.IsNullOrEmpty(cmd.Error))
  389. {
  390. Console.WriteLine(cmd.Error);
  391. }
  392. client.Disconnect();
  393. #endregion
  394. Assert.Inconclusive();
  395. }
  396. }
  397. [TestMethod]
  398. public void Test_MultipleThread_100_MultipleConnections()
  399. {
  400. try
  401. {
  402. var options = new ParallelOptions()
  403. {
  404. MaxDegreeOfParallelism = 8
  405. };
  406. Parallel.For(0, 100, options,
  407. () =>
  408. {
  409. var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password);
  410. client.Connect();
  411. return client;
  412. },
  413. (int counter, ParallelLoopState pls, SshClient client) =>
  414. {
  415. var result = ExecuteTestCommand(client);
  416. Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter));
  417. Assert.IsTrue(result);
  418. return client;
  419. },
  420. (SshClient client) =>
  421. {
  422. client.Disconnect();
  423. client.Dispose();
  424. }
  425. );
  426. }
  427. catch (Exception exp)
  428. {
  429. Assert.Fail(exp.ToString());
  430. }
  431. }
  432. [TestMethod]
  433. public void Test_MultipleThread_100_MultipleSessions()
  434. {
  435. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  436. {
  437. client.Connect();
  438. Parallel.For(0, 100,
  439. (counter) =>
  440. {
  441. var result = ExecuteTestCommand(client);
  442. Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter));
  443. Assert.IsTrue(result);
  444. }
  445. );
  446. client.Disconnect();
  447. }
  448. }
  449. private static bool ExecuteTestCommand(SshClient s)
  450. {
  451. var testValue = Guid.NewGuid().ToString();
  452. var command = string.Format("echo {0}", testValue);
  453. var cmd = s.CreateCommand(command);
  454. var result = cmd.Execute();
  455. result = result.Substring(0, result.Length - 1); // Remove \n character returned by command
  456. return result.Equals(testValue);
  457. }
  458. }
  459. }