/*
* JBoss, Home of Professional Open Source.
* Copyright 2016, 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.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import java.util.Iterator;
import org.jboss.as.cli.CommandFormatException;
import org.jboss.as.cli.Util;
import org.jboss.as.cli.completion.mock.MockCommandContext;
import org.jboss.as.cli.impl.HeadersArgumentValueConverter;
import org.jboss.as.cli.operation.CommandLineParser;
import org.jboss.as.cli.operation.ParsedOperationRequestHeader;
import org.jboss.as.cli.operation.impl.DefaultCallbackHandler;
import org.jboss.as.cli.operation.impl.DefaultOperationRequestParser;
import org.jboss.as.cli.operation.impl.ParsedRolloutPlanHeader;
import org.jboss.as.cli.operation.impl.SingleRolloutPlanGroup;
import org.jboss.dmr.ModelNode;
import org.junit.Test;
/**
*
* @author Alexey Loubyansky
*/
public class RolloutPlanParsingTestCase {
private final CommandLineParser parser = DefaultOperationRequestParser.INSTANCE;
private final DefaultCallbackHandler handler = new DefaultCallbackHandler();
private final MockCommandContext ctx = new MockCommandContext();
@Test
public void testHeaderListStart() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertTrue(handler.endsOnSeparator());
assertTrue(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertFalse(handler.hasHeaders());
}
@Test
public void testEmptyHeaders() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{}");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertTrue(handler.isRequestComplete());
assertFalse(handler.hasHeaders());
}
@Test
public void testSingleHeader() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ name = value }");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertTrue(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertEquals("name", header.getName());
final ModelNode node = new ModelNode();
node.get("name").set("value");
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testEndsOnHeaderSeparator() throws Exception {
parse(":do{ name = value;");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertTrue(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertEquals("name", header.getName());
final ModelNode node = new ModelNode();
node.get("name").set("value");
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
assertTrue(handler.endsOnHeaderSeparator());
}
@Test
public void testTwoHeaders() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ name1 = value1 ; name2=value2 }");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertTrue(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(2, headers.size());
final Iterator<ParsedOperationRequestHeader> i = headers.iterator();
ParsedOperationRequestHeader header = i.next();
assertEquals("name1", header.getName());
ModelNode node = new ModelNode();
node.get("name1").set("value1");
ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
header = i.next();
assertEquals("name2", header.getName());
node = new ModelNode();
node.get("name2").set("value2");
headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
/* @Test
public void testRolloutWithAProp() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout prop=value");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertTrue(handler.endsOnSeparator());
assertTrue(handler.endsOnHeaderListStart()); // TODO this is kind of strange but ok...
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final List<OperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final OperationRequestHeader header = headers.get(0);
assertTrue(header instanceof RolloutPlanHeader);
final RolloutPlanHeader rollout = (RolloutPlanHeader) header;
assertEquals("value", rollout.getProperty("prop"));
}
@Test
public void testRolloutWithTwoProps() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout prop1=value1 prop2 = value2");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertTrue(handler.endsOnSeparator());
assertTrue(handler.endsOnHeaderListStart()); // TODO this is kind of strange but ok...
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final List<OperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final OperationRequestHeader header = headers.get(0);
assertTrue(header instanceof RolloutPlanHeader);
final RolloutPlanHeader rollout = (RolloutPlanHeader) header;
assertEquals("value1", rollout.getProperty("prop1"));
assertEquals("value2", rollout.getProperty("prop2"));
}
*/
@Test
public void testRolloutSingleGroupName() throws Exception {
//parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout in-series = groupA}");
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA}");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertTrue(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ModelNode node = new ModelNode();
final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
final ModelNode groupA = new ModelNode();
groupA.get("groupA");
inSeries.add().get(Util.SERVER_GROUP).set(groupA);
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testEndsOnGroupPropertiesStart() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA(");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
final SingleRolloutPlanGroup group = rollout.getLastGroup();
assertNotNull(group);
assertEquals("groupA", group.getGroupName());
assertTrue(group.endsOnPropertyListStart());
assertFalse(group.endsOnPropertyListEnd());
assertFalse(group.hasProperties());
}
public void testSpaceBeforeGroupPropertiesStart() throws Exception {
parse(":do{ rollout groupA (");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
final SingleRolloutPlanGroup group = rollout.getLastGroup();
assertNotNull(group);
assertEquals("groupA", group.getGroupName());
assertTrue(group.endsOnPropertyListStart());
assertFalse(group.endsOnPropertyListEnd());
assertFalse(group.hasProperties());
}
@Test
public void testEndsOnGroupPropertiesEnd() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA()");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
final SingleRolloutPlanGroup group = rollout.getLastGroup();
assertNotNull(group);
assertEquals("groupA", group.getGroupName());
assertFalse(group.endsOnPropertyListStart());
assertTrue(group.endsOnPropertyListEnd());
assertFalse(group.hasProperties());
}
@Test
public void testEndsOnGroupPropertyName() throws Exception {
parse(":do{ rollout groupA( prop");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
final SingleRolloutPlanGroup group = rollout.getLastGroup();
assertNotNull(group);
assertEquals("groupA", group.getGroupName());
assertFalse(group.endsOnPropertyListStart());
assertFalse(group.endsOnPropertyListEnd());
assertTrue(group.hasProperties());
assertFalse(group.endsOnPropertyValueSeparator());
assertEquals("prop", group.getLastPropertyName());
assertNull(group.getLastPropertyValue());
assertEquals(21, group.getLastChunkIndex());
}
@Test
public void testEndsOnGroupPropertyNameValueSeparator() throws Exception {
parse(":do{ rollout groupA( prop =");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
final SingleRolloutPlanGroup group = rollout.getLastGroup();
assertNotNull(group);
assertEquals("groupA", group.getGroupName());
assertFalse(group.endsOnPropertyListStart());
assertFalse(group.endsOnPropertyListEnd());
assertTrue(group.hasProperties());
assertTrue(group.endsOnPropertyValueSeparator());
assertEquals("prop", group.getLastPropertyName());
assertNull(group.getLastPropertyValue());
assertEquals(26, group.getLastSeparatorIndex());
}
@Test
public void testEndsOnGroupPropertyValue() throws Exception {
parse(":do{ rollout groupA( prop = v");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
final SingleRolloutPlanGroup group = rollout.getLastGroup();
assertNotNull(group);
assertEquals("groupA", group.getGroupName());
assertFalse(group.endsOnPropertyListStart());
assertFalse(group.endsOnPropertyListEnd());
assertTrue(group.hasProperties());
assertFalse(group.endsOnPropertyValueSeparator());
assertEquals("prop", group.getLastPropertyName());
assertEquals("v", group.getLastPropertyValue());
assertEquals(28, group.getLastChunkIndex());
}
@Test
public void testEndsOnGroupPropertySeparator() throws Exception {
parse(":do{ rollout groupA( prop = v,");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
final SingleRolloutPlanGroup group = rollout.getLastGroup();
assertNotNull(group);
assertEquals("groupA", group.getGroupName());
assertFalse(group.endsOnPropertyListStart());
assertFalse(group.endsOnPropertyListEnd());
assertTrue(group.hasProperties());
assertFalse(group.endsOnPropertyValueSeparator());
assertNull(group.getLastPropertyName());
assertNull(group.getLastPropertyValue());
assertTrue(group.endsOnPropertySeparator());
assertEquals(29, group.getLastSeparatorIndex());
}
@Test
public void testRolloutSingleGroupWithProps() throws Exception {
//parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout in-series=groupA(rolling-to-servers=true,max-failure-percentage=20)");
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA(rolling-to-servers=true,max-failure-percentage=20)");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ModelNode node = new ModelNode();
final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
final ModelNode groupA = new ModelNode();
final ModelNode groupProps = groupA.get("groupA");
groupProps.get("rolling-to-servers").set("true");
groupProps.get("max-failure-percentage").set("20");
inSeries.add().get(Util.SERVER_GROUP).set(groupA);
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testEndsOnGroupComma() throws Exception {
parse(":do{ rollout groupA( prop = v ),");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
assertTrue(rollout.endsOnGroupSeparator());
assertEquals(31, rollout.getLastSeparatorIndex());
}
@Test
public void testEndsOnGroupConcurrent() throws Exception {
parse(":do{ rollout groupA( prop = v ) ^");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
assertTrue(rollout.endsOnGroupSeparator());
assertEquals(32, rollout.getLastSeparatorIndex());
}
@Test
public void testNonConcurrentGroups() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout " +
"groupA(rolling-to-servers=true,max-failure-percentage=20) , groupB");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ModelNode node = new ModelNode();
final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
ModelNode group = new ModelNode();
final ModelNode groupProps = group.get("groupA");
groupProps.get("rolling-to-servers").set("true");
groupProps.get("max-failure-percentage").set("20");
inSeries.add().get(Util.SERVER_GROUP).set(group);
group = new ModelNode();
group.get("groupB");
inSeries.add().get(Util.SERVER_GROUP).set(group);
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testNonConcurrentGroupNames() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA , groupB");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ModelNode node = new ModelNode();
final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
ModelNode group = new ModelNode();
group.get("groupA");
inSeries.add().get(Util.SERVER_GROUP).set(group);
group = new ModelNode();
group.get("groupB");
inSeries.add().get(Util.SERVER_GROUP).set(group);
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testTwoConcurrentGroups() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout " +
"groupA(rolling-to-servers=true,max-failure-percentage=20) ^ groupB");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ModelNode node = new ModelNode();
final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
final ModelNode concurrent = new ModelNode();
final ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);
ModelNode group = cg.get("groupA");
group.get("rolling-to-servers").set("true");
group.get("max-failure-percentage").set("20");
group = cg.get("groupB");
inSeries.add().set(concurrent);
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testTwoConcurrentGroupNames() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA ^ groupB");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ModelNode node = new ModelNode();
final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
final ModelNode concurrent = new ModelNode();
final ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);
cg.get("groupA");
cg.get("groupB");
inSeries.add().set(concurrent);
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testEndsOnHeaderListEnd() throws Exception {
parse(":do{ rollout groupA }");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertTrue(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
assertFalse(rollout.hasProperties());
// assertTrue(rollout.endsOnPropertyListStart());
}
@Test
public void testMix() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout " +
"groupA(rolling-to-servers=true,max-failure-percentage=20) ^ groupB, groupC," +
"groupD(rolling-to-servers=true,max-failed-servers=1) ^ groupE");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ModelNode node = new ModelNode();
final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
ModelNode concurrent = new ModelNode();
ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);
ModelNode group = cg.get("groupA");
group.get("rolling-to-servers").set("true");
group.get("max-failure-percentage").set("20");
group = cg.get("groupB");
inSeries.add().set(concurrent);
ModelNode sg = new ModelNode();
group = sg.get(Util.SERVER_GROUP);
group.get("groupC");
inSeries.add().set(sg);
concurrent = new ModelNode();
cg = concurrent.get(Util.CONCURRENT_GROUPS);
group = cg.get("groupD");
group.get("rolling-to-servers").set("true");
group.get("max-failed-servers").set("1");
group = cg.get("groupE");
inSeries.add().set(concurrent);
final ModelNode headersNode = new ModelNode();
header.addTo(ctx, headersNode);
assertEquals(node, headersNode);
}
@Test
public void testMixAgainstWholeRequest() throws Exception {
parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout " +
"groupA(rolling-to-servers=true,max-failure-percentage=20) ^ groupB, groupC," +
"groupD(rolling-to-servers=true,max-failed-servers=1) ^ groupE rollback-across-groups}");
assertTrue(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertTrue(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ModelNode op = handler.toOperationRequest(ctx);
assertTrue(op.hasDefined(Util.OPERATION_HEADERS));
final ModelNode headersNode = op.get(Util.OPERATION_HEADERS);
final ModelNode expectedHeaders = new ModelNode();
final ModelNode rolloutPlan = expectedHeaders.get(Util.ROLLOUT_PLAN);
final ModelNode inSeries = rolloutPlan.get(Util.IN_SERIES);
ModelNode concurrent = new ModelNode();
ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);
ModelNode group = cg.get("groupA");
group.get("rolling-to-servers").set("true");
group.get("max-failure-percentage").set("20");
group = cg.get("groupB");
inSeries.add().set(concurrent);
ModelNode sg = new ModelNode();
group = sg.get(Util.SERVER_GROUP);
group.get("groupC");
inSeries.add().set(sg);
concurrent = new ModelNode();
cg = concurrent.get(Util.CONCURRENT_GROUPS);
group = cg.get("groupD");
group.get("rolling-to-servers").set("true");
group.get("max-failed-servers").set("1");
cg.get("groupE");
inSeries.add().set(concurrent);
rolloutPlan.get("rollback-across-groups").set("true");
assertEquals(expectedHeaders, headersNode);
}
@Test
public void testRolloutIdWithValue() throws Exception {
parse(":do{ rollout id = myplan}");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertTrue(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
assertEquals("myplan", rollout.getPlanRef());
assertEquals(18, rollout.getLastChunkIndex());
}
@Test
public void testEndsOnPlanRef() throws Exception {
parse(":do{ rollout id=");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(1, headers.size());
final ParsedOperationRequestHeader header = headers.iterator().next();
assertTrue(header instanceof ParsedRolloutPlanHeader);
final ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
assertNull(rollout.getPlanRef());
assertFalse(rollout.hasProperties());
assertNull(rollout.getLastGroup());
assertTrue(rollout.endsOnPlanIdValueSeparator());
assertEquals(15, rollout.getLastSeparatorIndex());
}
@Test
public void testArgumentValueConverter() throws Exception {
final ModelNode node = HeadersArgumentValueConverter.INSTANCE.fromString(ctx, "{ rollout " +
"groupA(rolling-to-servers=true,max-failure-percentage=20) ^ groupB, groupC," +
"groupD(rolling-to-servers=true,max-failed-servers=1) ^ groupE rollback-across-groups}");
final ModelNode expectedHeaders = new ModelNode();
final ModelNode rolloutPlan = expectedHeaders.get(Util.ROLLOUT_PLAN);
final ModelNode inSeries = rolloutPlan.get(Util.IN_SERIES);
ModelNode concurrent = new ModelNode();
ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);
ModelNode group = cg.get("groupA");
group.get("rolling-to-servers").set("true");
group.get("max-failure-percentage").set("20");
group = cg.get("groupB");
inSeries.add().set(concurrent);
ModelNode sg = new ModelNode();
group = sg.get(Util.SERVER_GROUP);
group.get("groupC");
inSeries.add().set(sg);
concurrent = new ModelNode();
cg = concurrent.get(Util.CONCURRENT_GROUPS);
group = cg.get("groupD");
group.get("rolling-to-servers").set("true");
group.get("max-failed-servers").set("1");
cg.get("groupE");
inSeries.add().set(concurrent);
rolloutPlan.get("rollback-across-groups").set("true");
assertEquals(expectedHeaders, node);
}
@Test
public void testRollout() throws Exception {
parse(":do{rollout");
assertFalse(handler.hasAddress());
assertTrue(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertFalse(handler.endsOnSeparator());
assertFalse(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertTrue(handler.hasHeaders());
final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
assertEquals(0, headers.size());
assertEquals("rollout", handler.getLastHeaderName());
}
@Test
public void testOnlyHeaderListStart() throws Exception {
parse("{");
assertFalse(handler.hasAddress());
assertFalse(handler.hasOperationName());
assertFalse(handler.hasProperties());
assertFalse(handler.endsOnAddressOperationNameSeparator());
assertFalse(handler.endsOnPropertyListStart());
assertFalse(handler.endsOnPropertySeparator());
assertFalse(handler.endsOnPropertyValueSeparator());
assertFalse(handler.endsOnNodeSeparator());
assertFalse(handler.endsOnNodeTypeNameSeparator());
assertTrue(handler.endsOnSeparator());
assertTrue(handler.endsOnHeaderListStart());
assertFalse(handler.isRequestComplete());
assertFalse(handler.hasHeaders());
}
@Test
public void testImplictBooleanValueInGroupProperties() throws Exception {
parse("{rollout grp1(prop1,prop2,prop3,prop4=toto,prop5)}");
assertTrue(handler.getHeaders().size() == 1);
final ParsedRolloutPlanHeader rollout
= (ParsedRolloutPlanHeader) handler.getHeaders().
iterator().next();
SingleRolloutPlanGroup grp = rollout.getLastGroup();
assertTrue(grp.hasProperty("prop1"));
assertTrue(grp.hasProperty("prop2"));
assertTrue(grp.hasProperty("prop3"));
assertTrue(grp.hasProperty("prop4"));
assertTrue(grp.hasProperty("prop5"));
ModelNode mn = grp.toModelNode();
assertTrue(mn.get("prop1").asBoolean());
assertTrue(mn.get("prop2").asBoolean());
assertTrue(mn.get("prop3").asBoolean());
assertTrue(mn.get("prop4").asString().equals("toto"));
assertTrue(mn.get("prop5").asBoolean());
}
protected void parse(String opReq) throws CommandFormatException {
handler.reset();
parser.parse(opReq, handler);
}
}