2
0

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. var callbackCalled = false;
  271. var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  272. var asyncResult = cmd.BeginExecute(new AsyncCallback((s) =>
  273. {
  274. callbackCalled = true;
  275. }), null);
  276. cmd.EndExecute(asyncResult);
  277. Thread.Sleep(100);
  278. Assert.IsTrue(callbackCalled);
  279. client.Disconnect();
  280. }
  281. }
  282. [TestMethod]
  283. public void Test_Execute_Command_Asynchronously_With_Callback_On_Different_Thread()
  284. {
  285. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  286. {
  287. client.Connect();
  288. var currentThreadId = Thread.CurrentThread.ManagedThreadId;
  289. int callbackThreadId = 0;
  290. var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  291. var asyncResult = cmd.BeginExecute(new AsyncCallback((s) =>
  292. {
  293. callbackThreadId = Thread.CurrentThread.ManagedThreadId;
  294. }), null);
  295. cmd.EndExecute(asyncResult);
  296. Thread.Sleep(100);
  297. Assert.AreNotEqual(currentThreadId, callbackThreadId);
  298. client.Disconnect();
  299. }
  300. }
  301. /// <summary>
  302. /// Tests for Issue 563.
  303. /// </summary>
  304. [WorkItem(563), TestMethod]
  305. public void Test_Execute_Command_Same_Object_Different_Commands()
  306. {
  307. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  308. {
  309. client.Connect();
  310. var cmd = client.CreateCommand("echo 12345");
  311. cmd.Execute();
  312. Assert.AreEqual("12345\n", cmd.Result);
  313. cmd.Execute("echo 23456");
  314. Assert.AreEqual("23456\n", cmd.Result);
  315. client.Disconnect();
  316. }
  317. }
  318. [TestMethod]
  319. public void Test_Get_Result_Without_Execution()
  320. {
  321. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  322. {
  323. client.Connect();
  324. var cmd = client.CreateCommand("ls -l");
  325. Assert.IsTrue(string.IsNullOrEmpty(cmd.Result));
  326. client.Disconnect();
  327. }
  328. }
  329. [TestMethod]
  330. public void Test_Get_Error_Without_Execution()
  331. {
  332. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  333. {
  334. client.Connect();
  335. var cmd = client.CreateCommand("ls -l");
  336. Assert.IsTrue(string.IsNullOrEmpty(cmd.Error));
  337. client.Disconnect();
  338. }
  339. }
  340. [WorkItem(703), TestMethod]
  341. [ExpectedException(typeof(ArgumentNullException))]
  342. public void Test_EndExecute_Before_BeginExecute()
  343. {
  344. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  345. {
  346. client.Connect();
  347. var cmd = client.CreateCommand("ls -l");
  348. cmd.EndExecute(null);
  349. client.Disconnect();
  350. }
  351. }
  352. /// <summary>
  353. ///A test for BeginExecute
  354. ///</summary>
  355. [TestMethod()]
  356. public void BeginExecuteTest()
  357. {
  358. string expected = "123\n";
  359. string result;
  360. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  361. {
  362. #region Example SshCommand CreateCommand BeginExecute IsCompleted EndExecute
  363. client.Connect();
  364. var cmd = client.CreateCommand("sleep 15s;echo 123"); // Perform long running task
  365. var asynch = cmd.BeginExecute();
  366. while (!asynch.IsCompleted)
  367. {
  368. // Waiting for command to complete...
  369. Thread.Sleep(2000);
  370. }
  371. result = cmd.EndExecute(asynch);
  372. client.Disconnect();
  373. #endregion
  374. Assert.IsNotNull(asynch);
  375. Assert.AreEqual(expected, result);
  376. }
  377. }
  378. [TestMethod]
  379. public void Test_Execute_Invalid_Command()
  380. {
  381. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  382. {
  383. #region Example SshCommand CreateCommand Error
  384. client.Connect();
  385. var cmd = client.CreateCommand(";");
  386. cmd.Execute();
  387. if (!string.IsNullOrEmpty(cmd.Error))
  388. {
  389. Console.WriteLine(cmd.Error);
  390. }
  391. client.Disconnect();
  392. #endregion
  393. Assert.Inconclusive();
  394. }
  395. }
  396. [TestMethod]
  397. public void Test_MultipleThread_100_MultipleConnections()
  398. {
  399. try
  400. {
  401. var options = new ParallelOptions()
  402. {
  403. MaxDegreeOfParallelism = 8
  404. };
  405. Parallel.For(0, 100, options,
  406. () =>
  407. {
  408. var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password);
  409. client.Connect();
  410. return client;
  411. },
  412. (int counter, ParallelLoopState pls, SshClient client) =>
  413. {
  414. var result = ExecuteTestCommand(client);
  415. Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter));
  416. Assert.IsTrue(result);
  417. return client;
  418. },
  419. (SshClient client) =>
  420. {
  421. client.Disconnect();
  422. client.Dispose();
  423. }
  424. );
  425. }
  426. catch (Exception exp)
  427. {
  428. Assert.Fail(exp.ToString());
  429. }
  430. }
  431. [TestMethod]
  432. public void Test_MultipleThread_100_MultipleSessions()
  433. {
  434. using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password))
  435. {
  436. client.Connect();
  437. Parallel.For(0, 100,
  438. (counter) =>
  439. {
  440. var result = ExecuteTestCommand(client);
  441. Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter));
  442. Assert.IsTrue(result);
  443. }
  444. );
  445. client.Disconnect();
  446. }
  447. }
  448. private static bool ExecuteTestCommand(SshClient s)
  449. {
  450. var testValue = Guid.NewGuid().ToString();
  451. var command = string.Format("echo {0}", testValue);
  452. var cmd = s.CreateCommand(command);
  453. var result = cmd.Execute();
  454. result = result.Substring(0, result.Length - 1); // Remove \n character returned by command
  455. return result.Equals(testValue);
  456. }
  457. }
  458. }