using System; using System.Collections.Generic; using System.Globalization; using System.Text; using Microsoft.VisualStudio.TestTools.UnitTesting; using Renci.SshNet.Common; using Renci.SshNet.Messages.Connection; namespace Renci.SshNet.Tests.Classes.Messages.Connection { /// /// Represents "pty-req" type channel request information /// [TestClass] public class PseudoTerminalRequestInfoTest { private string _environmentVariable; private uint _columns; private uint _rows; private uint _width; private uint _height; private IDictionary _terminalModeValues; private byte[] _environmentVariableBytes; [TestInitialize] public void Init() { var random = new Random(); _environmentVariable = random.Next().ToString(CultureInfo.InvariantCulture); _environmentVariableBytes = Encoding.UTF8.GetBytes(_environmentVariable); _columns = (uint)random.Next(0, int.MaxValue); _rows = (uint)random.Next(0, int.MaxValue); _width = (uint)random.Next(0, int.MaxValue); _height = (uint)random.Next(0, int.MaxValue); _terminalModeValues = new Dictionary { {TerminalModes.CS8, 433}, {TerminalModes.ECHO, 566} }; } [TestMethod] public void GetBytes() { var target = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, _terminalModeValues); var bytes = target.GetBytes(); var expectedBytesLength = 1; // WantReply expectedBytesLength += 4; // EnvironmentVariable length expectedBytesLength += _environmentVariableBytes.Length; // EnvironmentVariable expectedBytesLength += 4; // Columns expectedBytesLength += 4; // Rows expectedBytesLength += 4; // PixelWidth expectedBytesLength += 4; // PixelHeight expectedBytesLength += 4; // Length of "encoded terminal modes" expectedBytesLength += (_terminalModeValues.Count * (1 + 4)) + 1; // encoded terminal modes Assert.AreEqual(expectedBytesLength, bytes.Length); var sshDataStream = new SshDataStream(bytes); Assert.AreEqual(1, sshDataStream.ReadByte()); // WantReply Assert.AreEqual(_environmentVariable, sshDataStream.ReadString(Encoding.UTF8)); Assert.AreEqual(_columns, sshDataStream.ReadUInt32()); Assert.AreEqual(_rows, sshDataStream.ReadUInt32()); Assert.AreEqual(_width, sshDataStream.ReadUInt32()); Assert.AreEqual(_height, sshDataStream.ReadUInt32()); Assert.AreEqual((uint)((_terminalModeValues.Count * (1 + 4)) + 1), sshDataStream.ReadUInt32()); Assert.AreEqual((int)TerminalModes.CS8, sshDataStream.ReadByte()); Assert.AreEqual(_terminalModeValues[TerminalModes.CS8], sshDataStream.ReadUInt32()); Assert.AreEqual((int)TerminalModes.ECHO, sshDataStream.ReadByte()); Assert.AreEqual(_terminalModeValues[TerminalModes.ECHO], sshDataStream.ReadUInt32()); Assert.AreEqual((int)TerminalModes.TTY_OP_END, sshDataStream.ReadByte()); Assert.IsTrue(sshDataStream.IsEndOfData); } [TestMethod] public void GetBytes_TerminalModeValues_Null() { var target = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, null); var bytes = target.GetBytes(); var expectedBytesLength = 1; // WantReply expectedBytesLength += 4; // EnvironmentVariable length expectedBytesLength += _environmentVariableBytes.Length; // EnvironmentVariable expectedBytesLength += 4; // Columns expectedBytesLength += 4; // Rows expectedBytesLength += 4; // PixelWidth expectedBytesLength += 4; // PixelHeight expectedBytesLength += 4; // Length of "encoded terminal modes" Assert.AreEqual(expectedBytesLength, bytes.Length); var sshDataStream = new SshDataStream(bytes); Assert.AreEqual(1, sshDataStream.ReadByte()); // WantReply Assert.AreEqual(_environmentVariable, sshDataStream.ReadString(Encoding.UTF8)); Assert.AreEqual(_columns, sshDataStream.ReadUInt32()); Assert.AreEqual(_rows, sshDataStream.ReadUInt32()); Assert.AreEqual(_width, sshDataStream.ReadUInt32()); Assert.AreEqual(_height, sshDataStream.ReadUInt32()); Assert.AreEqual((uint)0, sshDataStream.ReadUInt32()); Assert.IsTrue(sshDataStream.IsEndOfData); } [TestMethod] public void GetBytes_TerminalModeValues_Empty() { var target = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, new Dictionary()); var bytes = target.GetBytes(); var expectedBytesLength = 1; // WantReply expectedBytesLength += 4; // EnvironmentVariable length expectedBytesLength += _environmentVariableBytes.Length; // EnvironmentVariable expectedBytesLength += 4; // Columns expectedBytesLength += 4; // Rows expectedBytesLength += 4; // PixelWidth expectedBytesLength += 4; // PixelHeight expectedBytesLength += 4; // Length of "encoded terminal modes" Assert.AreEqual(expectedBytesLength, bytes.Length); var sshDataStream = new SshDataStream(bytes); Assert.AreEqual(1, sshDataStream.ReadByte()); // WantReply Assert.AreEqual(_environmentVariable, sshDataStream.ReadString(Encoding.UTF8)); Assert.AreEqual(_columns, sshDataStream.ReadUInt32()); Assert.AreEqual(_rows, sshDataStream.ReadUInt32()); Assert.AreEqual(_width, sshDataStream.ReadUInt32()); Assert.AreEqual(_height, sshDataStream.ReadUInt32()); Assert.AreEqual((uint)0, sshDataStream.ReadUInt32()); Assert.IsTrue(sshDataStream.IsEndOfData); } [TestMethod] public void DefaultCtor() { var ptyReq = new PseudoTerminalRequestInfo(); Assert.IsTrue(ptyReq.WantReply); Assert.AreEqual(uint.MinValue, ptyReq.Columns); Assert.IsNull(ptyReq.EnvironmentVariable); Assert.AreEqual("pty-req", ptyReq.RequestName); Assert.AreEqual(uint.MinValue, ptyReq.PixelHeight); Assert.AreEqual(uint.MinValue, ptyReq.PixelWidth); Assert.AreEqual(uint.MinValue, ptyReq.Rows); Assert.IsNull(ptyReq.TerminalModeValues); } [TestMethod] public void FullCtor() { var ptyReq = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, _terminalModeValues); Assert.IsTrue(ptyReq.WantReply); Assert.AreEqual(_columns, ptyReq.Columns); Assert.AreSame(_environmentVariable, ptyReq.EnvironmentVariable); Assert.AreEqual("pty-req", ptyReq.RequestName); Assert.AreEqual(_height, ptyReq.PixelHeight); Assert.AreEqual(_width, ptyReq.PixelWidth); Assert.AreEqual(_rows, ptyReq.Rows); Assert.AreSame(_terminalModeValues, ptyReq.TerminalModeValues); } } }