blob: f2e611de24f40acc42bfccc3e429c0cba4a5a5a7 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package rdpclient;
import static streamer.debug.MockServer.Packet.PacketType.CLIENT;
import static streamer.debug.MockServer.Packet.PacketType.SERVER;
import static streamer.debug.MockServer.Packet.PacketType.UPGRADE_TO_SSL;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import javax.net.SocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import org.junit.Test;
import junit.framework.TestCase;
import streamer.debug.MockServer;
import streamer.debug.MockServer.Packet;
public class MockServerTest extends TestCase {
@Test
public void testIsMockServerCanRespond() throws Exception {
final byte[] mockClientData = new byte[] {0x01, 0x02, 0x03};
final byte[] mockServerData = new byte[] {0x03, 0x02, 0x01};
MockServer server = new MockServer(new Packet[] {new Packet("Client hello") {
{
type = CLIENT;
data = mockClientData;
}
}, new Packet("Server hello") {
{
type = SERVER;
data = mockServerData;
}
}});
server.start();
// Connect to server and send and receive mock data
Socket socket = SocketFactory.getDefault().createSocket();
try {
socket.connect(new InetSocketAddress("127.0.0.1", server.getAddress().getPort()));
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
// Write mock data to server
os.write(mockClientData);
// Read data from server
byte actualData[] = new byte[mockServerData.length];
int actualDataLength = is.read(actualData);
// Compare mock data with actual data
assertEquals("Unexpected length of actual data read from server.", mockServerData.length, actualDataLength);
for (int i = 0; i < actualDataLength; i++) {
assertEquals("Unexpected byte #" + i + " in response", mockServerData[i], actualData[i]);
}
server.waitUntilShutdowned(1 * 1000 /* up to 1 second */);
assertNull("Unexpected exception at mock server side.", server.getException());
assertTrue("Server is not shutdowned at after conversation.", server.isShutdowned());
} finally {
socket.close();
}
}
@Test
public void testIsMockServerCanUpgradeConnectionToSsl() throws Exception {
final byte[] mockClientData1 = new byte[] {0x01, 0x02, 0x03};
final byte[] mockServerData1 = new byte[] {0x03, 0x02, 0x01};
final byte[] mockClientData2 = new byte[] {0x02, 0x04, 0x02, 0x03};
final byte[] mockServerData2 = new byte[] {0x02, 0x02, 0x01, 0x04};
MockServer server = new MockServer(new Packet[] {new Packet("Client hello") {
{
type = CLIENT;
data = mockClientData1;
}
}, new Packet("Server hello") {
{
type = SERVER;
data = mockServerData1;
}
}, new Packet("Upgrade connection to SSL") {
{
type = UPGRADE_TO_SSL;
}
}, new Packet("Client data over SSL") {
{
type = CLIENT;
data = mockClientData2;
}
}, new Packet("Server data over SSL") {
{
type = SERVER;
data = mockServerData2;
}
}});
server.start();
// Connect to server and send and receive mock data
Socket socket = SocketFactory.getDefault().createSocket();
try {
InetSocketAddress address = new InetSocketAddress("127.0.0.1", server.getAddress().getPort());
socket.connect(address);
// Send hello data over plain connection
{
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
// Write mock data to server
os.write(mockClientData1);
// Read data from server
byte actualData[] = new byte[mockServerData1.length];
int actualDataLength = is.read(actualData);
// Compare mock data with actual data
assertEquals("Unexpected length of actual data read from server.", mockServerData1.length, actualDataLength);
for (int i = 0; i < actualDataLength; i++) {
assertEquals("Unexpected byte #" + i + " in response", mockServerData1[i], actualData[i]);
}
}
// Upgrade connection to SSL and send mock data
{
//System.setProperty("javax.net.debug", "ssl");
final SSLSocketFactory sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket)sslSocketFactory.createSocket(socket, address.getHostName(), address.getPort(), true);
sslSocket.setEnabledCipherSuites(sslSocket.getSupportedCipherSuites());
sslSocket.startHandshake();
InputStream is = sslSocket.getInputStream();
OutputStream os = sslSocket.getOutputStream();
// Write mock data to server
os.write(mockClientData2);
// Read data from server
byte actualData[] = new byte[mockServerData2.length];
int actualDataLength = is.read(actualData);
// Compare mock data with actual data
assertEquals("Unexpected length of actual data read from server.", mockServerData2.length, actualDataLength);
for (int i = 0; i < actualDataLength; i++) {
assertEquals("Unexpected byte #" + i + " in response", mockServerData2[i], actualData[i]);
}
}
server.waitUntilShutdowned(1 * 1000 /* up to 1 second */);
assertNull("Unexpected exception at mock server side.", server.getException());
assertTrue("Server is not shutdowned at after conversation.", server.isShutdowned());
} finally {
socket.close();
}
}
}