/* * JBoss, Home of Professional Open Source. * Copyright 2006, 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.controller.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.HashSet; import java.util.Set; import org.jboss.as.controller.BlockingTimeout; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.ProcessType; import org.jboss.as.controller.ProxyController; import org.jboss.as.controller.ResourceBuilder; import org.jboss.as.controller.ResourceDefinition; import org.jboss.as.controller.SimpleResourceDefinition; import org.jboss.as.controller.client.OperationAttachments; import org.jboss.as.controller.client.OperationMessageHandler; import org.jboss.as.controller.descriptions.NonResolvingResourceDescriptionResolver; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.dmr.ModelNode; import org.junit.Before; import org.junit.Test; /** * * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> * @version $Revision: 1.1 $ */ public class RegistryProxyControllerTestCase { PathElement profileA = PathElement.pathElement("profile", "profileA"); PathElement profileB = PathElement.pathElement("profile", "profileB"); PathElement proxyA = PathElement.pathElement("proxy", "proxyA"); PathElement proxyB = PathElement.pathElement("proxy", "proxyB"); ManagementResourceRegistration root; ManagementResourceRegistration profileAReg; ManagementResourceRegistration profileBReg; ManagementResourceRegistration profileAChildAReg; final ResourceDefinition rootResource = ResourceBuilder.Factory.create(PathElement.pathElement("test"), NonResolvingResourceDescriptionResolver.INSTANCE).build(); @Before public void setup() { root = ManagementResourceRegistration.Factory.forProcessType(ProcessType.EMBEDDED_SERVER).createRegistration(rootResource); assertNotNull(root); profileAReg = registerSubModel(root, profileA); assertNotNull(profileAReg); profileBReg = registerSubModel(root, profileB); assertNotNull(profileBReg); root.registerProxyController(proxyA, new TestProxyController(proxyA)); root.registerProxyController(proxyB, new TestProxyController(proxyB)); profileBReg.registerProxyController(proxyA, new TestProxyController(profileB, proxyA)); profileBReg.registerProxyController(proxyB, new TestProxyController(profileB, proxyB)); } @Test public void testCannotCreateProxyRegistryForExistingNode() { try { root.registerProxyController(profileA, new TestProxyController(profileA)); fail("Expected failure for " + profileA); } catch (IllegalArgumentException expected) { } try { profileBReg.registerProxyController(proxyA, new TestProxyController(profileB, proxyA)); fail("Expected failure for " + PathAddress.pathAddress(profileB, proxyA)); } catch (IllegalArgumentException expected) { } } @Test public void testGetProxyController() { assertNull(root.getProxyController(PathAddress.pathAddress(profileA))); assertNull(root.getProxyController(PathAddress.pathAddress(profileA, PathElement.pathElement("a", "b")))); assertNull(root.getProxyController(PathAddress.pathAddress(profileB))); assertNull(root.getProxyController(PathAddress.pathAddress(profileB, PathElement.pathElement("a", "b")))); PathAddress address = PathAddress.pathAddress(profileB, proxyA); ProxyController proxy = root.getProxyController(address); assertNotNull(proxy); assertEquals(address, proxy.getProxyNodeAddress()); address = PathAddress.pathAddress(profileB, proxyB); proxy = root.getProxyController(address); assertNotNull(proxy); assertEquals(address, proxy.getProxyNodeAddress()); address = PathAddress.pathAddress(profileB, proxyA, PathElement.pathElement("a", "b"), PathElement.pathElement("c", "d")); proxy = root.getProxyController(address); assertNotNull(proxy); assertEquals(PathAddress.pathAddress(profileB, proxyA), proxy.getProxyNodeAddress()); address = PathAddress.pathAddress(proxyA); proxy = root.getProxyController(address); assertNotNull(proxy); assertEquals(address, proxy.getProxyNodeAddress()); address = PathAddress.pathAddress(proxyB); proxy = root.getProxyController(address); assertNotNull(proxy); assertEquals(address, proxy.getProxyNodeAddress()); address = PathAddress.pathAddress(proxyA, PathElement.pathElement("a", "b"), PathElement.pathElement("c", "d")); proxy = root.getProxyController(address); assertNotNull(proxy); assertEquals(PathAddress.pathAddress(proxyA), proxy.getProxyNodeAddress()); } @Test public void testGetProxyControllers() { Set<PathAddress> addresses = getProxyAddresses(PathAddress.EMPTY_ADDRESS); assertEquals(4, addresses.size()); assertTrue(addresses.contains(PathAddress.pathAddress(proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(proxyB))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyB))); addresses = getProxyAddresses(PathAddress.pathAddress(profileB)); assertEquals(2, addresses.size()); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyB))); addresses = getProxyAddresses(PathAddress.pathAddress(profileA)); assertEquals(0, addresses.size()); addresses = getProxyAddresses(PathAddress.pathAddress(profileA, PathElement.pathElement("c", "d"))); assertEquals(0, addresses.size()); } @Test public void removeAndAddTopLevelProxyController() { assertNotNull(root.getProxyController(PathAddress.pathAddress(proxyB))); root.unregisterProxyController(proxyB); assertNull(root.getProxyController(PathAddress.pathAddress(proxyB))); Set<PathAddress> addresses = getProxyAddresses(PathAddress.EMPTY_ADDRESS); assertEquals(3, addresses.size()); assertTrue(addresses.contains(PathAddress.pathAddress(proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyB))); root.registerProxyController(proxyB, new TestProxyController(proxyB)); addresses = getProxyAddresses(PathAddress.EMPTY_ADDRESS); assertEquals(4, addresses.size()); assertTrue(addresses.contains(PathAddress.pathAddress(proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(proxyB))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyB))); } @Test public void removeAndAddChildLevelProxyController() { assertNotNull(root.getProxyController(PathAddress.pathAddress(profileB, proxyA))); profileBReg.unregisterProxyController(proxyA); assertNull(profileBReg.getProxyController(PathAddress.pathAddress(proxyA))); Set<PathAddress> addresses = getProxyAddresses(PathAddress.EMPTY_ADDRESS); assertEquals(3, addresses.size()); assertTrue(addresses.contains(PathAddress.pathAddress(proxyB))); assertTrue(addresses.contains(PathAddress.pathAddress(proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyB))); profileBReg.registerProxyController(proxyA, new TestProxyController(profileB, proxyA)); addresses = getProxyAddresses(PathAddress.EMPTY_ADDRESS); assertEquals(4, addresses.size()); assertTrue(addresses.contains(PathAddress.pathAddress(proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(proxyB))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyB))); } @Test public void testRemoveNonExistentProxyController() { PathElement element = PathElement.pathElement("profile", "profileA"); root.unregisterProxyController(element); Set<PathAddress> addresses = getProxyAddresses(PathAddress.EMPTY_ADDRESS); assertEquals(4, addresses.size()); assertTrue(addresses.contains(PathAddress.pathAddress(proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(proxyB))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyA))); assertTrue(addresses.contains(PathAddress.pathAddress(profileB, proxyB))); } private Set<PathAddress> getProxyAddresses(PathAddress address){ Set<PathAddress> addresses = new HashSet<PathAddress>(); for (ProxyController proxy : root.getProxyControllers(address)) { addresses.add(proxy.getProxyNodeAddress()); } return addresses; } private ManagementResourceRegistration registerSubModel(final ManagementResourceRegistration parent, final PathElement address) { return parent.registerSubModel(new SimpleResourceDefinition(address, new NonResolvingResourceDescriptionResolver())); } static class TestProxyController implements ProxyController { private final PathAddress address; public TestProxyController(PathElement...elements) { super(); this.address = PathAddress.pathAddress(elements); } @Override public PathAddress getProxyNodeAddress() { return address; } @Override public void execute(ModelNode operation, OperationMessageHandler handler, ProxyOperationControl control, OperationAttachments attachments, BlockingTimeout blockingTimeout) { } } }