/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat Middleware LLC, 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.systemproperty; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.BOOT_TIME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER_GROUP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SOCKET_BINDING_GROUP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SYSTEM_PROPERTY; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE; import java.util.List; import org.jboss.as.controller.ModelVersion; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.operations.common.Util; 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.TransformersParameter; import org.jboss.as.core.model.test.util.StandardServerGroupInitializers; import org.jboss.as.core.model.test.util.TransformersTestParameter; import org.jboss.as.model.test.FailedOperationTransformationConfig; import org.jboss.as.model.test.ModelFixer; import org.jboss.as.model.test.ModelTestControllerVersion; import org.jboss.as.model.test.ModelTestUtils; import org.jboss.dmr.ModelNode; import org.jboss.dmr.Property; import org.junit.Assert; import org.junit.Test; /** * * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> */ public abstract class AbstractSystemPropertyTransformersTest extends AbstractCoreModelTest { private final ModelVersion modelVersion; private final ModelTestControllerVersion testControllerVersion; private final boolean serverGroup; private final ModelNode expectedUndefined; public AbstractSystemPropertyTransformersTest(TransformersTestParameter params, boolean serverGroup) { this.modelVersion = params.getModelVersion(); this.testControllerVersion = params.getTestControllerVersion(); this.serverGroup = serverGroup; this.expectedUndefined = getExpectedUndefined(params.getModelVersion()); } @TransformersParameter public static List<TransformersTestParameter> parameters(){ return TransformersTestParameter.setupVersions(); } @Test public void testSystemPropertyTransformer() throws Exception { KernelServicesBuilder builder = createKernelServicesBuilder(TestModelType.DOMAIN) .setXmlResource(serverGroup ? "domain-servergroup-systemproperties.xml" : "domain-systemproperties.xml"); if (serverGroup) { builder.setModelInitializer(StandardServerGroupInitializers.XML_MODEL_INITIALIZER, StandardServerGroupInitializers.XML_MODEL_WRITE_SANITIZER); } LegacyKernelServicesInitializer legacyInitializer = builder.createLegacyKernelServicesBuilder(modelVersion, testControllerVersion); if (serverGroup) { StandardServerGroupInitializers.addServerGroupInitializers(legacyInitializer); } KernelServices mainServices = builder.build(); Assert.assertTrue(mainServices.isSuccessfulBoot()); KernelServices legacyServices = mainServices.getLegacyServices(modelVersion); Assert.assertTrue(legacyServices.isSuccessfulBoot()); ModelNode legacyModel = checkCoreModelTransformation(mainServices, modelVersion, StandardServerGroupInitializers.MODEL_FIXER, StandardServerGroupInitializers.MODEL_FIXER); ModelNode properties = legacyModel; if (serverGroup) { properties = legacyModel.get(SERVER_GROUP, "test"); } properties = properties.get(SYSTEM_PROPERTY); Assert.assertEquals(expectedUndefined, properties.get("sys.prop.test.one", BOOT_TIME)); Assert.assertEquals(1, properties.get("sys.prop.test.one", VALUE).asInt()); Assert.assertEquals(new ModelNode(true), properties.get("sys.prop.test.two", BOOT_TIME)); Assert.assertEquals(2, properties.get("sys.prop.test.two", VALUE).asInt()); Assert.assertEquals(new ModelNode(false), properties.get("sys.prop.test.three", BOOT_TIME)); Assert.assertEquals(3, properties.get("sys.prop.test.three", VALUE).asInt()); Assert.assertEquals(expectedUndefined, properties.get("sys.prop.test.four", BOOT_TIME)); Assert.assertFalse(properties.get("sys.prop.test.four", VALUE).isDefined()); //Test the write attribute handler, the 'add' got tested at boot time PathAddress baseAddress = serverGroup ? PathAddress.pathAddress(PathElement.pathElement(SERVER_GROUP, "test")) : PathAddress.EMPTY_ADDRESS; PathAddress propAddress = baseAddress.append(SYSTEM_PROPERTY, "sys.prop.test.two"); //value should just work ModelNode op = Util.getWriteAttributeOperation(propAddress, VALUE, new ModelNode("test12")); ModelTestUtils.checkOutcome(mainServices.executeOperation(modelVersion, mainServices.transformOperation(modelVersion, op))); Assert.assertEquals("test12", ModelTestUtils.getSubModel(legacyServices.readWholeModel(), propAddress).get(VALUE).asString()); //boot time should be 'true' if undefined op = Util.getWriteAttributeOperation(propAddress, BOOT_TIME, new ModelNode()); ModelTestUtils.checkOutcome(mainServices.executeOperation(modelVersion, mainServices.transformOperation(modelVersion, op))); Assert.assertTrue(ModelTestUtils.getSubModel(legacyServices.readWholeModel(), propAddress).get(BOOT_TIME).asBoolean()); op = Util.getUndefineAttributeOperation(propAddress, BOOT_TIME); ModelTestUtils.checkOutcome(mainServices.executeOperation(modelVersion, mainServices.transformOperation(modelVersion, op))); Assert.assertTrue(ModelTestUtils.getSubModel(legacyServices.readWholeModel(), propAddress).get(BOOT_TIME).asBoolean()); } @Test public void testSystemPropertiesWithExpressions() throws Exception { System.setProperty("sys.prop.test.one", "ONE"); KernelServicesBuilder builder = createKernelServicesBuilder(TestModelType.DOMAIN); if (serverGroup) { builder.setModelInitializer(StandardServerGroupInitializers.XML_MODEL_INITIALIZER, StandardServerGroupInitializers.XML_MODEL_WRITE_SANITIZER); } LegacyKernelServicesInitializer legacyInitializer = builder.createLegacyKernelServicesBuilder(modelVersion, testControllerVersion); if (serverGroup) { StandardServerGroupInitializers.addServerGroupInitializers(legacyInitializer); } KernelServices mainServices = builder.build(); Assert.assertTrue(mainServices.isSuccessfulBoot()); //This passes since the boot currently does not invoke the transformers, and the rejected expression transformer which //would fail fails on the way out. KernelServices legacyServices = mainServices.getLegacyServices(modelVersion); Assert.assertTrue(legacyServices.isSuccessfulBoot()); List<ModelNode> ops = builder.parseXmlResource(serverGroup ? "domain-servergroup-systemproperties-with-expressions.xml" : "domain-systemproperties-with-expressions.xml"); FailedOperationTransformationConfig config; if (allowExpressions()) { config = FailedOperationTransformationConfig.NO_FAILURES; } else { PathAddress root = serverGroup ? PathAddress.pathAddress(PathElement.pathElement(SERVER_GROUP)) : PathAddress.EMPTY_ADDRESS; config = new FailedOperationTransformationConfig() .addFailedAttribute(root.append(PathElement.pathElement(SYSTEM_PROPERTY)), new FailedOperationTransformationConfig.RejectExpressionsConfig(BOOT_TIME, VALUE)); } ModelTestUtils.checkFailedTransformedBootOperations(mainServices, modelVersion, ops, config); checkCoreModelTransformation(mainServices, modelVersion, null, new ModelFixer() { @Override public ModelNode fixModel(ModelNode modelNode) { modelNode.remove(SOCKET_BINDING_GROUP); if (!allowExpressions()) { modelNode = modelNode.resolve(); ModelNode sysPropRoot = serverGroup ? modelNode.get(SERVER_GROUP, "test") : modelNode; for (Property sysprop : sysPropRoot.get(SYSTEM_PROPERTY).asPropertyList()) { ModelNode bootTime; // if (sysprop.getValue().hasDefined(BOOT_TIME) && (bootTime = sysprop.getValue().get(BOOT_TIME)).getType() == ModelType.STRING) { // // Convert to boolean // sysPropRoot.get(SYSTEM_PROPERTY, sysprop.getName(), BOOT_TIME).set(bootTime.asBoolean()); // } } } return modelNode; } }); } private ModelNode getExpectedUndefined(ModelVersion modelVersion){ if (modelVersion_1_4_0_OrGreater()) { return new ModelNode(); } else { return new ModelNode(true); } } private boolean allowExpressions() { return modelVersion_1_4_0_OrGreater(); } private boolean modelVersion_1_4_0_OrGreater() { return ModelVersion.compare(ModelVersion.create(1, 4, 0), modelVersion) >= 0; } }