/* * JBoss, Home of Professional Open Source. * Copyright 2012, 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.core.model.test.socketbindinggroups; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CLIENT_MAPPINGS; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.PORT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SOCKET_BINDING; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SOCKET_BINDING_GROUP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION; import java.util.List; import org.jboss.as.controller.ModelVersion; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.resource.AbstractSocketBindingResourceDefinition; import org.jboss.as.controller.transform.OperationTransformer; import org.jboss.as.core.model.test.AbstractCoreModelTest; import org.jboss.as.core.model.test.KernelServices; import org.jboss.as.core.model.test.KernelServicesBuilder; import org.jboss.as.core.model.test.LegacyKernelServicesInitializer; import org.jboss.as.core.model.test.TestModelType; import org.jboss.as.core.model.test.TransformersTestParameterized; import org.jboss.as.core.model.test.TransformersTestParameterized.TransformersParameter; import org.jboss.as.core.model.test.util.ExcludeCommonOperations; import org.jboss.as.core.model.test.util.TransformersTestParameter; import org.jboss.as.model.test.ModelTestControllerVersion; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ValueExpression; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; /** * Tests of socket-binding transformation. * * @author Brian Stansberry (c) 2012 Red Hat Inc. */ @RunWith(TransformersTestParameterized.class) public class SocketBindingTransformersTestCase extends AbstractCoreModelTest { private static final String CLIENT_MAPPING_SOURCE_NETWORK = AbstractSocketBindingResourceDefinition.CLIENT_MAPPING_SOURCE_NETWORK.getName(); private static final String CLIENT_MAPPING_DESTINATION_ADDRESS = AbstractSocketBindingResourceDefinition.CLIENT_MAPPING_DESTINATION_ADDRESS.getName(); private static final String CLIENT_MAPPING_DESTINATION_PORT = AbstractSocketBindingResourceDefinition.CLIENT_MAPPING_DESTINATION_PORT.getName(); private final ModelVersion modelVersion; private final ModelTestControllerVersion testControllerVersion; @TransformersParameter public static List<TransformersTestParameter> parameters(){ return TransformersTestParameter.setupVersions(); } public SocketBindingTransformersTestCase(TransformersTestParameter params) { this.modelVersion = params.getModelVersion(); this.testControllerVersion = params.getTestControllerVersion(); } @Test public void testClientMappingTransformer() throws Exception { if (modelVersion.getMajor() > 1 || modelVersion.getMinor() >= 4) { return; } KernelServicesBuilder builder = createKernelServicesBuilder(TestModelType.DOMAIN) .setXmlResource("domain-transformers-1.3.xml"); LegacyKernelServicesInitializer legacyInit = builder.createLegacyKernelServicesBuilder(modelVersion, testControllerVersion); if (modelVersion.getMajor() == 1 && modelVersion.getMinor() <= 3) { //The 7.1.2/3 operation validator does not like expressions very much ExcludeCommonOperations.excludeBadOps_7_1_x(legacyInit); } KernelServices mainServices = builder.build(); Assert.assertTrue(mainServices.isSuccessfulBoot()); KernelServices legacyServices = mainServices.getLegacyServices(modelVersion); Assert.assertTrue(legacyServices.isSuccessfulBoot()); checkCoreModelTransformation(mainServices, modelVersion); String[] address = { SOCKET_BINDING_GROUP, "standard-sockets", SOCKET_BINDING, "client-mapping" }; testMappingsWriteAttributeTransformation(mainServices, address, CLIENT_MAPPING_SOURCE_NETWORK, "${test.exp:127.0.0.0/24}"); testMappingsWriteAttributeTransformation(mainServices, address, CLIENT_MAPPING_DESTINATION_ADDRESS, "${test.exp:localhost}"); testMappingsWriteAttributeTransformation(mainServices, address, CLIENT_MAPPING_DESTINATION_PORT, "${test.exp:3334}"); String[] add1Addr = { SOCKET_BINDING_GROUP, "standard-sockets", SOCKET_BINDING, "add-1" }; testMappingsAddTransformation(mainServices, add1Addr, CLIENT_MAPPING_SOURCE_NETWORK, "${test.exp:127.0.0.0/24}"); String[] add2Addr = { SOCKET_BINDING_GROUP, "standard-sockets", SOCKET_BINDING, "add-2" }; testMappingsAddTransformation(mainServices, add2Addr, CLIENT_MAPPING_DESTINATION_ADDRESS, "${test.exp:localhost}"); String[] add3Addr = { SOCKET_BINDING_GROUP, "standard-sockets", SOCKET_BINDING, "add-3" }; testMappingsAddTransformation(mainServices, add3Addr, CLIENT_MAPPING_DESTINATION_PORT, "${test.exp:3334}"); } private void testMappingsWriteAttributeTransformation(KernelServices mainServices, String[] address, String field, String expression) throws OperationFailedException { ModelNode write = createOperation(WRITE_ATTRIBUTE_OPERATION, address); write.get(NAME).set(CLIENT_MAPPINGS); ModelNode mappings = getClientMappings(); mappings.get(1).get(field).set(expression); write.get(VALUE).set(mappings); ModelNode expected = getClientMappings(); expected.get(1).get(field).set(new ValueExpression(expression)); checkOutcome(mainServices.executeOperation(write.clone())); ModelNode model = mainServices.readWholeModel(false).get(address); Assert.assertEquals(model + " includes expected mappings", expected, model.get(CLIENT_MAPPINGS)); OperationTransformer.TransformedOperation transOp = mainServices.transformOperation(modelVersion, write); ModelNode translatedWrite = transOp.getTransformedOperation(); Assert.assertTrue(translatedWrite.hasDefined(VALUE)); Assert.assertEquals(mappings, translatedWrite.get(VALUE)); ModelNode result = mainServices.executeOperation(modelVersion, transOp); Assert.assertEquals("expected result: " + result, FAILED, result.get(OUTCOME).asString()); } private void testMappingsAddTransformation(KernelServices mainServices, String[] address, String field, String expression) throws OperationFailedException { ModelNode add = createOperation(ADD, address); add.get(PORT).set(4444); ModelNode mappings = getClientMappings(); mappings.get(1).get(field).set(expression); add.get(CLIENT_MAPPINGS).set(mappings); ModelNode expected = getClientMappings(); expected.get(1).get(field).set(new ValueExpression(expression)); checkOutcome(mainServices.executeOperation(add.clone())); ModelNode model = mainServices.readWholeModel(false).get(address); Assert.assertEquals(model + " includes expected mappings", expected, model.get(CLIENT_MAPPINGS)); OperationTransformer.TransformedOperation transOp = mainServices.transformOperation(modelVersion, add); ModelNode translatedAdd = transOp.getTransformedOperation(); Assert.assertTrue(translatedAdd.hasDefined(CLIENT_MAPPINGS)); Assert.assertEquals(mappings, translatedAdd.get(CLIENT_MAPPINGS)); ModelNode result = mainServices.executeOperation(modelVersion, transOp); Assert.assertEquals("expected result: " + result, FAILED, result.get(OUTCOME).asString()); } private ModelNode createOperation(String operationName, String...address) { ModelNode operation = new ModelNode(); operation.get(OP).set(operationName); if (address.length > 0) { if (address.length % 2 != 0) { throw new IllegalArgumentException("Address must be in pairs"); } for (int i = 0 ; i < address.length ; i+=2) { operation.get(OP_ADDR).add(address[i], address[i + 1]); } } else { operation.get(OP_ADDR).setEmptyList(); } return operation; } private static ModelNode getClientMappings() { ModelNode mappings = new ModelNode(); ModelNode one = new ModelNode(); one.get(CLIENT_MAPPING_DESTINATION_ADDRESS).set("localhost"); mappings.add(one); ModelNode two = new ModelNode(); two.get(CLIENT_MAPPING_SOURCE_NETWORK).set("127.0.0.0/24"); two.get(CLIENT_MAPPING_DESTINATION_ADDRESS).set("localhost"); two.get(CLIENT_MAPPING_DESTINATION_PORT).set(3334); mappings.add(two); return mappings; } }