/* * Copyright 1999-2006 University of Chicago * * Licensed 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.globus.rsl.tests; import org.globus.rsl.*; import java.util.*; import java.io.*; import junit.framework.*; import junit.extensions.*; public class RSLParserTest extends TestCase { private Properties validRsls; private Properties invalidRsls; public RSLParserTest(String name) { super(name); } public static void main (String[] args) { junit.textui.TestRunner.run (suite()); } public static Test suite() { return new TestSuite(RSLParserTest.class); } public void setUp() { validRsls = new Properties(); validRsls.put("rsl1", "+(&(executable=myprogram)(stdin<2.4))(&(stdin=8) \n\n\n(stdin=0))"); validRsls.put("rsl2", "&(executable=myprogram)(stdin<2.4)(stdin=8)(stdin=0)"); validRsls.put("rsl3", "&(a=a)(a=b)"); validRsls.put("rsl4", " &(a=a)"); validRsls.put("rsl5", "(* dont use this comment *)\n&(string=\"my name is \"\"Nick Karonis\"\" today\") (*or this one*)"); validRsls.put("rsl6", "&(&(&(&(a=a))))"); validRsls.put("rsl7", "&(args=\"aa ) bb\")"); validRsls.put("rsl8", "+(&(executable=myprogram)(stdin<2.4))(|(stdin=8) \n\n\n(stdin=0))"); validRsls.put("rsl9", "+(&(executable=myprogram)(stdin<2.4)(|(a=bbb)(yyy=z)))(|(stdin=8) \n\n\n(stdin=0))"); validRsls.put("rsl10", "&(args=hello \n\n)"); validRsls.put("rsl11", "&(executable=\"\")"); validRsls.put("rsl12", "&(executable=\"abc \"\" \"\" def\")"); //validRsls.put("rsl13", "args=\"aa ) \"\"bb cc dd\""); validRsls.put("rsl14", "&((*comment*)string(*comment*) \n=(*comment\ncontinue comment*)\"my (* ok *) name is \"\"Nick Karonis\"\" today\"(*comment*)) (* or this one *)"); validRsls.put("rsl15", "&(* dont use this comment *)\n(\n(*comment*)string(*comment*)\n=(*comment\ncontinue comment*)\"my name is \"\"Nick Karonis\"\" today\"(*comment*)) (*or this one*)"); //validRsls.put("rsl16", "(* dont use this comment *)\n(* comment*) string (* comment*)\n=(*comment\ncontinue comment*)\"my name is \"\"Nick Karonis\"\" today\"(*comment*) (*or this one*)"); validRsls.put("rsl17", "+(* dont use this comment *)\n((*comment*)string(*comment*)=(*comment\ncontinue comment*)\"my name is \"\"Nick Karonis\"\" today\"(*comment*)) (*or this one*)"); validRsls.put("rsl18", "+(string='let''s try ''single quotes'' with \"double too\" ok')"); invalidRsls = new Properties(); invalidRsls.put("rsl1", "(my executable=a.out)"); invalidRsls.put("rsl2", "(executable=/home /a.ou:t#22)"); invalidRsls.put("rsl3", "&(args=dddd)(executable=)(more_args=ooo)"); invalidRsls.put("rsl4", "(executable=^$test $$$ quotes$)"); invalidRsls.put("rsl5", "(executable=^$my value $ \nmore \"\"\" stuff)"); invalidRsls.put("rsl6", "(executable=)"); invalidRsls.put("rsl7", "(args=\"\"a\"\"b\")"); invalidRsls.put("rsl8", "(args=hello \n\nworld)"); invalidRsls.put("rsl9", "(arguments=\"ccc ddd\"\"zzz\"\")"); //invalidRsls.put("rsl10", "&(arguments=\"\"\"\"\")(exe=abc)"); invalidRsls.put("rsl11", "(a=a)"); invalidRsls.put("rsl12", "+(&(executable=myprogram)(stdin<2.4))(+(stdin=8) \n\n\n(stdin=0))+"); invalidRsls.put("rsl13", "(=a.out)"); invalidRsls.put("rsl14", "(executable=\")"); invalidRsls.put("rsl15", "(executable=^\")"); invalidRsls.put("rsl16", "(executable=^/)"); } public void testAdvanced() throws Exception { String rsl = "&(arguments = -e '$GLOBUS_SH_PERL -e ''print STDERR \"stderr\n\"; '" + "# 'print STDOUT \"stdout\n\";''')"; RslNode node = RSLParser.parse(rsl); NameOpValue nv = null; List values; nv = node.getParam("ARGUMENTS"); values = nv.getValues(); assertEquals("arg size", 2, values.size()); assertEquals("arg 1", "-e", ((Value)values.get(0)).getValue() ); String e = "$GLOBUS_SH_PERL -e 'print STDERR \"stderr\n\"; print STDOUT \"stdout\n\";'"; assertEquals("arg 2", e, ((Value)values.get(1)).getCompleteValue() ); } public void testSlash() throws Exception { String rsl; RslNode node; rsl = "&(executable=/bin/echo)(arguments=\\)"; node = RSLParser.parse(rsl); NameOpValue nv = null; List values; nv = node.getParam("ARGUMENTS"); values = nv.getValues(); assertEquals("arg size", 1, values.size()); assertEquals("arg 1", "\\", ((Value)values.get(0)).getCompleteValue() ); rsl = "&(executable=/bin/echo)(arguments=\"\\\")"; node = RSLParser.parse(rsl); assertEquals("arg size", 1, values.size()); assertEquals("arg 1", "\\", ((Value)values.get(0)).getCompleteValue() ); } public void testValid() { Enumeration e = validRsls.keys(); String key; String rsl; while(e.hasMoreElements()) { key = (String)e.nextElement(); rsl = validRsls.getProperty(key); System.out.println("Parsing valid rsl " + key + ": " + rsl); try { RSLParser.parse(rsl); } catch(Exception ex) { ex.printStackTrace(); fail("Failed to parse!!!"); } } } public void testInvalid() { Enumeration e = invalidRsls.keys(); String key; String rsl; while(e.hasMoreElements()) { key = (String)e.nextElement(); rsl = invalidRsls.getProperty(key); System.out.println("Parsing invalid rsl " + key + ": " + rsl); try { RslNode tree = RSLParser.parse(rsl); fail("Failed to catch parse error of " + rsl); } catch(Exception ex) { } } } public void testQuotes() throws Exception { String rsl; RslNode node; rsl = "&(arg1=\"foo\"\"bar\")(arg2='foo''bar')(arg3='')(arg4=\"\")" + "(executable=\"/bin/echo\")(arguments='mis')"; node = RSLParser.parse(rsl); testQuotesSub(node); rsl = node.toString(); node = RSLParser.parse(rsl); testQuotesSub(node); } private void testQuotesSub(RslNode node) { NameOpValue nv = null; List values; nv = node.getParam("arg1"); values = nv.getValues(); assertEquals("arg1", "foo\"bar", ((Value)values.get(0)).getCompleteValue() ); nv = node.getParam("arg2"); values = nv.getValues(); assertEquals("arg2", "foo'bar", ((Value)values.get(0)).getCompleteValue() ); nv = node.getParam("arg3"); values = nv.getValues(); assertEquals("arg3", "", ((Value)values.get(0)).getCompleteValue() ); nv = node.getParam("arg4"); values = nv.getValues(); assertEquals("arg4", "", ((Value)values.get(0)).getCompleteValue() ); nv = node.getParam("executable"); values = nv.getValues(); assertEquals("executable", "/bin/echo", ((Value)values.get(0)).getCompleteValue() ); nv = node.getParam("arguments"); values = nv.getValues(); assertEquals("arguments", "mis", ((Value)values.get(0)).getCompleteValue() ); } }