| // 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(); | |
| } | |
| } | |
| } |