package io.termd.core.tty;
import io.termd.core.telnet.TelnetClientRule;
import io.termd.core.telnet.TelnetHandler;
import io.termd.core.telnet.TelnetServerRule;
import io.termd.core.telnet.TelnetTtyConnection;
import org.apache.commons.net.telnet.EchoOptionHandler;
import org.apache.commons.net.telnet.SimpleOptionHandler;
import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
import org.apache.commons.net.telnet.WindowSizeOptionHandler;
import org.junit.Rule;
import java.io.Closeable;
import java.nio.charset.StandardCharsets;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
*/
public abstract class TelnetTtyTestBase extends TtyTestBase {
protected boolean binary;
private WindowSizeOptionHandler wsHandler;
@Rule
public TelnetServerRule server = new TelnetServerRule(serverFactory());
@Rule
public TelnetClientRule client = new TelnetClientRule();
protected abstract Function<Supplier<TelnetHandler>, Closeable> serverFactory();
@Override
public boolean checkDisconnected() {
return client.checkDisconnected();
}
protected void server(Consumer<TtyConnection> onConnect) {
server.start(() -> new TelnetTtyConnection(binary, binary, charset, onConnect));
}
@Override
protected void resize(int width, int height) {
}
@Override
protected void assertConnect(String term) throws Exception {
client.setOptionHandler(new EchoOptionHandler(false, false, true, true));
if (binary) {
client.setOptionHandler(new SimpleOptionHandler(0, false, false, true, true));
}
if (term != null) {
client.setOptionHandler(new TerminalTypeOptionHandler(term, false, false, true, false));
}
client.connect("localhost", 4000);
}
@Override
protected void assertWrite(String s) throws Exception {
client.write(s.getBytes(charset));
client.flush();
}
protected final void assertWriteln(String s) throws Exception {
assertWrite(s + (binary ? "\r" : "\r\n"));
}
@Override
protected String assertReadString(int len) throws Exception {
return client.assertReadString(len);
}
@Override
protected void assertDisconnect(boolean clean) throws Exception {
client.disconnect(clean);
}
@Override
public void testSize() throws Exception {
wsHandler = new WindowSizeOptionHandler(80, 24, false, false, true, true);
client.setOptionHandler(wsHandler);
super.testSize();
}
@Override
public void testResize() throws Exception {
// Cannot be tested with this client that does not support resize
}
}