TestSshCommand.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. using System;
  2. using System.Diagnostics;
  3. using System.Text;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using Microsoft.VisualStudio.TestTools.UnitTesting;
  7. using Renci.SshClient.Common;
  8. using Renci.SshClient.Tests.Properties;
  9. using System.IO;
  10. namespace Renci.SshClient.Tests.SshClientTests
  11. {
  12. [TestClass]
  13. public class TestSshCommand
  14. {
  15. [TestMethod]
  16. [ExpectedException(typeof(SshConnectionException))]
  17. public void Test_Execute_SingleCommand_Without_Connecting()
  18. {
  19. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  20. {
  21. var result = ExecuteTestCommand(client);
  22. Assert.IsTrue(result);
  23. }
  24. }
  25. [TestMethod]
  26. public void Test_Execute_SingleCommand()
  27. {
  28. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  29. {
  30. client.Connect();
  31. var result = ExecuteTestCommand(client);
  32. client.Disconnect();
  33. Assert.IsTrue(result);
  34. }
  35. }
  36. [TestMethod]
  37. [ExpectedException(typeof(SshOperationTimeoutException))]
  38. public void Test_Execute_Timeout()
  39. {
  40. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  41. {
  42. client.Connect();
  43. var cmd = client.CreateCommand("sleep 10s");
  44. cmd.CommandTimeout = TimeSpan.FromSeconds(5);
  45. cmd.Execute();
  46. client.Disconnect();
  47. }
  48. }
  49. [TestMethod]
  50. public void Test_Execute_Infinite_Timeout()
  51. {
  52. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  53. {
  54. client.Connect();
  55. var cmd = client.CreateCommand("sleep 10s");
  56. cmd.Execute();
  57. client.Disconnect();
  58. }
  59. }
  60. [TestMethod]
  61. public void Test_MultipleThread_10000_MultipleSessions()
  62. {
  63. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  64. {
  65. client.Connect();
  66. System.Threading.Tasks.Parallel.For(0, 10000,
  67. (counter) =>
  68. {
  69. var result = ExecuteTestCommand(client);
  70. Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter));
  71. Assert.IsTrue(result);
  72. }
  73. );
  74. client.Disconnect();
  75. }
  76. }
  77. [TestMethod]
  78. public void Test_MultipleThread_10000_MultipleConnections()
  79. {
  80. try
  81. {
  82. System.Threading.Tasks.Parallel.For(0, 10000,
  83. () =>
  84. {
  85. var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD);
  86. client.Connect();
  87. return client;
  88. },
  89. (int counter, ParallelLoopState pls, SshClient client) =>
  90. {
  91. var result = ExecuteTestCommand(client);
  92. Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter));
  93. Assert.IsTrue(result);
  94. return client;
  95. },
  96. (SshClient client) =>
  97. {
  98. client.Disconnect();
  99. client.Dispose();
  100. }
  101. );
  102. }
  103. catch (Exception exp)
  104. {
  105. Assert.Fail(exp.ToString());
  106. }
  107. }
  108. [TestMethod]
  109. public void Test_Execute_InvalidCommand()
  110. {
  111. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  112. {
  113. client.Connect();
  114. var cmd = client.CreateCommand(";");
  115. cmd.Execute();
  116. if (string.IsNullOrEmpty(cmd.Error))
  117. {
  118. Assert.Fail("Operation should fail");
  119. }
  120. Assert.IsTrue(cmd.ExitStatus > 0);
  121. client.Disconnect();
  122. }
  123. }
  124. [TestMethod]
  125. public void Test_Execute_InvalidCommand_Then_Execute_ValidCommand()
  126. {
  127. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  128. {
  129. client.Connect();
  130. var cmd = client.CreateCommand(";");
  131. cmd.Execute();
  132. if (string.IsNullOrEmpty(cmd.Error))
  133. {
  134. Assert.Fail("Operation should fail");
  135. }
  136. Assert.IsTrue(cmd.ExitStatus > 0);
  137. var result = ExecuteTestCommand(client);
  138. client.Disconnect();
  139. Assert.IsTrue(result);
  140. }
  141. }
  142. [TestMethod]
  143. public void Test_Execute_Command_with_ExtendedOutput()
  144. {
  145. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  146. {
  147. client.Connect();
  148. var cmd = client.CreateCommand("echo 12345; echo 654321 >&2");
  149. cmd.Execute();
  150. //var extendedData = Encoding.ASCII.GetString(cmd.ExtendedOutputStream.ToArray());
  151. var extendedData = new StreamReader(cmd.ExtendedOutputStream, Encoding.ASCII).ReadToEnd();
  152. client.Disconnect();
  153. Assert.AreEqual("12345\n", cmd.Result);
  154. Assert.AreEqual("654321\n", extendedData);
  155. }
  156. }
  157. [TestMethod]
  158. public void Test_Execute_Command_Reconnect_Execute_Command()
  159. {
  160. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  161. {
  162. client.Connect();
  163. var result = ExecuteTestCommand(client);
  164. Assert.IsTrue(result);
  165. client.Disconnect();
  166. client.Connect();
  167. result = ExecuteTestCommand(client);
  168. Assert.IsTrue(result);
  169. client.Disconnect();
  170. }
  171. }
  172. [TestMethod]
  173. public void Test_Execute_Command_ExitStatus()
  174. {
  175. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  176. {
  177. client.Connect();
  178. var cmd = client.RunCommand("exit 128");
  179. Assert.IsTrue(cmd.ExitStatus == 128);
  180. client.Disconnect();
  181. }
  182. }
  183. [TestMethod]
  184. public void Test_Execute_Command_Asynchronously()
  185. {
  186. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  187. {
  188. client.Connect();
  189. var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  190. var asyncResult = cmd.BeginExecute(null, null);
  191. while (!asyncResult.IsCompleted)
  192. {
  193. Thread.Sleep(100);
  194. }
  195. cmd.EndExecute(asyncResult);
  196. Assert.IsTrue(cmd.Result == "test\n");
  197. client.Disconnect();
  198. }
  199. }
  200. [TestMethod]
  201. public void Test_Execute_Command_Asynchronously_With_Error()
  202. {
  203. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  204. {
  205. client.Connect();
  206. var cmd = client.CreateCommand("sleep 5s; ;");
  207. var asyncResult = cmd.BeginExecute(null, null);
  208. while (!asyncResult.IsCompleted)
  209. {
  210. Thread.Sleep(100);
  211. }
  212. cmd.EndExecute(asyncResult);
  213. Assert.IsFalse(string.IsNullOrEmpty(cmd.Error));
  214. client.Disconnect();
  215. }
  216. }
  217. [TestMethod]
  218. public void Test_Execute_Command_Asynchronously_With_Callback()
  219. {
  220. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  221. {
  222. client.Connect();
  223. var callbackCalled = false;
  224. var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  225. var asyncResult = cmd.BeginExecute(new AsyncCallback((s) =>
  226. {
  227. callbackCalled = true;
  228. }), null);
  229. while (!asyncResult.IsCompleted)
  230. {
  231. Thread.Sleep(100);
  232. }
  233. cmd.EndExecute(asyncResult);
  234. Assert.IsTrue(callbackCalled);
  235. client.Disconnect();
  236. }
  237. }
  238. [TestMethod]
  239. public void Test_Execute_Command_Asynchronously_With_Callback_On_Different_Thread()
  240. {
  241. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  242. {
  243. client.Connect();
  244. var currentThreadId = Thread.CurrentThread.ManagedThreadId;
  245. int callbackThreadId = 0;
  246. var cmd = client.CreateCommand("sleep 5s; echo 'test'");
  247. var asyncResult = cmd.BeginExecute(new AsyncCallback((s) =>
  248. {
  249. callbackThreadId = Thread.CurrentThread.ManagedThreadId;
  250. }), null);
  251. while (!asyncResult.IsCompleted)
  252. {
  253. Thread.Sleep(100);
  254. }
  255. cmd.EndExecute(asyncResult);
  256. Assert.AreNotEqual(currentThreadId, callbackThreadId);
  257. client.Disconnect();
  258. }
  259. }
  260. /// <summary>
  261. /// Tests for Issue 563.
  262. /// </summary>
  263. [TestMethod]
  264. public void Test_Execute_Command_Same_Object_Different_Commands()
  265. {
  266. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  267. {
  268. client.Connect();
  269. var cmd = client.CreateCommand("ls -l");
  270. cmd.Execute();
  271. cmd.Execute("ls -l");
  272. client.Disconnect();
  273. }
  274. }
  275. [TestMethod]
  276. public void Test_Get_Result_Without_Execution()
  277. {
  278. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  279. {
  280. client.Connect();
  281. var cmd = client.CreateCommand("ls -l");
  282. Assert.IsTrue(string.IsNullOrEmpty(cmd.Result));
  283. client.Disconnect();
  284. }
  285. }
  286. [TestMethod]
  287. public void Test_Get_Error_Without_Execution()
  288. {
  289. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  290. {
  291. client.Connect();
  292. var cmd = client.CreateCommand("ls -l");
  293. Assert.IsTrue(string.IsNullOrEmpty(cmd.Error));
  294. client.Disconnect();
  295. }
  296. }
  297. [TestMethod]
  298. [ExpectedException(typeof(ArgumentException))]
  299. public void Test_EndExecute_Before_BeginExecute()
  300. {
  301. using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
  302. {
  303. client.Connect();
  304. var cmd = client.CreateCommand("ls -l");
  305. cmd.EndExecute(null);
  306. client.Disconnect();
  307. }
  308. }
  309. private static bool ExecuteTestCommand(Renci.SshClient.SshClient s)
  310. {
  311. var testValue = Guid.NewGuid().ToString();
  312. var command = string.Format("echo {0}", testValue);
  313. var cmd = s.CreateCommand(command);
  314. var result = cmd.Execute();
  315. result = result.Substring(0, result.Length - 1); // Remove \n character returned by command
  316. return result.Equals(testValue);
  317. }
  318. }
  319. }