2
0

TestSshCommand.cs 8.2 KB

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