Skip to content

Commit b79c630

Browse files
committed
Added more tests for PseudoTerminalRequestInfo.
Fixed generating pty-ref with zero terminal modes.
1 parent 3143e14 commit b79c630

File tree

2 files changed

+134
-24
lines changed

2 files changed

+134
-24
lines changed
Lines changed: 132 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,122 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Globalization;
4-
using System.Linq;
54
using System.Text;
65
using Microsoft.VisualStudio.TestTools.UnitTesting;
76
using Renci.SshNet.Common;
87
using Renci.SshNet.Messages.Connection;
9-
using Renci.SshNet.Tests.Common;
108

119
namespace Renci.SshNet.Tests.Classes.Messages.Connection
1210
{
1311
/// <summary>
1412
/// Represents "pty-req" type channel request information
1513
/// </summary>
1614
[TestClass]
17-
public class PseudoTerminalRequestInfoTest : TestBase
15+
public class PseudoTerminalRequestInfoTest
1816
{
19-
private string environmentVariable;
20-
private uint columns;
21-
private uint rows;
22-
private uint width;
23-
private uint height;
24-
IDictionary<TerminalModes, uint> terminalModeValues;
17+
private string _environmentVariable;
18+
private uint _columns;
19+
private uint _rows;
20+
private uint _width;
21+
private uint _height;
22+
private IDictionary<TerminalModes, uint> _terminalModeValues;
2523
private byte[] _environmentVariableBytes;
2624

2725
[TestInitialize]
2826
public void Init()
2927
{
3028
var random = new Random();
3129

32-
environmentVariable = random.Next().ToString(CultureInfo.InvariantCulture);
33-
columns = (uint) random.Next(0, int.MaxValue);
34-
rows = (uint) random.Next(0, int.MaxValue);
35-
width = (uint) random.Next(0, int.MaxValue);
36-
height = (uint) random.Next(0, int.MaxValue);
37-
terminalModeValues = new Dictionary<TerminalModes, uint>();
30+
_environmentVariable = random.Next().ToString(CultureInfo.InvariantCulture);
31+
_environmentVariableBytes = Encoding.UTF8.GetBytes(_environmentVariable);
32+
_columns = (uint) random.Next(0, int.MaxValue);
33+
_rows = (uint) random.Next(0, int.MaxValue);
34+
_width = (uint) random.Next(0, int.MaxValue);
35+
_height = (uint) random.Next(0, int.MaxValue);
36+
_terminalModeValues = new Dictionary<TerminalModes, uint>
37+
{
38+
{TerminalModes.CS8, 433},
39+
{TerminalModes.ECHO, 566}
40+
};
41+
}
42+
43+
[TestMethod]
44+
public void GetBytes()
45+
{
46+
var target = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, _terminalModeValues);
3847

48+
var bytes = target.GetBytes();
3949

40-
_environmentVariableBytes = Encoding.UTF8.GetBytes(environmentVariable);
50+
var expectedBytesLength = 1; // WantReply
51+
expectedBytesLength += 4; // EnvironmentVariable length
52+
expectedBytesLength += _environmentVariableBytes.Length; // EnvironmentVariable
53+
expectedBytesLength += 4; // Columns
54+
expectedBytesLength += 4; // Rows
55+
expectedBytesLength += 4; // PixelWidth
56+
expectedBytesLength += 4; // PixelHeight
57+
expectedBytesLength += 4; // Length of "encoded terminal modes"
58+
expectedBytesLength += _terminalModeValues.Count*(1 + 4) + 1; // encoded terminal modes
59+
60+
Assert.AreEqual(expectedBytesLength, bytes.Length);
61+
62+
var sshDataStream = new SshDataStream(bytes);
63+
64+
Assert.AreEqual(1, sshDataStream.ReadByte()); // WantReply
65+
Assert.AreEqual(_environmentVariable, sshDataStream.ReadString(Encoding.UTF8));
66+
Assert.AreEqual(_columns, sshDataStream.ReadUInt32());
67+
Assert.AreEqual(_rows, sshDataStream.ReadUInt32());
68+
Assert.AreEqual(_width, sshDataStream.ReadUInt32());
69+
Assert.AreEqual(_height, sshDataStream.ReadUInt32());
70+
Assert.AreEqual((uint) (_terminalModeValues.Count * (1 + 4) + 1), sshDataStream.ReadUInt32());
71+
Assert.AreEqual((int) TerminalModes.CS8, sshDataStream.ReadByte());
72+
Assert.AreEqual(_terminalModeValues[TerminalModes.CS8], sshDataStream.ReadUInt32());
73+
Assert.AreEqual((int) TerminalModes.ECHO, sshDataStream.ReadByte());
74+
Assert.AreEqual(_terminalModeValues[TerminalModes.ECHO], sshDataStream.ReadUInt32());
75+
Assert.AreEqual((int) TerminalModes.TTY_OP_END, sshDataStream.ReadByte());
76+
77+
Assert.IsTrue(sshDataStream.IsEndOfData);
4178
}
4279

4380
[TestMethod]
4481
public void GetBytes_TerminalModeValues_Null()
4582
{
46-
var target = new PseudoTerminalRequestInfo(environmentVariable, columns, rows, width, height, null);
83+
var target = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, null);
84+
85+
var bytes = target.GetBytes();
86+
87+
var expectedBytesLength = 1; // WantReply
88+
expectedBytesLength += 4; // EnvironmentVariable length
89+
expectedBytesLength += _environmentVariableBytes.Length; // EnvironmentVariable
90+
expectedBytesLength += 4; // Columns
91+
expectedBytesLength += 4; // Rows
92+
expectedBytesLength += 4; // PixelWidth
93+
expectedBytesLength += 4; // PixelHeight
94+
expectedBytesLength += 4; // Length of "encoded terminal modes"
95+
96+
Assert.AreEqual(expectedBytesLength, bytes.Length);
97+
98+
var sshDataStream = new SshDataStream(bytes);
99+
100+
Assert.AreEqual(1, sshDataStream.ReadByte()); // WantReply
101+
Assert.AreEqual(_environmentVariable, sshDataStream.ReadString(Encoding.UTF8));
102+
Assert.AreEqual(_columns, sshDataStream.ReadUInt32());
103+
Assert.AreEqual(_rows, sshDataStream.ReadUInt32());
104+
Assert.AreEqual(_width, sshDataStream.ReadUInt32());
105+
Assert.AreEqual(_height, sshDataStream.ReadUInt32());
106+
Assert.AreEqual((uint) 0, sshDataStream.ReadUInt32());
107+
108+
Assert.IsTrue(sshDataStream.IsEndOfData);
109+
}
110+
111+
[TestMethod]
112+
public void GetBytes_TerminalModeValues_Empty()
113+
{
114+
var target = new PseudoTerminalRequestInfo(_environmentVariable,
115+
_columns,
116+
_rows,
117+
_width,
118+
_height,
119+
new Dictionary<TerminalModes, uint>());
47120

48121
var bytes = target.GetBytes();
49122

@@ -61,14 +134,50 @@ public void GetBytes_TerminalModeValues_Null()
61134
var sshDataStream = new SshDataStream(bytes);
62135

63136
Assert.AreEqual(1, sshDataStream.ReadByte()); // WantReply
64-
Assert.AreEqual(environmentVariable, sshDataStream.ReadString(Encoding.UTF8));
65-
Assert.AreEqual(columns, sshDataStream.ReadUInt32());
66-
Assert.AreEqual(rows, sshDataStream.ReadUInt32());
67-
Assert.AreEqual(width, sshDataStream.ReadUInt32());
68-
Assert.AreEqual(height, sshDataStream.ReadUInt32());
69-
Assert.AreEqual(0, sshDataStream.ReadUInt32());
137+
Assert.AreEqual(_environmentVariable, sshDataStream.ReadString(Encoding.UTF8));
138+
Assert.AreEqual(_columns, sshDataStream.ReadUInt32());
139+
Assert.AreEqual(_rows, sshDataStream.ReadUInt32());
140+
Assert.AreEqual(_width, sshDataStream.ReadUInt32());
141+
Assert.AreEqual(_height, sshDataStream.ReadUInt32());
142+
Assert.AreEqual((uint) 0, sshDataStream.ReadUInt32());
70143

71144
Assert.IsTrue(sshDataStream.IsEndOfData);
72145
}
146+
147+
[TestMethod]
148+
public void DefaultCtor()
149+
{
150+
var ptyReq = new PseudoTerminalRequestInfo();
151+
152+
Assert.IsTrue(ptyReq.WantReply);
153+
Assert.AreEqual(uint.MinValue, ptyReq.Columns);
154+
Assert.IsNull(ptyReq.EnvironmentVariable);
155+
Assert.AreEqual("pty-req", ptyReq.RequestName);
156+
Assert.AreEqual(uint.MinValue, ptyReq.PixelHeight);
157+
Assert.AreEqual(uint.MinValue, ptyReq.PixelWidth);
158+
Assert.AreEqual(uint.MinValue, ptyReq.Rows);
159+
Assert.IsNull(ptyReq.TerminalModeValues);
160+
}
161+
162+
[TestMethod]
163+
public void FullCtor()
164+
{
165+
var ptyReq = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, _terminalModeValues);
166+
167+
Assert.IsTrue(ptyReq.WantReply);
168+
Assert.AreEqual(_columns, ptyReq.Columns);
169+
Assert.AreSame(_environmentVariable, ptyReq.EnvironmentVariable);
170+
Assert.AreEqual("pty-req", ptyReq.RequestName);
171+
Assert.AreEqual(_height, ptyReq.PixelHeight);
172+
Assert.AreEqual(_width, ptyReq.PixelWidth);
173+
Assert.AreEqual(_rows, ptyReq.Rows);
174+
Assert.AreSame(_terminalModeValues, ptyReq.TerminalModeValues);
175+
}
176+
177+
[TestMethod]
178+
public void NameShouldReturnPtyReq()
179+
{
180+
Assert.AreEqual("pty-req", PseudoTerminalRequestInfo.Name);
181+
}
73182
}
74183
}

src/Renci.SshNet/Messages/Connection/ChannelRequest/PseudoTerminalInfo.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ protected override void SaveData()
135135
Write(PixelWidth);
136136
Write(PixelHeight);
137137

138-
if (TerminalModeValues != null)
138+
if (TerminalModeValues != null && TerminalModeValues.Count > 0)
139139
{
140140
// write total length of encoded terminal modes, which is 1 bytes for the opcode / terminal mode
141141
// and 4 bytes for the uint argument for each entry; the encoded terminal modes are terminated by
@@ -152,6 +152,7 @@ protected override void SaveData()
152152
}
153153
else
154154
{
155+
// when there are no terminal mode, the length of the string is zero
155156
Write((uint) 0);
156157
}
157158
}

0 commit comments

Comments
 (0)