/*
* Copyright (C) 2012 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.crsh.shell;
import test.shell.base.BaseProcessContext;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* @author Julien Viet
*/
public class KeyHandlerTestCase extends AbstractShellTestCase {
public void testCommand() throws Exception {
testKeyHandler("public class foo implements org.crsh.keyboard.KeyHandler {\n" +
"public void handle(org.crsh.keyboard.KeyType type, int[] sequence) { queue.add(sequence); latch2.countDown(); }\n" +
"@Command\n" +
"public void main() {\n" +
"latch1.countDown();" +
"latch2.await(10, java.util.concurrent.TimeUnit.SECONDS);" +
"}\n" +
"}\n");
}
public void testPipeCommand() throws Exception {
testKeyHandler("public class foo {\n" +
" static class PipeImpl extends org.crsh.command.Pipe<Object, String> implements org.crsh.keyboard.KeyHandler {\n" +
" java.util.concurrent.CountDownLatch l1\n" +
" java.util.concurrent.CountDownLatch l2\n" +
" java.util.concurrent.ArrayBlockingQueue q\n" +
" PipeImpl(java.util.concurrent.ArrayBlockingQueue queue, java.util.concurrent.CountDownLatch latch1, java.util.concurrent.CountDownLatch latch2) {\n" +
" q = queue;\n" +
" l1 = latch1;\n" +
" l2 = latch2;\n" +
" }\n" +
" public void handle(org.crsh.keyboard.KeyType type, int[] sequence) { q.add(sequence); l2.countDown(); }\n" +
" public void close() {\n" +
" l1.countDown();" +
" l2.await(10, java.util.concurrent.TimeUnit.SECONDS);" +
" }\n" +
" }\n" +
" @Command\n" +
" public org.crsh.command.Pipe<Object, String> main() {\n" +
" return new PipeImpl(queue, latch1, latch2);\n" +
" }\n" +
"}\n");
}
private void testKeyHandler(String command) throws Exception {
CountDownLatch latch1 = new CountDownLatch(1);
ArrayBlockingQueue<int[]> queue = new ArrayBlockingQueue<int[]>(1);
groovyShell.setVariable("queue", queue);
groovyShell.setVariable("latch1", latch1);
groovyShell.setVariable("latch2", new CountDownLatch(1));
lifeCycle.bindGroovy("foo", command);
final BaseProcessContext process = create("foo");
new Thread() {
@Override
public void run() {
process.execute();
}
}.start();
latch1.await(10, TimeUnit.SECONDS);
process.on(null, new int[]{'a'});
ShellResponse response = process.getResponse();
assertInstance(ShellResponse.Ok.class, response);
int[] event = queue.poll(10, TimeUnit.SECONDS);
assertEquals(1, event.length);
assertEquals('a', event[0]);
}
}