| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.felix.gogo.runtime; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.io.Reader; |
| import java.io.StringWriter; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import java.nio.file.Paths; |
| import java.util.Arrays; |
| |
| import org.junit.Test; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.fail; |
| |
| /* |
| * Test features of the new parser/tokenizer, many of which are not supported |
| * by the original parser. |
| */ |
| public class TestParser4 extends AbstractParserTest |
| { |
| public void testPipeErr() throws Exception |
| { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("echoerr", this); |
| c.addCommand("tac", this); |
| |
| assertEquals("hello\n", c.execute("echo hello| tac")); |
| assertEquals("hello\n", c.execute("echoerr hello|& tac")); |
| } |
| |
| @Test |
| public void testRedir() throws Exception { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("tac", this); |
| |
| Path path = Paths.get("target/tmp"); |
| Files.createDirectories(path); |
| c.currentDir(path); |
| |
| Files.deleteIfExists(path.resolve("foo")); |
| assertEquals("hello\n", c.execute("echo hello>foo | tac")); |
| assertEquals("hello\n", new String(Files.readAllBytes(path.resolve("foo")))); |
| |
| Files.deleteIfExists(path.resolve("foo2")); |
| assertEquals("hello\n", c.execute("echo hello>\\\nfoo2 | tac")); |
| } |
| |
| @Test |
| public void testRedirInput() throws Exception |
| { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("tac", this); |
| c.addCommand("cat", this); |
| |
| Path path = Paths.get("target/tmp"); |
| Files.createDirectories(path); |
| c.currentDir(path); |
| |
| Files.deleteIfExists(path.resolve("fooa")); |
| Files.deleteIfExists(path.resolve("foob")); |
| c.execute("echo a>fooa"); |
| c.execute("echo b>foob"); |
| assertEquals("a\nb\n", c.execute("cat <fooa <foob | tac")); |
| } |
| |
| @Test |
| public void testMultiInput() throws Exception |
| { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("tac", this); |
| c.addCommand("cat", this); |
| |
| Path path = Paths.get("target/tmp"); |
| Files.createDirectories(path); |
| c.currentDir(path); |
| |
| Files.deleteIfExists(path.resolve("fooa")); |
| Files.deleteIfExists(path.resolve("foob")); |
| c.execute("echo a>fooa"); |
| c.execute("echo b>foob"); |
| assertEquals("foo\na\nb\n", c.execute("echo foo | cat <fooa | cat<foob | tac")); |
| } |
| |
| @Test |
| public void testRedirectWithVar() throws Exception |
| { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("tac", this); |
| c.addCommand("cat", this); |
| |
| Path path = Paths.get("target/tmp"); |
| Files.createDirectories(path); |
| c.currentDir(path); |
| |
| c.execute("a=foo"); |
| c.execute("echo bar > $a"); |
| assertEquals("bar\n", c.execute("cat <$a | tac")); |
| |
| // Empty var |
| try { |
| c.execute("echo bar > $b"); |
| fail("Expected IOException"); |
| } catch (IOException e) { |
| } |
| |
| try { |
| c.execute("cat < $b"); |
| fail("Expected IOException"); |
| } catch (IOException e) { |
| } |
| |
| // Array var |
| c.execute("c = [ ar1 ar2 ]"); |
| c.execute("echo bar > $c"); |
| assertEquals("bar\nbar\n", c.execute("cat <$c | tac")); |
| } |
| |
| @Test |
| public void testHereString() throws Exception |
| { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("tac", this); |
| c.addCommand("cat", this); |
| |
| c.execute("a=foo"); |
| assertEquals("foo\n", c.execute("cat <<< $a | tac")); |
| |
| c.execute("c = [ ar1 ar2 ]"); |
| assertEquals("ar1 ar2\n", c.execute("cat <<<$c | tac")); |
| } |
| |
| @Test |
| public void testHereDoc() throws Exception |
| { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("tac", this); |
| c.addCommand("cat", this); |
| |
| assertEquals("bar\nbaz\n", c.execute("cat <<foo\nbar\nbaz\nfoo\n| tac")); |
| assertEquals("bar\nbaz\n", c.execute("cat <<-foo\n\tbar\n\tbaz\n\tfoo\n| tac")); |
| } |
| |
| @Test |
| public void testArrays() throws Exception |
| { |
| Context c = new Context(); |
| c.addCommand("echo", this); |
| c.addCommand("tac", this); |
| c.addCommand("cat", this); |
| |
| c.execute("a = [ 1 2 3 ]"); |
| c.execute("b = [ a b c ]"); |
| c.execute("c = [ ${a[@]} ${b[@]} ]"); |
| assertEquals(Arrays.asList(1L, 2L, 3L), c.get("a")); |
| assertEquals(Arrays.asList("a", "b", "c"), c.get("b")); |
| assertEquals(Arrays.asList(1L, 2L, 3L, "a", "b", "c"), c.get("c")); |
| |
| c.execute("d = [ \"foo\" ${b[@]} ]"); |
| assertEquals(Arrays.asList("foo", "a", "b", "c"), c.get("d")); |
| c.execute("d = [ \"foo\" $b ]"); |
| assertEquals(Arrays.asList("foo", Arrays.asList("a", "b", "c")), c.get("d")); |
| } |
| |
| public void echo(String msg) |
| { |
| System.out.println(msg); |
| } |
| |
| public void echoerr(String msg) |
| { |
| System.err.println(msg); |
| } |
| |
| public void cat() throws IOException { |
| try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { |
| String line; |
| while ((line = reader.readLine()) != null) { |
| System.out.println(line); |
| } |
| } |
| } |
| |
| public String tac() throws IOException { |
| StringWriter sw = new StringWriter(); |
| Reader rdr = new InputStreamReader(System.in); |
| char[] buf = new char[1024]; |
| int len; |
| while ((len = rdr.read(buf)) >= 0) { |
| sw.write(buf, 0, len); |
| } |
| return sw.toString(); |
| } |
| |
| } |