diff options
-rw-r--r-- | src/org/connectbot/service/TerminalBridge.java | 35 | ||||
-rw-r--r-- | tests/src/org/connectbot/HostBeanTest.java | 1 | ||||
-rw-r--r-- | tests/src/org/connectbot/TerminalBridgeTest.java | 117 | ||||
-rw-r--r-- | tests/src/org/connectbot/mock/BeanTestCase.java (renamed from tests/src/org/connectbot/BeanTestCase.java) | 2 | ||||
-rw-r--r-- | tests/src/org/connectbot/mock/NullOutputStream.java | 33 |
5 files changed, 184 insertions, 4 deletions
diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java index 5477dd4..024c7b6 100644 --- a/src/org/connectbot/service/TerminalBridge.java +++ b/src/org/connectbot/service/TerminalBridge.java @@ -397,6 +397,34 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal } /** + * Create a new terminal bridge suitable for unit testing. + */ + public TerminalBridge() { + buffer = new vt320() { + @Override + public void write(byte[] b) {} + @Override + public void sendTelnetCommand(byte cmd) {} + @Override + public void setWindowSize(int c, int r) {} + }; + + emulation = null; + manager = null; + + defaultPaint = new Paint(); + + selectionArea = new SelectionArea(); + scrollback = 1; + + localOutput = new LinkedList<String>(); + + fontSizeChangedListeners = new LinkedList<FontSizeChangedListener>(); + + connection = null; + } + + /** * Create new terminal bridge with following parameters. We will immediately * launch thread to start SSH connection and handle any hostkey verification * and password authentication. @@ -851,7 +879,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal // Ignore all key-up events except for the special keys if (event.getAction() == KeyEvent.ACTION_UP) { // skip keys if we aren't connected yet or have been disconnected - if (disconnected || session == null) + if (disconnected || !sessionOpen) return false; if ("Use right-side keys".equals(keymode)) { @@ -895,7 +923,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal } // skip keys if we aren't connected yet or have been disconnected - if (disconnected || session == null) + if (disconnected || !sessionOpen) return false; // if we're in scrollback, scroll to bottom of window on input @@ -941,7 +969,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal } // handle pressing f-keys - if ((metaState &= META_TAB) != 0) { + if ((metaState & META_TAB) != 0) { switch(key) { case '!': ((vt320)buffer).keyPressed(vt320.KEY_F1, ' ', 0); return true; case '@': ((vt320)buffer).keyPressed(vt320.KEY_F2, ' ', 0); return true; @@ -962,6 +990,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal // TODO write encoding routine that doesn't allocate each time stdin.write(new String(Character.toChars(key)) .getBytes(host.getEncoding())); + return true; } diff --git a/tests/src/org/connectbot/HostBeanTest.java b/tests/src/org/connectbot/HostBeanTest.java index d24427e..671d1ce 100644 --- a/tests/src/org/connectbot/HostBeanTest.java +++ b/tests/src/org/connectbot/HostBeanTest.java @@ -18,6 +18,7 @@ package org.connectbot; import org.connectbot.bean.HostBean; +import org.connectbot.mock.BeanTestCase; import android.test.AndroidTestCase; diff --git a/tests/src/org/connectbot/TerminalBridgeTest.java b/tests/src/org/connectbot/TerminalBridgeTest.java new file mode 100644 index 0000000..50a2fdf --- /dev/null +++ b/tests/src/org/connectbot/TerminalBridgeTest.java @@ -0,0 +1,117 @@ +/* + ConnectBot: simple, powerful, open-source SSH client for Android + Copyright (C) 2007-2008 Kenny Root, Jeffrey Sharkey + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package org.connectbot; + +import java.io.OutputStream; +import java.lang.reflect.Field; + +import org.connectbot.mock.NullOutputStream; +import org.connectbot.service.TerminalBridge; + +import android.test.AndroidTestCase; +import android.view.KeyEvent; + +/** + * @author Kenny Root + * + */ +public class TerminalBridgeTest extends AndroidTestCase { + public void testShiftLock() throws SecurityException, NoSuchFieldException, + IllegalArgumentException, IllegalAccessException { + TerminalBridge bridge = new TerminalBridge(); + + OutputStream nullStream = new NullOutputStream(); + + // Make sure onKey will work when we call it + Field disconnected = TerminalBridge.class + .getDeclaredField("disconnected"); + Field sessionOpen = TerminalBridge.class + .getDeclaredField("sessionOpen"); + Field keymode = TerminalBridge.class.getDeclaredField("keymode"); + Field stdin = TerminalBridge.class.getDeclaredField("stdin"); + + disconnected.setAccessible(true); + sessionOpen.setAccessible(true); + keymode.setAccessible(true); + stdin.setAccessible(true); + + disconnected.setBoolean(bridge, false); + sessionOpen.setBoolean(bridge, true); + keymode.set(bridge, "Use right-side keys"); + stdin.set(bridge, nullStream); + + // Begin tests + assertTrue("Meta state is " + bridge.getMetaState() + + " when it should be 0", bridge.getMetaState() == 0); + + KeyEvent shiftDown = new KeyEvent(KeyEvent.ACTION_DOWN, + KeyEvent.KEYCODE_SHIFT_LEFT); + bridge.onKey(null, shiftDown.getKeyCode(), shiftDown); + + assertTrue("Shift test: after shift press, meta state is " + + bridge.getMetaState() + " when it should be " + + TerminalBridge.META_SHIFT_ON, + bridge.getMetaState() == TerminalBridge.META_SHIFT_ON); + + KeyEvent shiftUp = KeyEvent.changeAction(shiftDown, KeyEvent.ACTION_UP); + bridge.onKey(null, shiftUp.getKeyCode(), shiftUp); + + assertTrue("Shift test: after shift release, meta state is " + + bridge.getMetaState() + " when it should be " + + TerminalBridge.META_SHIFT_ON, + bridge.getMetaState() == TerminalBridge.META_SHIFT_ON); + + KeyEvent letterAdown = new KeyEvent(KeyEvent.ACTION_DOWN, + KeyEvent.KEYCODE_A); + KeyEvent letterAup = KeyEvent.changeAction(letterAdown, + KeyEvent.ACTION_UP); + + bridge.onKey(null, letterAdown.getKeyCode(), letterAdown); + bridge.onKey(null, letterAup.getKeyCode(), letterAup); + + assertTrue("Shift test: after letter press and release, meta state is " + + bridge.getMetaState() + " when it should be 0", bridge + .getMetaState() == 0); + + bridge.onKey(null, shiftDown.getKeyCode(), shiftDown); + bridge.onKey(null, shiftUp.getKeyCode(), shiftUp); + bridge.onKey(null, shiftDown.getKeyCode(), shiftDown); + bridge.onKey(null, shiftUp.getKeyCode(), shiftUp); + + assertTrue("Shift lock test: after two shift presses, meta state is " + + bridge.getMetaState() + " when it should be " + + TerminalBridge.META_SHIFT_LOCK, + bridge.getMetaState() == TerminalBridge.META_SHIFT_LOCK); + + bridge.onKey(null, letterAdown.getKeyCode(), letterAdown); + + assertTrue( + "Shift lock test: after letter press, meta state is " + + bridge.getMetaState() + " when it should be " + + TerminalBridge.META_SHIFT_LOCK, + bridge.getMetaState() == TerminalBridge.META_SHIFT_LOCK); + + bridge.onKey(null, letterAup.getKeyCode(), letterAup); + + assertTrue( + "Shift lock test: after letter press and release, meta state is " + + bridge.getMetaState() + " when it should be " + + TerminalBridge.META_SHIFT_LOCK, + bridge.getMetaState() == TerminalBridge.META_SHIFT_LOCK); + } +} diff --git a/tests/src/org/connectbot/BeanTestCase.java b/tests/src/org/connectbot/mock/BeanTestCase.java index 442bb6d..5d13d9f 100644 --- a/tests/src/org/connectbot/BeanTestCase.java +++ b/tests/src/org/connectbot/mock/BeanTestCase.java @@ -1,7 +1,7 @@ /** * Originally from http://www.cornetdesign.com/files/BeanTestCase.java.txt */ -package org.connectbot; +package org.connectbot.mock; import junit.framework.TestCase; diff --git a/tests/src/org/connectbot/mock/NullOutputStream.java b/tests/src/org/connectbot/mock/NullOutputStream.java new file mode 100644 index 0000000..38de1e1 --- /dev/null +++ b/tests/src/org/connectbot/mock/NullOutputStream.java @@ -0,0 +1,33 @@ +/* + ConnectBot: simple, powerful, open-source SSH client for Android + Copyright (C) 2007-2008 Kenny Root, Jeffrey Sharkey + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package org.connectbot.mock; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * @author Kenny Root + * + */ +public class NullOutputStream extends OutputStream { + @Override + public void write(int arg0) throws IOException { + // do nothing + } + +} |