blob: a0730a6c6b55c20cb9adcd4eb884e96fded93d06 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2017 SAP AG 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:
* Lazar Kirchev, SAP AG - initial contribution
******************************************************************************/
package org.eclipse.equinox.console.telnet;
import org.eclipse.equinox.console.common.ConsoleInputStream;
import org.eclipse.equinox.console.common.ConsoleOutputStream;
import org.eclipse.equinox.console.common.KEYS;
import org.eclipse.equinox.console.common.terminal.ANSITerminalTypeMappings;
import org.eclipse.equinox.console.common.terminal.SCOTerminalTypeMappings;
import org.eclipse.equinox.console.common.terminal.TerminalTypeMappings;
import org.eclipse.equinox.console.common.terminal.VT100TerminalTypeMappings;
import org.eclipse.equinox.console.common.terminal.VT220TerminalTypeMappings;
import org.eclipse.equinox.console.common.terminal.VT320TerminalTypeMappings;
import org.junit.Assert;
import org.junit.Test;
import static org.easymock.EasyMock.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.HashMap;
import java.util.Map;
public class TelnetInputScannerTests {
private static final int IAC = 255;
private static final int DO = 253;
private static final int DO_NOT = 254;
private static final int TTYPE = 24;
private static final int WILL = 251;
private static final int WILL_NOT = 252;
private static final int SB = 250;
private static final int SE = 240;
private static final int EL = 248;
private static final int SEND = 1;
private static final int IS = 0;
protected static final byte ESC = 27;
@Test
public void testScan() throws Exception {
ConsoleInputStream in = new ConsoleInputStream();
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ConsoleOutputStream out = new ConsoleOutputStream(byteOut);
Callback callback = createMock(Callback.class);
TelnetInputScanner scanner = new TelnetInputScanner(in, out, callback);
try {
scanner.scan((byte) SE);
scanner.scan((byte) EL);
scanner.scan((byte) SB);
scanner.scan((byte) WILL);
scanner.scan((byte) WILL_NOT);
scanner.scan((byte) DO);
scanner.scan((byte) DO_NOT);
scanner.scan((byte) 'a');
scanner.scan((byte) 'b');
scanner.scan((byte) 'c');
} catch (IOException e) {
System.out.println("Error while scanning: " + e.getMessage());
e.printStackTrace();
throw e;
}
String output = byteOut.toString();
Assert.assertTrue("Output incorrect. Expected abc, but read " + output, output.equals("abc"));
}
@Test
public void testScanESC() throws Exception {
ConsoleInputStream in = new ConsoleInputStream();
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ConsoleOutputStream out = new ConsoleOutputStream(byteOut);
Callback callback = createMock(Callback.class);
TelnetInputScanner scanner = new TelnetInputScanner(in, out, callback);
try {
scanner.scan((byte) 'a');
scanner.scan(ESC);
scanner.scan((byte) 'b');
} catch (IOException e) {
System.out.println("Error while scanning: " + e.getMessage());
e.printStackTrace();
throw e;
}
String output = byteOut.toString();
Assert.assertTrue("Output incorrect. Expected ab, but read " + output, output.equals("ab"));
}
@Test
public void testTTNegotiations() throws Exception {
Map<byte[], TerminalTypeMappings> ttMappings = new HashMap<>();
ttMappings.put(new byte[] { 'A', 'N', 'S', 'I' }, new ANSITerminalTypeMappings());
ttMappings.put(new byte[] { 'V', 'T', '1', '0', '0' }, new VT100TerminalTypeMappings());
ttMappings.put(new byte[] { 'V', 'T', '2', '2', '0' }, new VT220TerminalTypeMappings());
ttMappings.put(new byte[] { 'X', 'T', 'E', 'R', 'M' }, new VT220TerminalTypeMappings());
ttMappings.put(new byte[] { 'V', 'T', '3', '2', '0' }, new VT320TerminalTypeMappings());
ttMappings.put(new byte[] { 'S', 'C', 'O' }, new SCOTerminalTypeMappings());
for (byte[] ttype : ttMappings.keySet()) {
testTerminalTypeNegotiation(ttype, ttMappings.get(ttype));
}
}
private void testTerminalTypeNegotiation(byte[] terminalType, TerminalTypeMappings mappings) throws Exception {
PipedInputStream clientIn = new PipedInputStream();
PipedOutputStream serverOut = new PipedOutputStream(clientIn);
byte[] requestNegotiation = { (byte) IAC, (byte) DO, (byte) TTYPE };
TestCallback testCallback = new TestCallback();
TelnetOutputStream out = new TelnetOutputStream(serverOut);
TelnetInputScanner scanner = new TelnetInputScanner(new ConsoleInputStream(), out, testCallback);
out.write(requestNegotiation);
out.flush();
int read = clientIn.read();
Assert.assertEquals("Unexpected input ", IAC, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", DO, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", TTYPE, read);
scanner.scan(IAC);
scanner.scan(WILL);
scanner.scan(TTYPE);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", IAC, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", SB, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", TTYPE, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", SEND, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", IAC, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", SE, read);
scanner.scan(IAC);
scanner.scan(SB);
scanner.scan(TTYPE);
scanner.scan(IS);
scanner.scan('A');
scanner.scan('B');
scanner.scan('C');
scanner.scan('D');
scanner.scan('E');
scanner.scan(IAC);
scanner.scan(SE);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", IAC, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", SB, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", TTYPE, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", SEND, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", IAC, read);
read = clientIn.read();
Assert.assertEquals("Unexpected input ", SE, read);
scanner.scan(IAC);
scanner.scan(SB);
scanner.scan(TTYPE);
scanner.scan(IS);
for (byte symbol : terminalType) {
scanner.scan(symbol);
}
scanner.scan(IAC);
scanner.scan(SE);
Assert.assertEquals("Incorrect BACKSPACE: ", mappings.getBackspace(), scanner.getBackspace());
Assert.assertEquals("Incorrect DELL: ", mappings.getDel(), scanner.getDel());
Map<String, KEYS> currentEscapesToKey = scanner.getCurrentEscapesToKey();
Map<String, KEYS> expectedEscapesToKey = mappings.getEscapesToKey();
for (String escape : expectedEscapesToKey.keySet()) {
KEYS key = expectedEscapesToKey.get(escape);
Assert.assertEquals("Incorrect " + key.name(), key, currentEscapesToKey.get(escape));
}
Assert.assertTrue("Callback not called ", testCallback.getState());
}
class TestCallback implements Callback {
private boolean isCalled = false;
@Override
public void finished() {
isCalled = true;
}
public boolean getState() {
return isCalled;
}
}
}