/* * JBoss, Home of Professional Open Source. * Copyright 2011, 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.standalone.root; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION; import java.net.InetAddress; import java.util.List; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.client.helpers.ClientConstants; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.controller.operations.common.NamespaceAddHandler; import org.jboss.as.controller.operations.common.NamespaceRemoveHandler; import org.jboss.as.controller.operations.common.SchemaLocationAddHandler; import org.jboss.as.controller.operations.common.SchemaLocationRemoveHandler; import org.jboss.as.controller.operations.common.Util; import org.jboss.as.controller.parsing.Namespace; 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.TestModelType; import org.jboss.as.model.test.ModelTestUtils; import org.jboss.as.network.NetworkUtils; import org.jboss.as.server.controller.descriptions.ServerDescriptionConstants; import org.jboss.as.version.Version; 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 class StandaloneRootResourceTestCase extends AbstractCoreModelTest { @Test public void testEmptyRoot() throws Exception { KernelServices kernelServices = createEmptyRoot(); ModelNode model = kernelServices.readWholeModel(false, true); assertAttribute(model, ModelDescriptionConstants.NAMESPACES, new ModelNode().setEmptyList()); assertAttribute(model, ModelDescriptionConstants.SCHEMA_LOCATIONS, new ModelNode().setEmptyList()); assertAttribute(model, ModelDescriptionConstants.NAME, new ModelNode(getDefaultServerName())); assertAttribute(model, ModelDescriptionConstants.PRODUCT_NAME, null); assertAttribute(model, ModelDescriptionConstants.PRODUCT_VERSION, null); assertAttribute(model, ModelDescriptionConstants.MANAGEMENT_MAJOR_VERSION, new ModelNode(Version.MANAGEMENT_MAJOR_VERSION)); assertAttribute(model, ModelDescriptionConstants.MANAGEMENT_MINOR_VERSION, new ModelNode(Version.MANAGEMENT_MINOR_VERSION)); assertAttribute(model, ModelDescriptionConstants.MANAGEMENT_MICRO_VERSION, new ModelNode(Version.MANAGEMENT_MICRO_VERSION)); assertAttribute(model, ServerDescriptionConstants.PROCESS_STATE, new ModelNode("running")); assertAttribute(model, ServerDescriptionConstants.RUNTIME_CONFIGURATION_STATE, new ModelNode(ClientConstants.CONTROLLER_PROCESS_STATE_OK)); assertAttribute(model, ServerDescriptionConstants.PROCESS_TYPE, new ModelNode("Server")); assertAttribute(model, ServerDescriptionConstants.LAUNCH_TYPE, new ModelNode("STANDALONE")); //These two cannot work in tests - placeholder assertAttribute(model, ModelDescriptionConstants.RELEASE_VERSION, new ModelNode("Unknown")); assertAttribute(model, ModelDescriptionConstants.RELEASE_CODENAME, new ModelNode("")); //Try changing namespaces, schema-locations and name } @Test public void testName() throws Exception { KernelServices kernelServices = createEmptyRoot(); ModelNode read = Util.createOperation(READ_ATTRIBUTE_OPERATION, PathAddress.EMPTY_ADDRESS); read.get(NAME).set(NAME); ModelNode originalName = kernelServices.executeForResult(read); ModelNode write = Util.createOperation(WRITE_ATTRIBUTE_OPERATION, PathAddress.EMPTY_ADDRESS); write.get(NAME).set(NAME); write.get(VALUE).set("test"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(write)); Assert.assertEquals("test", kernelServices.executeForResult(read).asString()); //Unset the name write.get(VALUE).set(new ModelNode()); ModelTestUtils.checkOutcome(kernelServices.executeOperation(write)); Assert.assertEquals(originalName, kernelServices.executeForResult(read)); } @Test public void testNameSetInXml() throws Exception { String originalXml = "<server xmlns=\"" + Namespace.CURRENT.getUriString() + "\" name=\"testing\"/>"; KernelServices kernelServices = createKernelServicesBuilder() .setXml(originalXml) .build(); Assert.assertTrue(kernelServices.isSuccessfulBoot()); ModelNode read = Util.createOperation(READ_ATTRIBUTE_OPERATION, PathAddress.EMPTY_ADDRESS); read.get(NAME).set(NAME); Assert.assertEquals("testing", kernelServices.executeForResult(read).asString()); String persistedXml = kernelServices.getPersistedSubsystemXml(); ModelTestUtils.compareXml(originalXml, persistedXml); } @Test public void testNoNameSetInXml() throws Exception { String originalXml = "<server xmlns=\"" + Namespace.CURRENT.getUriString() + "\"/>"; KernelServices kernelServices = createKernelServicesBuilder() .setXml(originalXml) .build(); Assert.assertTrue(kernelServices.isSuccessfulBoot()); ModelNode read = Util.createOperation(READ_ATTRIBUTE_OPERATION, PathAddress.EMPTY_ADDRESS); read.get(NAME).set(NAME); Assert.assertEquals(getDefaultServerName(), kernelServices.executeForResult(read).asString()); //Add and remove a system property so that some ops get executed on the model to trigger persistence, as it is there are none ModelNode add = Util.createAddOperation(PathAddress.pathAddress(PathElement.pathElement(ModelDescriptionConstants.SYSTEM_PROPERTY, "test"))); add.get(VALUE).set("123"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(add)); ModelNode remove = Util.createRemoveOperation(PathAddress.pathAddress(PathElement.pathElement(ModelDescriptionConstants.SYSTEM_PROPERTY, "test"))); ModelTestUtils.checkOutcome(kernelServices.executeOperation(remove)); String persistedXml = kernelServices.getPersistedSubsystemXml(); ModelTestUtils.compareXml(originalXml, persistedXml); } @Test public void testNamespaces() throws Exception { KernelServices kernelServices = createEmptyRoot(); ModelNode read = Util.createOperation(READ_ATTRIBUTE_OPERATION, PathAddress.EMPTY_ADDRESS); read.get(NAME).set(ModelDescriptionConstants.NAMESPACES); Assert.assertEquals(new ModelNode().setEmptyList(), kernelServices.executeForResult(read)); ModelNode add = Util.createOperation(NamespaceAddHandler.DEFINITION, PathAddress.EMPTY_ADDRESS); add.get(ModelDescriptionConstants.NAMESPACE).set("one"); add.get(ModelDescriptionConstants.URI).set("urn:uno"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(add)); ModelNode result = kernelServices.executeForResult(read); List<ModelNode> list = result.asList(); Assert.assertEquals(1, list.size()); Property prop = list.get(0).asProperty(); Assert.assertEquals("one", prop.getName()); Assert.assertEquals("urn:uno", prop.getValue().asString()); add.get(ModelDescriptionConstants.NAMESPACE).set("two"); add.get(ModelDescriptionConstants.URI).set("urn:dos"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(add)); result = kernelServices.executeForResult(read); list = result.asList(); Assert.assertEquals(2, list.size()); prop = list.get(0).asProperty(); Assert.assertEquals("one", prop.getName()); Assert.assertEquals("urn:uno", prop.getValue().asString()); prop = list.get(1).asProperty(); Assert.assertEquals("two", prop.getName()); Assert.assertEquals("urn:dos", prop.getValue().asString()); ModelNode remove = Util.createOperation(NamespaceRemoveHandler.DEFINITION, PathAddress.EMPTY_ADDRESS); remove.get(ModelDescriptionConstants.NAMESPACE).set("one"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(remove)); result = kernelServices.executeForResult(read); list = result.asList(); Assert.assertEquals(1, list.size()); prop = list.get(0).asProperty(); Assert.assertEquals("two", prop.getName()); Assert.assertEquals("urn:dos", prop.getValue().asString()); remove.get(ModelDescriptionConstants.NAMESPACE).set("two"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(remove)); result = kernelServices.executeForResult(read); Assert.assertEquals(new ModelNode().setEmptyList(), result); remove.get(ModelDescriptionConstants.NAMESPACE).set("blah"); kernelServices.executeForFailure(remove); } @Test public void testSchemaLocations() throws Exception { KernelServices kernelServices = createEmptyRoot(); ModelNode read = Util.createOperation(READ_ATTRIBUTE_OPERATION, PathAddress.EMPTY_ADDRESS); read.get(NAME).set(ModelDescriptionConstants.SCHEMA_LOCATIONS); Assert.assertEquals(new ModelNode().setEmptyList(), kernelServices.executeForResult(read)); ModelNode add = Util.createOperation(SchemaLocationAddHandler.DEFINITION, PathAddress.EMPTY_ADDRESS); add.get(ModelDescriptionConstants.URI).set("one"); add.get(ModelDescriptionConstants.SCHEMA_LOCATION).set("loc-one"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(add)); ModelNode result = kernelServices.executeForResult(read); List<ModelNode> list = result.asList(); Assert.assertEquals(1, list.size()); Property prop = list.get(0).asProperty(); Assert.assertEquals("one", prop.getName()); Assert.assertEquals("loc-one", prop.getValue().asString()); add.get(ModelDescriptionConstants.URI).set("two"); add.get(ModelDescriptionConstants.SCHEMA_LOCATION).set("loc-two"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(add)); result = kernelServices.executeForResult(read); list = result.asList(); Assert.assertEquals(2, list.size()); prop = list.get(0).asProperty(); Assert.assertEquals("one", prop.getName()); Assert.assertEquals("loc-one", prop.getValue().asString()); prop = list.get(1).asProperty(); Assert.assertEquals("two", prop.getName()); Assert.assertEquals("loc-two", prop.getValue().asString()); ModelNode remove = Util.createOperation(SchemaLocationRemoveHandler.DEFINITION.getName(), PathAddress.EMPTY_ADDRESS); remove.get(ModelDescriptionConstants.URI).set("one"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(remove)); result = kernelServices.executeForResult(read); list = result.asList(); Assert.assertEquals(1, list.size()); prop = list.get(0).asProperty(); Assert.assertEquals("two", prop.getName()); Assert.assertEquals("loc-two", prop.getValue().asString()); remove.get(ModelDescriptionConstants.URI).set("two"); ModelTestUtils.checkOutcome(kernelServices.executeOperation(remove)); Assert.assertEquals(new ModelNode().setEmptyList(), kernelServices.executeForResult(read)); remove.get(ModelDescriptionConstants.URI).set("blah"); kernelServices.executeForFailure(remove); } private void assertAttribute(ModelNode model, String name, ModelNode expected) { if (expected == null) { Assert.assertFalse(model.get(name).isDefined()); } else { ModelNode actual = model.get(name); Assert.assertEquals(expected, actual); } } private KernelServices createEmptyRoot() throws Exception { KernelServices kernelServices = createKernelServicesBuilder().build(); Assert.assertTrue(kernelServices.isSuccessfulBoot()); return kernelServices; } private String getDefaultServerName() throws Exception { String hostName = NetworkUtils.canonize(InetAddress.getLocalHost().getHostName().toLowerCase()); int index = hostName.indexOf('.'); return index == -1 ? hostName : hostName.substring(0, index); } private KernelServicesBuilder createKernelServicesBuilder() { return super.createKernelServicesBuilder(TestModelType.STANDALONE); } }