/*
* 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.impl.command;
import org.crsh.command.ScriptException;
import org.crsh.shell.AbstractShellTestCase;
import test.command.Commands;
import org.crsh.shell.ErrorKind;
import org.crsh.shell.impl.command.spi.CommandMatch;
import org.crsh.shell.impl.command.spi.Command;
import org.crsh.text.ScreenBuffer;
import java.util.Arrays;
import java.util.Collections;
public class PipeTestCase extends AbstractShellTestCase {
public void testClose() {
lifeCycle.bindClass("closed", Commands.IsClosed.class);
//
Commands.IsClosed.closed.set(0);
assertEquals("", assertOk("closed"));
assertEquals(1, Commands.IsClosed.closed.get());
//
Commands.IsClosed.closed.set(0);
assertEquals("", assertOk("echo abc | closed"));
assertEquals(1, Commands.IsClosed.closed.get());
}
public void testKeepLastPipeContent() throws Exception {
assertEquals("bar", assertOk("echo foo | echo bar"));
}
public void testFlushInPipe() throws Exception {
assertEquals("juu", assertOk("echo -f 1 foo bar | echo juu"));
}
public void testProducerUseWriter() throws Exception {
String cmd = "class foo {\n" +
"@Command\n" +
"public void main(org.crsh.command.InvocationContext<Integer> context) {\n" +
"context.getWriter().print('foo');\n" +
"}\n" +
"}";
lifeCycle.bindGroovy("cmd", cmd);
//
assertEquals("foo", assertOk("cmd"));
}
public void testProducerWithFormatter() throws Exception {
lifeCycle.bindClass("cmd", Commands.ProduceValue.class);
assertEquals("<value>abc</value> \n", assertOk("cmd"));
}
public void testLeftShiftOperator() {
String producer = "class foo {\n" +
"@Command\n" +
"public void main(org.crsh.command.InvocationContext<Integer> context) {\n" +
"context << 'hello';\n" +
"context << 3;\n" +
"}\n" +
"}";
lifeCycle.bindGroovy("producer", producer);
lifeCycle.bindClass("consumer", Commands.ConsumeInteger.class);
//
Commands.list.clear();
assertOk("producer | consumer");
assertEquals(Arrays.<Object>asList(3), Commands.list);
}
public void testAdaptToChunk() {
lifeCycle.bindClass("producer", Commands.ProduceValue.class);
lifeCycle.bindClass("consumer", Commands.ConsumeChunk.class);
Commands.list.clear();
assertOk("producer | consumer");
ScreenBuffer buffer = new ScreenBuffer().append(Commands.list);
assertEquals("<value>abc</value> \n", buffer.toString());
}
public void testLifeCycle() throws Exception {
String consumer =
"class consumer {\n" +
" @Command\n" +
" public org.crsh.command.Pipe<Object, Object> main() {\n" +
" return new org.crsh.command.Pipe<Object, Object>() {\n" +
" public void open() {\n" +
" test.command.Commands.list.add('open');\n" +
" }\n" +
" public void close() {\n" +
" test.command.Commands.list.add('close');\n" +
" }\n" +
" };\n" +
" }\n" +
"}";
//
lifeCycle.bindClass("producer", Commands.Noop.class);
lifeCycle.bindGroovy("consumer", consumer);
//
Commands.list.clear();
assertOk("producer | consumer");
assertEquals(Arrays.<Object>asList("open", "close"), Commands.list);
}
public void testPropagateFlush() throws Exception {
String producer =
"class producer {\n" +
" @Command\n" +
" public org.crsh.command.Pipe<Object, Object> main() {\n" +
" return new org.crsh.command.Pipe<Object, Object>() {\n" +
" public void open() {\n" +
" context.provide(\"whatever\");\n" +
" context.flush();\n" +
" context.provide(\"whatever\");\n" +
" }\n" +
" };\n" +
" }\n" +
"}";
String consumer =
"class consumer {\n" +
" @Command\n" +
" public org.crsh.command.Pipe<Object, Object> main() {\n" +
" return new org.crsh.command.Pipe<Object, Object>() {\n" +
" public void flush() {\n" +
" test.command.Commands.list.add('flush');\n" +
" }\n" +
" };\n" +
" }\n" +
"}";
//
lifeCycle.bindGroovy("producer", producer);
lifeCycle.bindGroovy("consumer", consumer);
//
Commands.list.clear();
assertOk("producer | consumer");
// Producer flush
// Before close flush
assertEquals(Arrays.<Object>asList("flush", "flush"), Commands.list);
}
public void testProvideInFlush() throws Exception {
String producer =
"class producer {\n" +
" @Command\n" +
" public org.crsh.command.Pipe<Object, String> main() {\n" +
" return new org.crsh.command.Pipe<Object, String>() {\n" +
" public void flush() {\n" +
" context.provide('foo');\n" +
" }\n" +
" };\n" +
" }\n" +
"}";
//
lifeCycle.bindGroovy("producer", producer);
lifeCycle.bindClass("consumer", Commands.ConsumeString.class);
//
Commands.list.clear();
assertOk("producer | consumer");
//
assertEquals(Arrays.asList("foo"), Commands.list);
}
public void testProvideInClose() throws Exception {
String producer =
"class producer {\n" +
" @Command\n" +
" public org.crsh.command.Pipe<Object, String> main() {\n" +
" return new org.crsh.command.Pipe<Object, String>() {\n" +
" public void close() {\n" +
" context.provide('foo');\n" +
" }\n" +
" };\n" +
" }\n" +
"}";
//
lifeCycle.bindGroovy("producer", producer);
lifeCycle.bindClass("consumer", Commands.ConsumeString.class);
//
Commands.list.clear();
assertOk("producer | consumer");
//
assertEquals(Arrays.asList("foo"), Commands.list);
}
public void testNotAssignableType() throws Exception {
lifeCycle.bindClass("producer", Commands.ProduceInteger.class);
lifeCycle.bindClass("consumer", Commands.ConsumeBoolean.class);
Commands.list.clear();
assertOk("producer | consumer");
assertEquals(Collections.emptyList(), Commands.list);
}
public void testSameType() throws Exception {
lifeCycle.bindClass("producer", Commands.ProduceInteger.class);
lifeCycle.bindClass("consumer", Commands.ConsumeInteger.class);
Commands.list.clear();
assertOk("producer | consumer");
assertEquals(Arrays.<Object>asList(3), Commands.list);
}
public void testReturnedObjectByJavaIsProduced() throws Exception {
lifeCycle.bindClass("producer", Commands.ReturnInteger.class);
lifeCycle.bindClass("consumer", Commands.ConsumeInteger.class);
Commands.list.clear();
assertOk("producer | consumer");
assertEquals(Arrays.<Object>asList(3), Commands.list);
Command<?> producer = session.getCommand("producer");
CommandMatch<?, ?> commandMatch = producer.resolveCommand("");
assertEquals(Integer.class, commandMatch.getProducedType());
}
public void testReturnedObjectByGroovyIsProduced() throws Exception {
lifeCycle.bindGroovy("producer", "" +
"class producer {\n" +
" @Command\n" +
" public Integer main() {\n" +
" context.session['class'] = getClass();\n" +
" return 3;\n" +
" }\n" +
" }\n");
lifeCycle.bindClass("consumer", Commands.ConsumeInteger.class);
Commands.list.clear();
assertOk("producer | consumer");
assertEquals(Arrays.<Object>asList(3), Commands.list);
Command<?> producer = session.getCommand("producer");
CommandMatch<?, ?> commandMatch = producer.resolveCommand("");
assertEquals(Integer.class, commandMatch.getProducedType());
}
public void testReturnedObjectByGroovyScriptIsProduced() throws Exception {
lifeCycle.bindGroovy("producer", "return 3");
lifeCycle.bindClass("consumer", Commands.ConsumeInteger.class);
Commands.list.clear();
assertOk("producer | consumer");
assertEquals(Arrays.<Object>asList(3), Commands.list);
Command<?> producer = session.getCommand("producer");
CommandMatch<?, ?> commandMatch = producer.resolveCommand("");
assertEquals(Object.class, commandMatch.getProducedType());
}
public void testConsumerThrowsScriptExceptionInProvide() throws Exception {
String consumer =
"class producer {\n" +
" @Command\n" +
" public org.crsh.command.Pipe<Integer, Object> main() {\n" +
" return new org.crsh.command.Pipe<Integer, Object>() {\n" +
" public void provide(Integer element) {\n" +
" throw new org.crsh.command.ScriptException('foo')\n" +
" }\n" +
" };\n" +
" }\n" +
"}\n";
lifeCycle.bindClass("producer", Commands.ProduceInteger.class);
lifeCycle.bindGroovy("consumer", consumer);
Commands.list.clear();
Throwable t = assertError("producer | consumer", ErrorKind.EVALUATION);
ScriptException ex = assertInstance(ScriptException.class, t);
assertEquals("foo", ex.getMessage());
}
public void testBuffer() {
lifeCycle.bindClass("produce_command", Commands.ProduceString.class);
lifeCycle.bindClass("b", Commands.Buffer.class);
lifeCycle.bindClass("consume_command", Commands.ConsumeString.class);
Commands.list.clear();
assertOk("produce_command | consume_command");
assertEquals(2, Commands.list.size());
Commands.list.clear();
assertOk("produce_command | b | consume_command");
assertEquals(2, Commands.list.size());
}
public void testFilter() {
lifeCycle.bindClass("produce_command", Commands.ProduceString.class);
lifeCycle.bindClass("f", Commands.Filter.class);
lifeCycle.bindClass("consume_command", Commands.ConsumeString.class);
Commands.list.clear();
assertOk("produce_command | consume_command");
assertEquals(2, Commands.list.size());
Commands.list.clear();
assertOk("produce_command | f | consume_command");
assertEquals(2, Commands.list.size());
}
public void testBug() {
lifeCycle.bindClass("a", Commands.ProduceString.class);
lifeCycle.bindClass("b", Commands.Id.class);
lifeCycle.bindClass("c", Commands.Count.class);
String result = assertOk("a | b | c");
}
public void testPipeEOL() {
assertError("command |", ErrorKind.SYNTAX);
}
public void testScreenToStringConsumer() {
lifeCycle.bindGroovy("produce_command", "context.append(\"foo\")");
lifeCycle.bindClass("consume_command", Commands.ConsumeString.class);
Commands.list.clear();
assertOk("produce_command | consume_command");
assertEquals(Collections.emptyList(), Commands.list);
}
public void testScreenToCharSequenceConsumer() {
lifeCycle.bindGroovy("produce_command", "context.append(\"foo\")");
lifeCycle.bindClass("consume_command", Commands.ConsumeCharSequence.class);
Commands.list.clear();
assertOk("produce_command | consume_command");
assertEquals(Arrays.<Object>asList("foo"), Commands.list);
}
public void testScreenToObjectConsumer() {
lifeCycle.bindGroovy("produce_command", "context.append(\"foo\")");
lifeCycle.bindClass("consume_command", Commands.ConsumeObject.class);
Commands.list.clear();
assertOk("produce_command | consume_command");
assertEquals(Arrays.<Object>asList("foo"), Commands.list);
}
}