using System.Diagnostics; using Renci.SshNet.Common; namespace Renci.SshNet.IntegrationTests.OldIntegrationTests { /// /// Represents SSH command that can be executed. /// [TestClass] public class SshCommandTest : IntegrationTestBase { [TestMethod] public void Test_Run_SingleCommand() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand RunCommand Result client.Connect(); var testValue = Guid.NewGuid().ToString(); var command = client.RunCommand(string.Format("echo {0}", testValue)); var result = command.Result; result = result.Substring(0, result.Length - 1); // Remove \n character returned by command client.Disconnect(); #endregion Assert.IsTrue(result.Equals(testValue)); } } [TestMethod] public void Test_Execute_SingleCommand() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand CreateCommand Execute client.Connect(); var testValue = Guid.NewGuid().ToString(); var command = string.Format("echo {0}", testValue); var cmd = client.CreateCommand(command); var result = cmd.Execute(); result = result.Substring(0, result.Length - 1); // Remove \n character returned by command client.Disconnect(); #endregion Assert.IsTrue(result.Equals(testValue)); } } [TestMethod] public void Test_Execute_OutputStream() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand CreateCommand Execute OutputStream client.Connect(); var cmd = client.CreateCommand("ls -l"); // very long list var asynch = cmd.BeginExecute(); var reader = new StreamReader(cmd.OutputStream); while (!asynch.IsCompleted) { var result = reader.ReadToEnd(); if (string.IsNullOrEmpty(result)) { continue; } Console.Write(result); } _ = cmd.EndExecute(asynch); client.Disconnect(); #endregion Assert.Inconclusive(); } } [TestMethod] public void Test_Execute_ExtendedOutputStream() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand CreateCommand Execute ExtendedOutputStream client.Connect(); var cmd = client.CreateCommand("echo 12345; echo 654321 >&2"); var result = cmd.Execute(); Console.Write(result); var reader = new StreamReader(cmd.ExtendedOutputStream); Console.WriteLine("DEBUG:"); Console.Write(reader.ReadToEnd()); client.Disconnect(); #endregion Assert.Inconclusive(); } } [TestMethod] [ExpectedException(typeof(SshOperationTimeoutException))] public void Test_Execute_Timeout() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand CreateCommand Execute CommandTimeout client.Connect(); var cmd = client.CreateCommand("sleep 10s"); cmd.CommandTimeout = TimeSpan.FromSeconds(5); cmd.Execute(); client.Disconnect(); #endregion } } [TestMethod] public void Test_Execute_Infinite_Timeout() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("sleep 10s"); cmd.Execute(); client.Disconnect(); } } [TestMethod] public void Test_Execute_InvalidCommand() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand(";"); cmd.Execute(); if (string.IsNullOrEmpty(cmd.Error)) { Assert.Fail("Operation should fail"); } Assert.IsTrue(cmd.ExitStatus > 0); client.Disconnect(); } } [TestMethod] public void Test_Execute_InvalidCommand_Then_Execute_ValidCommand() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand(";"); cmd.Execute(); if (string.IsNullOrEmpty(cmd.Error)) { Assert.Fail("Operation should fail"); } Assert.IsTrue(cmd.ExitStatus > 0); var result = ExecuteTestCommand(client); client.Disconnect(); Assert.IsTrue(result); } } [TestMethod] public void Test_Execute_Command_with_ExtendedOutput() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("echo 12345; echo 654321 >&2"); cmd.Execute(); //var extendedData = Encoding.ASCII.GetString(cmd.ExtendedOutputStream.ToArray()); var extendedData = new StreamReader(cmd.ExtendedOutputStream, Encoding.ASCII).ReadToEnd(); client.Disconnect(); Assert.AreEqual("12345\n", cmd.Result); Assert.AreEqual("654321\n", extendedData); } } [TestMethod] public void Test_Execute_Command_Reconnect_Execute_Command() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var result = ExecuteTestCommand(client); Assert.IsTrue(result); client.Disconnect(); client.Connect(); result = ExecuteTestCommand(client); Assert.IsTrue(result); client.Disconnect(); } } [TestMethod] public void Test_Execute_Command_ExitStatus() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand RunCommand ExitStatus client.Connect(); var cmd = client.RunCommand("exit 128"); Console.WriteLine(cmd.ExitStatus); client.Disconnect(); #endregion Assert.IsTrue(cmd.ExitStatus == 128); } } [TestMethod] public void Test_Execute_Command_Asynchronously() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("sleep 5s; echo 'test'"); var asyncResult = cmd.BeginExecute(null, null); while (!asyncResult.IsCompleted) { Thread.Sleep(100); } cmd.EndExecute(asyncResult); Assert.IsTrue(cmd.Result == "test\n"); client.Disconnect(); } } [TestMethod] public void Test_Execute_Command_Asynchronously_With_Error() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("sleep 5s; ;"); var asyncResult = cmd.BeginExecute(null, null); while (!asyncResult.IsCompleted) { Thread.Sleep(100); } cmd.EndExecute(asyncResult); Assert.IsFalse(string.IsNullOrEmpty(cmd.Error)); client.Disconnect(); } } [TestMethod] public void Test_Execute_Command_Asynchronously_With_Callback() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var callbackCalled = false; var cmd = client.CreateCommand("sleep 5s; echo 'test'"); var asyncResult = cmd.BeginExecute(new AsyncCallback((s) => { callbackCalled = true; }), null); while (!asyncResult.IsCompleted) { Thread.Sleep(100); } cmd.EndExecute(asyncResult); Assert.IsTrue(callbackCalled); client.Disconnect(); } } [TestMethod] public void Test_Execute_Command_Asynchronously_With_Callback_On_Different_Thread() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var currentThreadId = Thread.CurrentThread.ManagedThreadId; int callbackThreadId = 0; var cmd = client.CreateCommand("sleep 5s; echo 'test'"); var asyncResult = cmd.BeginExecute(new AsyncCallback((s) => { callbackThreadId = Thread.CurrentThread.ManagedThreadId; }), null); while (!asyncResult.IsCompleted) { Thread.Sleep(100); } cmd.EndExecute(asyncResult); Assert.AreNotEqual(currentThreadId, callbackThreadId); client.Disconnect(); } } /// /// Tests for Issue 563. /// [WorkItem(563), TestMethod] public void Test_Execute_Command_Same_Object_Different_Commands() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("echo 12345"); cmd.Execute(); Assert.AreEqual("12345\n", cmd.Result); cmd.Execute("echo 23456"); Assert.AreEqual("23456\n", cmd.Result); client.Disconnect(); } } [TestMethod] public void Test_Get_Result_Without_Execution() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("ls -l"); Assert.IsTrue(string.IsNullOrEmpty(cmd.Result)); client.Disconnect(); } } [TestMethod] public void Test_Get_Error_Without_Execution() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("ls -l"); Assert.IsTrue(string.IsNullOrEmpty(cmd.Error)); client.Disconnect(); } } [WorkItem(703), TestMethod] [ExpectedException(typeof(ArgumentNullException))] public void Test_EndExecute_Before_BeginExecute() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); var cmd = client.CreateCommand("ls -l"); cmd.EndExecute(null); client.Disconnect(); } } /// ///A test for BeginExecute /// [TestMethod()] public void BeginExecuteTest() { string expected = "123\n"; string result; using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand CreateCommand BeginExecute IsCompleted EndExecute client.Connect(); var cmd = client.CreateCommand("sleep 15s;echo 123"); // Perform long running task var asynch = cmd.BeginExecute(); while (!asynch.IsCompleted) { // Waiting for command to complete... Thread.Sleep(2000); } result = cmd.EndExecute(asynch); client.Disconnect(); #endregion Assert.IsNotNull(asynch); Assert.AreEqual(expected, result); } } [TestMethod] public void Test_Execute_Invalid_Command() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { #region Example SshCommand CreateCommand Error client.Connect(); var cmd = client.CreateCommand(";"); cmd.Execute(); if (!string.IsNullOrEmpty(cmd.Error)) { Console.WriteLine(cmd.Error); } client.Disconnect(); #endregion Assert.Inconclusive(); } } [TestMethod] public void Test_MultipleThread_Example_MultipleConnections() { try { #region Example SshCommand RunCommand Parallel Parallel.For(0, 100, () => { var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password); client.Connect(); return client; }, (int counter, ParallelLoopState pls, SshClient client) => { var result = client.RunCommand("echo 123"); Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); return client; }, (SshClient client) => { client.Disconnect(); client.Dispose(); } ); #endregion } catch (Exception exp) { Assert.Fail(exp.ToString()); } } [TestMethod] public void Test_MultipleThread_100_MultipleConnections() { try { Parallel.For(0, 100, () => { var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password); client.Connect(); return client; }, (int counter, ParallelLoopState pls, SshClient client) => { var result = ExecuteTestCommand(client); Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); Assert.IsTrue(result); return client; }, (SshClient client) => { client.Disconnect(); client.Dispose(); } ); } catch (Exception exp) { Assert.Fail(exp.ToString()); } } [TestMethod] public void Test_MultipleThread_100_MultipleSessions() { using (var client = new SshClient(SshServerHostName, SshServerPort, User.UserName, User.Password)) { client.Connect(); Parallel.For(0, 100, (counter) => { var result = ExecuteTestCommand(client); Debug.WriteLine(string.Format("TestMultipleThreadMultipleConnections #{0}", counter)); Assert.IsTrue(result); } ); client.Disconnect(); } } private static bool ExecuteTestCommand(SshClient s) { var testValue = Guid.NewGuid().ToString(); var command = string.Format("echo {0}", testValue); var cmd = s.CreateCommand(command); var result = cmd.Execute(); result = result.Substring(0, result.Length - 1); // Remove \n character returned by command return result.Equals(testValue); } } }