-
-
Notifications
You must be signed in to change notification settings - Fork 979
Expand file tree
/
Copy pathSocks4ConnectorTest_Connect_ConnectionSucceeded.cs
More file actions
164 lines (141 loc) · 5.27 KB
/
Socks4ConnectorTest_Connect_ConnectionSucceeded.cs
File metadata and controls
164 lines (141 loc) · 5.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Renci.SshNet.Common;
using Renci.SshNet.Tests.Common;
namespace Renci.SshNet.Tests.Classes.Connection
{
[TestClass]
public class Socks4ConnectorTest_Connect_ConnectionSucceeded : Socks4ConnectorTestBase
{
private ConnectionInfo _connectionInfo;
private Socket _clientSocket;
private AsyncSocketListener _proxyServer;
private List<byte> _bytesReceivedByProxy;
private bool _disconnected;
private Socket _actual;
protected override void SetupData()
{
base.SetupData();
var random = new Random();
_connectionInfo = CreateConnectionInfo("proxyUser", "proxyPwd");
_connectionInfo.Timeout = TimeSpan.FromMilliseconds(random.Next(50, 200));
_bytesReceivedByProxy = new List<byte>();
_clientSocket = SocketFactory.Create(SocketType.Stream, ProtocolType.Tcp);
_actual = null;
_proxyServer = new AsyncSocketListener(new IPEndPoint(IPAddress.Loopback, _connectionInfo.ProxyPort));
_proxyServer.Disconnected += socket => _disconnected = true;
_proxyServer.BytesReceived += (bytesReceived, socket) =>
{
_bytesReceivedByProxy.AddRange(bytesReceived);
if (_bytesReceivedByProxy.Count == bytesReceived.Length)
{
// Send SOCKS response
_ = socket.Send(new byte[]
{
// Reply version (null byte)
0x00,
// Request granted
0x5a,
// Destination address port
0x01,
0xf0,
// Destination address IP
0x01,
0x02,
0x03,
0x04
});
// Send extra byte to allow us to verify that connector did not consume too much
_ = socket.Send(new byte[]
{
0xfe
});
}
};
_proxyServer.Start();
}
protected override void SetupMocks()
{
_ = SocketFactoryMock.Setup(p => p.Create(SocketType.Stream, ProtocolType.Tcp))
.Returns(_clientSocket);
}
protected override void TearDown()
{
base.TearDown();
_proxyServer?.Dispose();
_clientSocket?.Dispose();
}
protected override void Act()
{
_actual = Connector.Connect(_connectionInfo);
// Give some time to process all messages
Thread.Sleep(200);
}
[TestMethod]
public void ProxyShouldHaveReceivedExpectedSocksRequest()
{
var expectedSocksRequest = new byte[]
{
// SOCKS version
0x04,
// CONNECT request
0x01,
// Destination port
0x04,
0x06,
// Destination address (IPv4)
0x7f,
0x00,
0x00,
0x01,
// Proxy user
0x70,
0x72,
0x6f,
0x78,
0x79,
0x55,
0x73,
0x65,
0x72,
// Null terminator
0x00
};
var errorText = string.Format("Expected:{0}{1}{0}but was:{0}{2}",
Environment.NewLine,
PacketDump.Create(expectedSocksRequest, 2),
PacketDump.Create(_bytesReceivedByProxy, 2));
CollectionAssert.AreEqual(expectedSocksRequest, _bytesReceivedByProxy, errorText);
}
[TestMethod]
public void ConnectShouldReturnSocketCreatedUsingSocketFactory()
{
Assert.IsNotNull(_actual);
Assert.AreSame(_clientSocket, _actual);
}
[TestMethod]
public void OnlySocksResponseShouldHaveBeenConsumed()
{
var buffer = new byte[2];
Assert.AreEqual(1, _actual.Receive(buffer));
Assert.AreEqual(0xfe, buffer[0]);
}
[TestMethod]
public void ClientSocketShouldBeConnected()
{
Assert.IsFalse(_disconnected);
Assert.IsTrue(_actual.Connected);
}
[TestMethod]
public void CreateOnSocketFactoryShouldHaveBeenInvokedOnce()
{
SocketFactoryMock.Verify(p => p.Create(SocketType.Stream, ProtocolType.Tcp),
Times.Once());
}
}
}