blob: 086c34fdc343d51a7f481756386d9198769a4ca8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 IBM Corporation, and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wainer dos Santos Moschetta (IBM Corp.) - initial contribution
*******************************************************************************/
package org.eclipse.remote.telnet.core.tests;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.remote.core.IRemoteConnection;
import org.eclipse.remote.core.IRemoteConnectionHostService;
import org.eclipse.remote.core.IRemoteConnectionType;
import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
import org.eclipse.remote.core.IRemoteProcessBuilder;
import org.eclipse.remote.core.IRemoteServicesManager;
import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.telnet.core.TelnetCommandShell;
import org.eclipse.remote.telnet.core.TelnetConnection;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class TelnetConnectionTests {
private static final String TELNET_CONN_TYPE_ID = "org.eclipse.remote.telnet.core.connectionType";
private static String hostname = "localhost";
private static String username = "test";
private static String password = "";
private static String TEST_CONN_NAME = "NewTelnetConnection";
private final String expected_connType_name = "Telnet";
private final int expected_telnet_default_port = 23;
private final int expected_telnet_default_timeout = 0;
private static TelnetConnection telnet;
@BeforeClass
public static void setup() {
String host = System.getenv("TEST_HOSTNAME");
if(host != null) {
hostname = host;
}
String user = System.getenv("TEST_USERNAME");
if(user != null) {
username = user;
}
String passwd = System.getenv("TEST_PASSWORD");
if(user != null) {
password = passwd;
}
IRemoteServicesManager services = Activator.getService(IRemoteServicesManager.class);
IRemoteConnectionType connType = services.getConnectionType(TELNET_CONN_TYPE_ID);
assertNotNull(connType);
IRemoteConnectionWorkingCopy workingCopy = null;
IRemoteConnection connection = null;
try {
workingCopy = connType.newConnection(TEST_CONN_NAME);
assertNotNull(workingCopy);
IRemoteConnectionHostService hostService = workingCopy.getService(IRemoteConnectionHostService.class);
hostService.setHostname(hostname);
connection = workingCopy.save();
assertNotNull(connection);
} catch (RemoteConnectionException e) {
fail("Failed to create a Telnet connection: " + e.getMessage());
}
telnet = connection.getService(TelnetConnection.class);
assertNotNull(telnet);
}
@Test
public void testTelnetConnection() throws RemoteConnectionException {
IRemoteConnectionType connType = telnet.getRemoteConnection().getConnectionType();
assertEquals("Connection type name", expected_connType_name, connType.getName());
assertEquals("Default Telnet over TCP port", expected_telnet_default_port, telnet.getPort());
assertEquals("Default connection timeout", expected_telnet_default_timeout, telnet.getTimeout());
telnet.open(new NullProgressMonitor());
assertTrue("Connection should be open", telnet.isOpen());
telnet.close();
assertTrue("Connection should be closed", !telnet.isOpen());
}
@Test
public void testTelnetCommandShell() {
try {
telnet.open(new NullProgressMonitor());
} catch (RemoteConnectionException e) {
e.printStackTrace();
fail("Failed to open telnet connection");
}
TelnetCommandShell commandShell = null;
try {
commandShell = (TelnetCommandShell) telnet.getCommandShell(IRemoteProcessBuilder.ALLOCATE_PTY);
} catch (IOException e) {
e.printStackTrace();
fail("Failed to get command shell");
}
try {
commandShell.connect();
} catch (RemoteConnectionException e) {
e.printStackTrace();
fail("Unabled to connect with command shell");
}
OutputStream os = commandShell.getOutputStream();
assertNotNull("Command shel output stream", os);
InputStream is = commandShell.getInputStream();
assertNotNull("Command shel input stream");
if(!username.isEmpty() && !password.isEmpty()) {
try {
// Assume that a login prompt appears
readPrompt(is);
os.write((username + "\r\n").getBytes());
readPrompt(is);
os.write((password + "\r\n").getBytes());
BufferedReader br = new BufferedReader(new InputStreamReader(is));
br.readLine();
} catch (IOException e) {
e.printStackTrace();
fail("Failed to log in");
}
}
}
@AfterClass
public static void tearDown() {
IRemoteServicesManager services = Activator.getService(IRemoteServicesManager.class);
IRemoteConnectionType connType = services.getConnectionType(TELNET_CONN_TYPE_ID);
try {
connType.removeConnection(telnet.getRemoteConnection());
IRemoteConnection conn = connType.getConnection(TEST_CONN_NAME);
assertTrue("Connection should had been deleted", conn == null);
} catch (RemoteConnectionException e) {
e.printStackTrace();
fail("Failed to delete the Telnet connection");
}
}
/*
* Consume characters until prompt delimite ":" has been found.
*/
private void readPrompt(InputStream is) {
int v;
try {
v = is.read();
while((v != -1) && (v != ':')) {
v = is.read();
}
} catch (IOException e) {
e.printStackTrace();
fail("Failed to read prompt: " + e.getMessage());
}
}
}