/*
* JBoss, Home of Professional Open Source.
* Copyright 2015, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* 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.jboss.as.cli.parsing.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.jboss.as.cli.CommandFormatException;
import org.jboss.as.cli.Util;
import org.jboss.as.cli.parsing.StateParser;
import org.jboss.as.cli.parsing.arguments.ArgumentValueCallbackHandler;
import org.jboss.as.cli.parsing.arguments.ArgumentValueInitialState;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.jboss.dmr.Property;
import org.junit.Test;
/**
*
* @author Alexey Loubyansky
*/
public class ArgumentValueParsingTestCase {
@Test
public void testExpressionOnly() throws Exception {
final ModelNode value = parse("${test.expression}");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("${test.expression}", value.asString());
}
@Test
public void testExpressionInTheMiddleOnly() throws Exception {
final ModelNode value = parse("test ${expression} in the middle");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("test ${expression} in the middle", value.asString());
}
@Test
public void testQuotedExpression() throws Exception {
final ModelNode value = parse("\"${test.expression}\"");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("${test.expression}", value.asString());
}
@Test
public void testSimpleString() throws Exception {
final ModelNode value = parse("text");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("text", value.asString());
}
@Test
public void testListInBrackets() throws Exception {
final ModelNode value = parse("[a,b,c]");
assertNotNull(value);
assertEquals(ModelType.LIST, value.getType());
final List<ModelNode> list = value.asList();
assertEquals(3, list.size());
assertNotNull(list.get(0));
assertEquals("a", list.get(0).asString());
assertNotNull(list.get(1));
assertEquals("b", list.get(1).asString());
assertNotNull(list.get(2));
assertEquals("c", list.get(2).asString());
}
@Test
public void testNestedList() throws Exception {
final ModelNode value = parse("[a,b,[c,d]]");
assertNotNull(value);
assertEquals(ModelType.LIST, value.getType());
List<ModelNode> list = value.asList();
assertEquals(3, list.size());
assertNotNull(list.get(0));
assertEquals("a", list.get(0).asString());
assertNotNull(list.get(1));
assertEquals("b", list.get(1).asString());
final ModelNode c = list.get(2);
assertNotNull(c);
assertEquals(ModelType.LIST, c.getType());
list = c.asList();
assertEquals(2, list.size());
assertEquals("c", c.get(0).asString());
assertEquals("d", c.get(1).asString());
}
@Test
public void testListNoBrackets() throws Exception {
final ModelNode value = parse("a,b,c");
assertNotNull(value);
assertEquals(ModelType.LIST, value.getType());
final List<ModelNode> list = value.asList();
assertEquals(3, list.size());
assertNotNull(list.get(0));
assertEquals("a", list.get(0).asString());
assertNotNull(list.get(1));
assertEquals("b", list.get(1).asString());
assertNotNull(list.get(2));
assertEquals("c", list.get(2).asString());
}
@Test
public void testPropertyListInBrackets() throws Exception {
final ModelNode value = parse("[a=b,c=d]");
assertNotNull(value);
assertEquals(ModelType.LIST, value.getType());
final List<Property> list = value.asPropertyList();
assertEquals(2, list.size());
Property prop = list.get(0);
assertNotNull(prop);
assertEquals("a", prop.getName());
assertEquals("b", prop.getValue().asString());
prop = list.get(1);
assertNotNull(prop);
assertEquals("c", prop.getName());
assertEquals("d", prop.getValue().asString());
}
@Test
public void testObject() throws Exception {
final ModelNode value = parse("a=b,c=d");
assertNotNull(value);
assertEquals(ModelType.OBJECT, value.getType());
final List<Property> list = value.asPropertyList();
assertEquals(2, list.size());
Property prop = list.get(0);
assertNotNull(prop);
assertEquals("a", prop.getName());
assertEquals("b", prop.getValue().asString());
prop = list.get(1);
assertNotNull(prop);
assertEquals("c", prop.getName());
assertEquals("d", prop.getValue().asString());
}
@Test
public void testObjectInBraces() throws Exception {
final ModelNode value = parse("{a=b,c=d}");
assertNotNull(value);
assertEquals(ModelType.OBJECT, value.getType());
final List<Property> list = value.asPropertyList();
assertEquals(2, list.size());
Property prop = list.get(0);
assertNotNull(prop);
assertEquals("a", prop.getName());
assertEquals("b", prop.getValue().asString());
prop = list.get(1);
assertNotNull(prop);
assertEquals("c", prop.getName());
assertEquals("d", prop.getValue().asString());
}
@Test
public void testObjectWithList() throws Exception {
final ModelNode value = parse("a=b,c=[d,e]");
assertNotNull(value);
assertEquals(ModelType.OBJECT, value.getType());
final List<Property> list = value.asPropertyList();
assertEquals(2, list.size());
Property prop = list.get(0);
assertNotNull(prop);
assertEquals("a", prop.getName());
assertEquals("b", prop.getValue().asString());
prop = list.get(1);
assertNotNull(prop);
assertEquals("c", prop.getName());
final ModelNode de = prop.getValue();
assertEquals(ModelType.LIST, de.getType());
final List<ModelNode> deList = de.asList();
assertEquals(2, deList.size());
assertEquals("d", deList.get(0).asString());
assertEquals("e", deList.get(1).asString());
}
@Test
public void testObjectWithChildObject() throws Exception {
final ModelNode value = parse("a=b,c={d=e}");
assertNotNull(value);
assertEquals(ModelType.OBJECT, value.getType());
final List<Property> list = value.asPropertyList();
assertEquals(2, list.size());
Property prop = list.get(0);
assertNotNull(prop);
assertEquals("a", prop.getName());
assertEquals("b", prop.getValue().asString());
prop = list.get(1);
assertNotNull(prop);
assertEquals("c", prop.getName());
final ModelNode de = prop.getValue();
assertEquals(ModelType.OBJECT, de.getType());
assertEquals(1, de.keys().size());
assertEquals("e", de.get("d").asString());
}
@Test
public void testObjectWithPropertyList() throws Exception {
final ModelNode value = parse("a=b,c=[d=e,f=g]");
assertNotNull(value);
assertEquals(ModelType.OBJECT, value.getType());
final List<Property> list = value.asPropertyList();
assertEquals(2, list.size());
Property prop = list.get(0);
assertNotNull(prop);
assertEquals("a", prop.getName());
assertEquals("b", prop.getValue().asString());
prop = list.get(1);
assertNotNull(prop);
assertEquals("c", prop.getName());
final ModelNode c = prop.getValue();
assertEquals(ModelType.LIST, c.getType());
final List<Property> propList = c.asPropertyList();
assertEquals(2, propList.size());
prop = propList.get(0);
assertEquals("d", prop.getName());
assertEquals("e", prop.getValue().asString());
prop = propList.get(1);
assertEquals("f", prop.getName());
assertEquals("g", prop.getValue().asString());
}
@Test
public void testListOfObjects() throws Exception {
final ModelNode value = parse("[{a=b},{c=[d=e,f={g=h}]}]");
assertNotNull(value);
assertEquals(ModelType.LIST, value.getType());
final List<ModelNode> list = value.asList();
assertEquals(2, list.size());
ModelNode item = list.get(0);
assertNotNull(item);
assertEquals(1, item.keys().size());
assertEquals("b", item.get("a").asString());
item = list.get(1);
assertNotNull(item);
assertEquals(1, item.keys().size());
item = item.get("c");
assertTrue(item.isDefined());
assertEquals(ModelType.LIST, item.getType());
final List<Property> propList = item.asPropertyList();
assertEquals(2, propList.size());
Property prop = propList.get(0);
assertEquals("d", prop.getName());
assertEquals("e", prop.getValue().asString());
prop = propList.get(1);
assertEquals("f", prop.getName());
final ModelNode gh = prop.getValue();
assertEquals(1, gh.keys().size());
assertEquals("h", gh.get("g").asString());
}
@Test
public void testMix() throws Exception {
final ModelNode value = parse("a=b,c=[d=e,f={g=h}]");
assertNotNull(value);
assertEquals(ModelType.OBJECT, value.getType());
final List<Property> list = value.asPropertyList();
assertEquals(2, list.size());
Property prop = list.get(0);
assertNotNull(prop);
assertEquals("a", prop.getName());
assertEquals("b", prop.getValue().asString());
prop = list.get(1);
assertNotNull(prop);
assertEquals("c", prop.getName());
final ModelNode c = prop.getValue();
assertEquals(ModelType.LIST, c.getType());
final List<Property> propList = c.asPropertyList();
assertEquals(2, propList.size());
prop = propList.get(0);
assertEquals("d", prop.getName());
assertEquals("e", prop.getValue().asString());
prop = propList.get(1);
assertEquals("f", prop.getName());
final ModelNode gh = prop.getValue();
assertEquals(1, gh.keys().size());
assertEquals("h", gh.get("g").asString());
}
@Test
public void testOpeningCurlyBracesInValue() throws Exception {
ModelNode value = parse(">{b\\=c}");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals(">{b=c}", value.asString());
value = parse(">\\{b\\=c}");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals(">{b=c}", value.asString());
}
@Test
public void testOpeningBracketInValue() throws Exception {
ModelNode value = parse("a[bc");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("a[bc", value.asString());
value = parse("a\\[bc");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("a[bc", value.asString());
value = parse("a \\[ b c");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("a [ b c", value.asString());
}
@Test
public void testDeactivatedEqualsSign() throws Exception {
final ModelNode value = parse("a=b{c[d=e]}]}");
assertNotNull(value);
assertEquals(ModelType.OBJECT, value.getType());
assertEquals(1, value.keys().size());
final ModelNode a = value.get("a");
assertTrue(a.isDefined());
assertEquals(ModelType.STRING, a.getType());
assertEquals("b{c[d=e]}]}", a.asString());
}
@Test
public void testAny() throws Exception {
ModelNode value = parse("\"any(not(match(\\\"Prepared response is\\\")),match(\\\"Scanning\\\"))\"");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("any(not(match(\"Prepared response is\")),match(\"Scanning\"))", value.asString());
value = parse("any(not(match(\"Prepared response is\")),match(\"Scanning\"))");
assertNotNull(value);
assertEquals(ModelType.LIST, value.getType());
final List<ModelNode> list = value.asList();
assertEquals(2, list.size());
ModelNode item = list.get(0);
assertEquals(ModelType.STRING, item.getType());
assertEquals("any(not(match(\"Prepared response is\"))", item.asString());
item = list.get(1);
assertEquals(ModelType.STRING, item.getType());
assertEquals("match(\"Scanning\"))", item.asString());
}
@Test
public void testQuotesAndSpaces() throws Exception {
ModelNode value = parse("\" \"");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals(" ", value.asString());
value = parse(" \" \"");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals(" ", value.asString());
value = parse(" \" \\\"\"");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals(" \"", value.asString());
}
@Test
public void testEscapedQuotes() throws Exception {
ModelNode value = parse("\"substituteAll(\\\"JBAS\\\",\\\"DUMMY\\\")\"");
assertNotNull(value);
assertEquals(ModelType.STRING, value.getType());
assertEquals("substituteAll(\"JBAS\",\"DUMMY\")", value.asString());
}
@Test
public void testLoginModules() throws Exception {
ModelNode value = parse("[{code=Database, flag=required, module-options=[unauthenticatedIdentity=guest," +
"dsJndiName=java:jboss/jdbc/ApplicationDS," +
"principalsQuery= select password from users where username=? ," +
"rolesQuery = \"select name, 'Roles' FROM user_roless ur, roles r, user u WHERE u.username=? and u.id = ur.user_id and ur.role_id = r.id\" ," +
"hashAlgorithm = MD5,hashEncoding = hex] }]");
assertLoginModules(value);
}
@Test
public void testLoginModulesWithLineBreaks() throws Exception {
final StringBuilder buf = new StringBuilder();
buf.append("[ \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t{ \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\tcode=Database, \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\tflag= \\").append(Util.LINE_SEPARATOR).append("required, \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t").append("module-options=[ \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t\t\t").append("unauthenticatedIdentity=guest, \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t\t\t").append("dsJndiName=java:jboss/jdbc/ApplicationDS, \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t\t\t").append("principalsQuery= select password from users where username=? , \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t\t\t").append("rolesQuery = \"select name, 'Roles' FROM user_roless ur, roles r, user u WHERE u.username=? and u.id = ur.user_id and ur.role_id = r.id\" , \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t\t\t").append("hashAlgorithm = MD5, \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t\t\t").append("hashEncoding = hex \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t\t\t").append("] \\").append(Util.LINE_SEPARATOR);
buf.append("\t\t} \\").append(Util.LINE_SEPARATOR);
buf.append(']');
ModelNode value = parse(buf.toString());
assertLoginModules(value);
}
@Test
public void testWFCORE600() throws Exception {
ModelNode value = parse("[{ c=[s], m=s, p=[{k=a,v=b},{k=b,v=c}] }]");
assertEquals(ModelType.LIST, value.getType());
List<ModelNode> list = value.asList();
assertEquals(1, list.size());
value = list.get(0);
assertEquals(ModelType.OBJECT, value.getType());
assertEquals(3, value.keys().size());
assertTrue(value.hasDefined("c"));
ModelNode prop = value.get("c");
assertEquals(ModelType.LIST, prop.getType());
list = prop.asList();
assertEquals(1, list.size());
assertEquals("s", list.get(0).asString());
assertTrue(value.hasDefined("m"));
prop = value.get("m");
assertEquals(ModelType.STRING, prop.getType());
assertEquals("s", prop.asString());
assertTrue(value.hasDefined("p"));
prop = value.get("p");
assertEquals(ModelType.LIST, prop.getType());
list = prop.asList();
assertEquals(2, list.size());
value = list.get(0);
assertEquals(ModelType.OBJECT, value.getType());
assertEquals(2, value.keys().size());
assertTrue(value.hasDefined("k"));
assertEquals("a", value.get("k").asString());
assertTrue(value.hasDefined("v"));
assertEquals("b", value.get("v").asString());
value = list.get(1);
assertEquals(ModelType.OBJECT, value.getType());
assertEquals(2, value.keys().size());
assertTrue(value.hasDefined("k"));
assertEquals("b", value.get("k").asString());
assertTrue(value.hasDefined("v"));
assertEquals("c", value.get("v").asString());
}
protected void assertLoginModules(ModelNode value) {
assertNotNull(value);
assertEquals(ModelType.LIST, value.getType());
List<ModelNode> list = value.asList();
assertEquals(1, list.size());
value = list.get(0);
assertEquals("Database", value.get("code").asString());
assertEquals("required", value.get("flag").asString());
value = value.get("module-options");
assertEquals(ModelType.LIST, value.getType());
list = value.asList();
assertEquals(6, list.size());
assertEquals("guest", list.get(0).get("unauthenticatedIdentity").asString());
assertEquals("java:jboss/jdbc/ApplicationDS", list.get(1).get("dsJndiName").asString());
assertEquals("select password from users where username=?", list.get(2).get("principalsQuery").asString());
assertEquals("select name, 'Roles' FROM user_roless ur, roles r, user u WHERE u.username=? and u.id = ur.user_id and ur.role_id = r.id", list.get(3).get("rolesQuery").asString());
assertEquals("MD5", list.get(4).get("hashAlgorithm").asString());
assertEquals("hex", list.get(5).get("hashEncoding").asString());
}
protected ModelNode parse(String str) throws CommandFormatException {
final ArgumentValueCallbackHandler handler = new ArgumentValueCallbackHandler();
StateParser.parse(str, handler, ArgumentValueInitialState.INSTANCE);
return handler.getResult();
}
}