Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java (original) +++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java Mon Jun 15 15:43:53 2015 @@ -1150,7 +1150,7 @@ public abstract class AbstractQueue<X ex { if (action != null || (exclusiveSub == null && _queueRunner.isIdle())) { - Subject.doAs(SecurityManager.getSystemTaskSubject("Immediate Delivery"), + Subject.doAs(SecurityManager.getSystemTaskSubject("Immediate Delivery", _virtualHost.getPrincipal()), new PrivilegedAction<Void>() { @Override
Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java (original) +++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java Mon Jun 15 15:43:53 2015 @@ -66,7 +66,7 @@ public class QueueRunner implements Runn { if(_scheduled.compareAndSet(SCHEDULED,RUNNING)) { - Subject.doAs(SecurityManager.getSystemTaskSubject("Queue Delivery"), new PrivilegedAction<Object>() + Subject.doAs(SecurityManager.getSystemTaskSubject("Queue Delivery", _queue.getVirtualHost().getPrincipal()), new PrivilegedAction<Object>() { @Override public Object run() Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java (original) +++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java Mon Jun 15 15:43:53 2015 @@ -59,6 +59,8 @@ import org.apache.qpid.server.model.Stat import org.apache.qpid.server.model.User; import org.apache.qpid.server.model.VirtualHost; import org.apache.qpid.server.model.VirtualHostAlias; +import org.apache.qpid.server.model.VirtualHostLogger; +import org.apache.qpid.server.model.VirtualHostLoggerFilter; import org.apache.qpid.server.model.VirtualHostNode; import org.apache.qpid.server.protocol.AMQConnectionModel; import org.apache.qpid.server.queue.QueueConsumer; @@ -108,8 +110,24 @@ public class SecurityManager public static Subject getSystemTaskSubject(String taskName) { + return getSystemSubject(new TaskPrincipal(taskName)); + } + + public static Subject getSystemTaskSubject(String taskName, Principal principal) + { + return getSystemSubject(new TaskPrincipal(taskName), principal); + } + + private static Subject getSystemSubject(Principal... principals) + { Subject subject = new Subject(false, SYSTEM.getPrincipals(), SYSTEM.getPublicCredentials(), SYSTEM.getPrivateCredentials()); - subject.getPrincipals().add(new TaskPrincipal(taskName)); + if (principals !=null) + { + for (Principal principal:principals) + { + subject.getPrincipals().add(principal); + } + } subject.setReadOnly(); return subject; } @@ -398,6 +416,7 @@ public class SecurityManager return Broker.class.isAssignableFrom(category) || PreferencesProvider.class.isAssignableFrom(category) || BrokerLoggerFilter.class.isAssignableFrom(category) || + VirtualHostAlias.class.isAssignableFrom(category) || ( !VirtualHostNode.class.isAssignableFrom(category) && getModel().getChildTypes(Broker.class).contains(category)); } @@ -447,6 +466,11 @@ public class SecurityManager objectName); properties = new OperationLoggingDetails(description); } + else if (isVirtualHostType(configuredObjectType)) + { + ConfiguredObject<?> virtualHost = getModel().getAncestor(VirtualHost.class, configuredObject); + properties = new ObjectProperties((String)virtualHost.getAttribute(ConfiguredObject.NAME)); + } return properties; } @@ -489,6 +513,10 @@ public class SecurityManager { return ObjectType.BROKER; } + else if (isVirtualHostType(category)) + { + return ObjectType.VIRTUALHOST; + } else if (Group.class.isAssignableFrom(category)) { return ObjectType.GROUP; @@ -502,14 +530,6 @@ public class SecurityManager { return ObjectType.USER; } - else if (VirtualHost.class.isAssignableFrom(category)) - { - return ObjectType.VIRTUALHOST; - } - else if (VirtualHostAlias.class.isAssignableFrom(category)) - { - return ObjectType.VIRTUALHOST; - } else if (Queue.class.isAssignableFrom(category)) { return ObjectType.QUEUE; @@ -518,11 +538,6 @@ public class SecurityManager { return ObjectType.EXCHANGE; } - else if (Connection.class.isAssignableFrom(category)) - { - // ACCESS VIRTUALHOST - return ObjectType.VIRTUALHOST; - } else if (Session.class.isAssignableFrom(category)) { // PUBLISH EXCHANGE @@ -541,6 +556,14 @@ public class SecurityManager return null; } + private boolean isVirtualHostType(Class<? extends ConfiguredObject> category) + { + return VirtualHost.class.isAssignableFrom(category) || + VirtualHostLogger.class.isAssignableFrom(category) || + VirtualHostLoggerFilter.class.isAssignableFrom(category) || + Connection.class.isAssignableFrom(category); + } + public void authoriseUserUpdate(final String userName) { AuthenticatedPrincipal principal = getCurrentUser(); Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java (original) +++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java Mon Jun 15 15:43:53 2015 @@ -21,6 +21,7 @@ package org.apache.qpid.server.virtualhost; import java.io.File; +import java.security.Principal; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collection; @@ -33,7 +34,6 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -153,6 +153,7 @@ public abstract class AbstractVirtualHos private NetworkConnectionScheduler _networkConnectionScheduler; + private final VirtualHostPrincipal _principal; @ManagedAttributeField private boolean _queue_deadLetterQueueEnabled; @@ -190,8 +191,9 @@ public abstract class AbstractVirtualHos private MessageStore _messageStore; private MessageStoreRecoverer _messageStoreRecoverer; - private final FileSystemSpaceChecker _fileSystemSpaceChecker = new FileSystemSpaceChecker(); + private final FileSystemSpaceChecker _fileSystemSpaceChecker; private int _fileSystemMaxUsagePercent; + private Collection<VirtualHostLogger> _virtualHostLoggersToClose; public AbstractVirtualHost(final Map<String, Object> attributes, VirtualHostNode<?> virtualHostNode) { @@ -214,6 +216,8 @@ public abstract class AbstractVirtualHos _dataDelivered = new StatisticsCounter("bytes-delivered-" + getName()); _messagesReceived = new StatisticsCounter("messages-received-" + getName()); _dataReceived = new StatisticsCounter("bytes-received-" + getName()); + _principal = new VirtualHostPrincipal(this); + _fileSystemSpaceChecker = new FileSystemSpaceChecker(); } public void onValidate() @@ -502,6 +506,10 @@ public abstract class AbstractVirtualHos { throw new UnsupportedOperationException(); } + else if(childClass == VirtualHostLogger.class) + { + return getObjectFactory().createAsync(childClass, attributes, this); + } throw new IllegalArgumentException("Cannot create a child of class " + childClass.getSimpleName()); } @@ -852,7 +860,7 @@ public abstract class AbstractVirtualHos protected ListenableFuture<Void> beforeClose() { setState(State.UNAVAILABLE); - + _virtualHostLoggersToClose = new ArrayList(getChildren(VirtualHostLogger.class)); return super.beforeClose(); } @@ -870,6 +878,8 @@ public abstract class AbstractVirtualHos _networkConnectionScheduler = null; } _eventLogger.message(VirtualHostMessages.CLOSED(getName())); + + stopLogging(_virtualHostLoggersToClose); } private void closeMessageStore() @@ -1375,6 +1385,7 @@ public abstract class AbstractVirtualHos protected ListenableFuture<Void> doStop() { final SettableFuture<Void> returnVal = SettableFuture.create(); + final List<VirtualHostLogger> loggers = new ArrayList<>(getChildren(VirtualHostLogger.class)); closeChildren().addListener( new Runnable() { @@ -1392,6 +1403,7 @@ public abstract class AbstractVirtualHos closeMessageStore(); setState(State.STOPPED); + stopLogging(loggers); } finally { @@ -1403,6 +1415,14 @@ public abstract class AbstractVirtualHos return returnVal; } + private void stopLogging(Collection<VirtualHostLogger> loggers) + { + for (VirtualHostLogger logger : loggers) + { + logger.stopLogging(); + } + } + @StateTransition( currentState = { State.ACTIVE, State.ERRORED }, desiredState = State.DELETED ) private ListenableFuture<Void> doDelete() { @@ -1629,6 +1649,13 @@ public abstract class AbstractVirtualHos return calculateTotalEnqueuedSize(getQueues()); } + + @Override + public Principal getPrincipal() + { + return _principal; + } + private long calculateTotalEnqueuedSize(final Collection<AMQQueue<?>> queues) { long total = 0; Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java (original) +++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java Mon Jun 15 15:43:53 2015 @@ -41,7 +41,7 @@ public abstract class HouseKeepingTask i public HouseKeepingTask(VirtualHost vhost) { _name = vhost.getName() + ":" + this.getClass().getSimpleName(); - _subject = SecurityManager.getSystemTaskSubject(_name); + _subject = SecurityManager.getSystemTaskSubject(_name, vhost.getPrincipal()); } final public void run() Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java?rev=1685599&view=auto ============================================================================== --- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java (added) +++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java Mon Jun 15 15:43:53 2015 @@ -0,0 +1,67 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.virtualhost; + +import java.security.Principal; +import java.util.Objects; + +import org.apache.qpid.server.model.VirtualHost; + +public class VirtualHostPrincipal implements Principal +{ + private static String VIRTUALHOST_SUBJECT_TEMPLATE = "virtualhost:%s-%s"; + private final VirtualHost<?,?,?> _virtualHost; + private final String _name; + + public VirtualHostPrincipal(VirtualHost<?, ?, ?> virtualHost) + { + _virtualHost = virtualHost; + _name = String.format(VIRTUALHOST_SUBJECT_TEMPLATE, virtualHost.getName(), virtualHost.getId()); + } + + @Override + public String getName() + { + return _name; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + + VirtualHostPrincipal that = (VirtualHostPrincipal) o; + return Objects.equals(_virtualHost, that._virtualHost); + } + + @Override + public int hashCode() + { + return Objects.hash(_virtualHost); + } +} Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java (original) +++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java Mon Jun 15 15:43:53 2015 @@ -20,6 +20,7 @@ */ package org.apache.qpid.server.virtualhostnode; +import java.security.Principal; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -59,6 +60,7 @@ import org.apache.qpid.server.txn.DtxReg import org.apache.qpid.server.virtualhost.ExchangeIsAlternateException; import org.apache.qpid.server.virtualhost.HouseKeepingTask; import org.apache.qpid.server.virtualhost.RequiredExchangeException; +import org.apache.qpid.server.virtualhost.VirtualHostPrincipal; @ManagedObject( category = false, type = RedirectingVirtualHostImpl.TYPE, register = false ) class RedirectingVirtualHostImpl @@ -68,6 +70,7 @@ class RedirectingVirtualHostImpl public static final String TYPE = "REDIRECTOR"; private final StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived; private final Broker<?> _broker; + private final VirtualHostPrincipal _principal; @ManagedAttributeField private boolean _queue_deadLetterQueueEnabled; @@ -108,6 +111,7 @@ class RedirectingVirtualHostImpl _dataDelivered = new StatisticsCounter("bytes-delivered-" + getName()); _messagesReceived = new StatisticsCounter("messages-received-" + getName()); _dataReceived = new StatisticsCounter("bytes-received-" + getName()); + _principal = new VirtualHostPrincipal(this); setState(State.UNAVAILABLE); } @@ -532,6 +536,11 @@ class RedirectingVirtualHostImpl return localAddress; } + @Override + public Principal getPrincipal() + { + return _principal; + } private void throwUnsupportedForRedirector() { Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java (original) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java Mon Jun 15 15:43:53 2015 @@ -33,6 +33,7 @@ import java.util.Map; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.Appender; +import ch.qos.logback.core.Context; import ch.qos.logback.core.read.ListAppender; import org.apache.qpid.server.configuration.updater.TaskExecutor; import org.apache.qpid.server.configuration.updater.TaskExecutorImpl; @@ -78,13 +79,12 @@ public class BrokerLoggerTest extends Qp _brokerLogger = new AbstractBrokerLogger(attributes, broker) { @Override - public Appender<ILoggingEvent> asAppender() + public Appender<ILoggingEvent> asAppender(Context context) { return _loggerAppender; } }; _brokerLogger.open(); - _loggerAppender.addFilter(_brokerLogger.getCompositeFilter()); } @Override @@ -92,14 +92,8 @@ public class BrokerLoggerTest extends Qp { try { + _brokerLogger.delete(); _taskExecutor.stopImmediately(); - - ch.qos.logback.classic.Logger rootLogger = - (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - - _loggerAppender.clearAllFilters(); - - rootLogger.detachAppender(_loggerAppender); } finally { @@ -156,7 +150,8 @@ public class BrokerLoggerTest extends Qp public void testDeleteLogger() { - ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + ch.qos.logback.classic.Logger rootLogger = + (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); assertNotNull("Appender not found when it should have been created", rootLogger.getAppender(_brokerLogger.getName())); _brokerLogger.delete(); assertEquals("Unexpected state after deletion", State.DELETED, _brokerLogger.getState()); Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java (original) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java Mon Jun 15 15:43:53 2015 @@ -24,15 +24,13 @@ import static org.mockito.Mockito.doRetu import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; +import ch.qos.logback.core.filter.Filter; import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.configuration.updater.TaskExecutor; import org.apache.qpid.server.configuration.updater.TaskExecutorImpl; @@ -43,24 +41,16 @@ import org.apache.qpid.server.model.Mode import org.apache.qpid.server.security.SecurityManager; import org.apache.qpid.test.utils.QpidTestCase; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class BrokerNameAndLevelFilterTest extends QpidTestCase { - private Logger _logger = null; - private Logger _nonQpidLogger = null; - private BrokerLogger<?> _brokerLogger; - private BrokerNameAndLevelFilter<?> _brokerNameAndLevelFilter; - private ListAppender _loggerAppender; private TaskExecutor _taskExecutor; + private final Broker<?> _broker = mock(Broker.class); @Override public void setUp() throws Exception { super.setUp(); - _loggerAppender = new ListAppender(); _taskExecutor = new TaskExecutorImpl(); _taskExecutor.start(); @@ -68,54 +58,23 @@ public class BrokerNameAndLevelFilterTes Model model = BrokerModel.getInstance(); SecurityManager securityManager = mock(SecurityManager.class); - Broker<?> broker = mock(Broker.class); - when(broker.getSecurityManager()).thenReturn(securityManager); - when(broker.getModel()).thenReturn(model); - doReturn(Broker.class).when(broker).getCategoryClass(); + when(_broker.getSecurityManager()).thenReturn(securityManager); + when(_broker.getModel()).thenReturn(model); + doReturn(Broker.class).when(_broker).getCategoryClass(); _brokerLogger = mock(BrokerLogger.class); when(_brokerLogger.getModel()).thenReturn(model); when(_brokerLogger.getChildExecutor()).thenReturn(_taskExecutor); - when(_brokerLogger.getParent(Broker.class)).thenReturn(broker); + when(_brokerLogger.getParent(Broker.class)).thenReturn(_broker); doReturn(BrokerLogger.class).when(_brokerLogger).getCategoryClass(); - - - _logger = LoggerFactory.getLogger("org.apache.qpid.server.test"); - _nonQpidLogger = LoggerFactory.getLogger("org.apache.qpid.test"); - } - - private void setUpFilterAndAppender(String loggerName, LogLevel logLevel) - { - Map<String, Object> attributes = new HashMap<>(); - attributes.put("loggerName", loggerName); - attributes.put("level", logLevel); - attributes.put("name", "test"); - - _brokerNameAndLevelFilter = new BrokerNameAndLevelFilterImplFactory().createInstance(attributes, _brokerLogger); - _brokerNameAndLevelFilter.open(); - ch.qos.logback.classic.Logger rootLogger = - (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - rootLogger.addAppender(_loggerAppender); - _loggerAppender.setContext(rootLogger.getLoggerContext()); - _loggerAppender.addFilter(_brokerNameAndLevelFilter.asFilter()); - _loggerAppender.addFilter(DenyAllFilter.getInstance()); - } + } @Override public void tearDown() throws Exception { try { - _brokerNameAndLevelFilter.close(); _taskExecutor.stopImmediately(); - - ch.qos.logback.classic.Logger rootLogger = - (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - - _loggerAppender.clearAllFilters(); - - _loggerAppender.stop(); - rootLogger.detachAppender(_loggerAppender); } finally { @@ -123,85 +82,64 @@ public class BrokerNameAndLevelFilterTes } } - public void testSetNameOnWildcardFilter() throws Exception + + public void testAsFilter() { - setUpFilterAndAppender("org.apache.qpid.server.*", LogLevel.DEBUG); - _loggerAppender.start(); - _logger.debug("Test1"); - _nonQpidLogger.debug("Test2"); - _loggerAppender.stop(); + BrokerNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO); - assertLoggedEvent(true, "Test1", _logger.getName(), Level.DEBUG); - assertLoggedEvent(false, "Test2", _nonQpidLogger.getName(), Level.DEBUG); + Filter<ILoggingEvent> filter = filterObject.asFilter(); - try - { - _brokerNameAndLevelFilter.setAttributes(Collections.<String, Object>singletonMap("loggerName", "org.apache.qpid.*")); - fail("Changing of logger name is unsupported"); - } - catch (IllegalConfigurationException e) - { - // pass - } - } + assertTrue("Unexpected filter instance", filter instanceof LoggerNameAndLevelFilter); - public void testSetLevelOnWildcardFilter() throws Exception - { - setUpFilterAndAppender("org.apache.qpid.server.*", LogLevel.DEBUG); - doChangeLevelTest(); + LoggerNameAndLevelFilter f = (LoggerNameAndLevelFilter)filter; + assertEquals("Unexpected log level", Level.INFO, f.getLevel()); + assertEquals("Unexpected logger name", "org.apache.qpid", f.getLoggerName()); } - public void testSetLevelOnEmptyLogNameFilter() throws Exception + public void testLevelChangeAffectsFilter() { - setUpFilterAndAppender("", LogLevel.DEBUG); - doChangeLevelTest(); - } + BrokerNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO); - public void testSetLevelOnNonEmptyAndNonWildCardLogNameFilter() throws Exception - { - setUpFilterAndAppender(_logger.getName(), LogLevel.DEBUG); - doChangeLevelTest(); + LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter(); + + assertEquals("Unexpected log level", Level.INFO, filter.getLevel()); + + filterObject.setAttributes(Collections.<String, Object>singletonMap("level", LogLevel.DEBUG)); + assertEquals("Unexpected log level attribute", Level.DEBUG, filter.getLevel()); } - private void doChangeLevelTest() + public void testLoggerNameChangeNotAllowed() { - _loggerAppender.start(); - _logger.debug("Test1"); - _loggerAppender.stop(); + BrokerNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO); - assertLoggedEvent(true, "Test1", _logger.getName(), Level.DEBUG); + LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter(); - _brokerNameAndLevelFilter.setAttributes(Collections.<String, Object>singletonMap("level", LogLevel.INFO)); - assertEquals("Unexpected log level attribute", LogLevel.INFO, _brokerNameAndLevelFilter.getLevel()); + assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName()); - _loggerAppender.start(); - _logger.debug("Test2"); - _logger.info("Test3"); - _loggerAppender.stop(); + try + { + filterObject.setAttributes(Collections.<String,Object>singletonMap(BrokerNameAndLevelFilter.LOGGER_NAME, "org.apache.qpid.foo")); + fail("IllegalConfigurationException is expected to throw on attempt to change logger name"); + } + catch(IllegalConfigurationException e) + { + // pass + } - assertLoggedEvent(false, "Test2", _logger.getName(), Level.DEBUG); - assertLoggedEvent(true, "Test3", _logger.getName(), Level.INFO); + assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName()); } - private void assertLoggedEvent(boolean exists, String message, String loggerName, Level level) + + private BrokerNameAndLevelFilter createFilter(String loggerName, LogLevel logLevel) { - List<ILoggingEvent> events; - synchronized(_loggerAppender) - { - events = new ArrayList<>(_loggerAppender.list); - } + Map<String, Object> attributes = new HashMap<>(); + attributes.put("loggerName", loggerName); + attributes.put("level", logLevel); + attributes.put("name", "test"); - boolean logged = false; - for (ILoggingEvent event: events) - { - if (event.getFormattedMessage().equals(message) && event.getLoggerName().equals(loggerName) && event.getLevel() == level) - { - logged = true; - break; - } - } - assertEquals("Event " + message + " from logger " + loggerName + " of log level " + level - + " is " + (exists ? "not" : "") + " found", exists, logged); + BrokerNameAndLevelFilter brokerNameAndLevelFilter = new BrokerNameAndLevelFilterImpl(attributes, _brokerLogger); + brokerNameAndLevelFilter.open(); + return brokerNameAndLevelFilter; } } Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java (original) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java Mon Jun 15 15:43:53 2015 @@ -32,7 +32,6 @@ import java.util.Arrays; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; -import org.apache.qpid.server.model.BrokerLoggerFilter; import org.apache.qpid.test.utils.QpidTestCase; public class CompositeFilterTest extends QpidTestCase @@ -48,7 +47,7 @@ public class CompositeFilterTest extends { CompositeFilter compositeFilter = new CompositeFilter(); - compositeFilter.addFilter(createBrokerFilter(FilterReply.ACCEPT)); + compositeFilter.addFilter(createFilter(FilterReply.ACCEPT)); FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class)); assertEquals("Unexpected reply with ACCEPT filter added", FilterReply.ACCEPT, reply); @@ -58,7 +57,7 @@ public class CompositeFilterTest extends { CompositeFilter compositeFilter = new CompositeFilter(); - compositeFilter.addFilter(createBrokerFilter(FilterReply.NEUTRAL)); + compositeFilter.addFilter(createFilter(FilterReply.NEUTRAL)); FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class)); assertEquals("Unexpected reply with NEUTRAL filter added", FilterReply.DENY, reply); @@ -68,34 +67,34 @@ public class CompositeFilterTest extends { CompositeFilter compositeFilter = new CompositeFilter(); - BrokerLoggerFilter brokerFilterNeutral = createBrokerFilter(FilterReply.NEUTRAL); + LoggerFilter brokerFilterNeutral = createFilter(FilterReply.NEUTRAL); compositeFilter.addFilter(brokerFilterNeutral); - BrokerLoggerFilter brokerFilterDeny = createBrokerFilter(FilterReply.DENY); + LoggerFilter brokerFilterDeny = createFilter(FilterReply.DENY); compositeFilter.addFilter(brokerFilterDeny); - BrokerLoggerFilter brokerFilterAccept = createBrokerFilter(FilterReply.ACCEPT); + LoggerFilter brokerFilterAccept = createFilter(FilterReply.ACCEPT); compositeFilter.addFilter(brokerFilterAccept); FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class)); assertEquals("Unexpected reply", FilterReply.DENY, reply); - verify(brokerFilterNeutral.asFilter()).decide(any()); - verify(brokerFilterDeny.asFilter()).decide(any()); - verify(brokerFilterAccept.asFilter(), never()).decide(any()); + verify(brokerFilterNeutral.asFilter()).decide(any(ILoggingEvent.class)); + verify(brokerFilterDeny.asFilter()).decide(any(ILoggingEvent.class)); + verify(brokerFilterAccept.asFilter(), never()).decide(any(ILoggingEvent.class)); } public void testRemoveFilterFromChain() { CompositeFilter compositeFilter = new CompositeFilter(); - BrokerLoggerFilter brokerFilterNeutral = createBrokerFilter(FilterReply.NEUTRAL, "neutral"); + LoggerFilter brokerFilterNeutral = createFilter(FilterReply.NEUTRAL, "neutral"); compositeFilter.addFilter(brokerFilterNeutral); - BrokerLoggerFilter brokerFilterDeny = createBrokerFilter(FilterReply.DENY, "deny"); + LoggerFilter brokerFilterDeny = createFilter(FilterReply.DENY, "deny"); compositeFilter.addFilter(brokerFilterDeny); - BrokerLoggerFilter brokerFilterAccept = createBrokerFilter(FilterReply.ACCEPT, "accept"); + LoggerFilter brokerFilterAccept = createFilter(FilterReply.ACCEPT, "accept"); compositeFilter.addFilter(brokerFilterAccept); FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class)); @@ -106,16 +105,16 @@ public class CompositeFilterTest extends FilterReply reply2 = compositeFilter.decide(mock(ILoggingEvent.class)); assertEquals("Unexpected reply", FilterReply.ACCEPT, reply2); - verify(brokerFilterNeutral.asFilter(), times(2)).decide(any()); - verify(brokerFilterDeny.asFilter()).decide(any()); - verify(brokerFilterAccept.asFilter()).decide(any()); + verify(brokerFilterNeutral.asFilter(), times(2)).decide(any(ILoggingEvent.class)); + verify(brokerFilterDeny.asFilter()).decide(any(ILoggingEvent.class)); + verify(brokerFilterAccept.asFilter()).decide(any(ILoggingEvent.class)); } public void testAddFilter() { CompositeFilter compositeFilter = new CompositeFilter(); - BrokerLoggerFilter brokerFilter = createBrokerFilter(FilterReply.ACCEPT, "accept"); + LoggerFilter brokerFilter = createFilter(FilterReply.ACCEPT, "accept"); compositeFilter.addFilter(brokerFilter); verify(brokerFilter.asFilter()).setName("accept"); @@ -125,32 +124,32 @@ public class CompositeFilterTest extends { CompositeFilter compositeFilter = new CompositeFilter(); - BrokerLoggerFilter brokerFilterNeutral = createBrokerFilter(FilterReply.NEUTRAL, "neutral"); - BrokerLoggerFilter brokerFilterAccept = createBrokerFilter(FilterReply.ACCEPT, "accept"); - BrokerLoggerFilter brokerFilterDeny = createBrokerFilter(FilterReply.DENY, "deny"); + LoggerFilter brokerFilterNeutral = createFilter(FilterReply.NEUTRAL, "neutral"); + LoggerFilter brokerFilterAccept = createFilter(FilterReply.ACCEPT, "accept"); + LoggerFilter brokerFilterDeny = createFilter(FilterReply.DENY, "deny"); compositeFilter.addFilters(Arrays.asList(brokerFilterNeutral, brokerFilterAccept, brokerFilterDeny)); FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class)); assertEquals("Unexpected reply", FilterReply.ACCEPT, reply); - verify(brokerFilterNeutral.asFilter()).decide(any()); - verify(brokerFilterAccept.asFilter()).decide(any()); - verify(brokerFilterDeny.asFilter(), never()).decide(any()); + verify(brokerFilterNeutral.asFilter()).decide(any(ILoggingEvent.class)); + verify(brokerFilterAccept.asFilter()).decide(any(ILoggingEvent.class)); + verify(brokerFilterDeny.asFilter(), never()).decide(any(ILoggingEvent.class)); } - private BrokerLoggerFilter createBrokerFilter(FilterReply decision) + private LoggerFilter createFilter(FilterReply decision) { - return createBrokerFilter(decision, "UNNAMED"); + return createFilter(decision, "UNNAMED"); } - private BrokerLoggerFilter createBrokerFilter(final FilterReply decision, String name) + private LoggerFilter createFilter(final FilterReply decision, String name) { - BrokerLoggerFilter brokerFilter = mock(BrokerLoggerFilter.class); + LoggerFilter brokerFilter = mock(LoggerFilter.class); when(brokerFilter.getName()).thenReturn(name); Filter filter = mock(Filter.class); when(filter.getName()).thenReturn(name); - when(filter.decide(any())).thenReturn(decision); + when(filter.decide(any(ILoggingEvent.class))).thenReturn(decision); when(brokerFilter.asFilter()).thenReturn(filter); return brokerFilter; } Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java?rev=1685599&view=auto ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java (added) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java Mon Jun 15 15:43:53 2015 @@ -0,0 +1,116 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.logging; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.spi.FilterReply; +import org.apache.qpid.test.utils.QpidTestCase; + +public class LoggerNameAndLevelFilterTest extends QpidTestCase +{ + + public void testDecideForWildcardLoggerName() throws Exception + { + LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter("org.apache.qpid.server.*", Level.INFO); + + ILoggingEvent event = mock(ILoggingEvent.class); + when(event.getLevel()).thenReturn(Level.INFO); + when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo"); + assertEquals("Unexpected reply for matching logger name and log level", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLoggerName()).thenReturn("org.apache.qpid.foo"); + assertEquals("Unexpected reply for non matching logger name but matching log level", FilterReply.NEUTRAL, filter.decide(event)); + + when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo"); + when(event.getLevel()).thenReturn(Level.DEBUG); + assertEquals("Unexpected reply for matching logger name but non matching log level", FilterReply.NEUTRAL, filter.decide(event)); + } + + public void testDecideForEmptyLoggerName() throws Exception + { + LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter("", Level.INFO); + + ILoggingEvent event = mock(ILoggingEvent.class); + when(event.getLevel()).thenReturn(Level.INFO); + when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo"); + assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLoggerName()).thenReturn("org.apache.qpid.foo"); + assertEquals("Unexpected reply for matching log level and arbitrary logger namel", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLevel()).thenReturn(Level.DEBUG); + assertEquals("Unexpected reply for non matching log level", FilterReply.NEUTRAL, filter.decide(event)); + } + + public void testDecideForRootLoggerName() throws Exception + { + LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter(Logger.ROOT_LOGGER_NAME, Level.INFO); + + ILoggingEvent event = mock(ILoggingEvent.class); + when(event.getLevel()).thenReturn(Level.INFO); + when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo"); + assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLoggerName()).thenReturn("org.apache.qpid.foo"); + assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLevel()).thenReturn(Level.DEBUG); + assertEquals("Unexpected reply for non matching log level", FilterReply.NEUTRAL, filter.decide(event)); + } + + public void testDecideForNullLoggerName() throws Exception + { + LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter(null, Level.INFO); + + ILoggingEvent event = mock(ILoggingEvent.class); + when(event.getLevel()).thenReturn(Level.INFO); + when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo"); + assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLoggerName()).thenReturn("org.apache.qpid.foo"); + assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLevel()).thenReturn(Level.DEBUG); + assertEquals("Unexpected reply for non matching log level", FilterReply.NEUTRAL, filter.decide(event)); + } + + public void testDecideForNonWildCardLoggerName() throws Exception + { + LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter("org.apache.qpid", Level.INFO); + + ILoggingEvent event = mock(ILoggingEvent.class); + when(event.getLevel()).thenReturn(Level.INFO); + when(event.getLoggerName()).thenReturn("org.apache.qpid"); + assertEquals("Unexpected reply for matching log level and same logger name", FilterReply.ACCEPT, filter.decide(event)); + + when(event.getLoggerName()).thenReturn("org.apache.qpid.foo"); + assertEquals("Unexpected reply for matching log level and not same logger name", FilterReply.NEUTRAL, filter.decide(event)); + + when(event.getLevel()).thenReturn(Level.DEBUG); + when(event.getLoggerName()).thenReturn("org.apache.qpid"); + assertEquals("Unexpected reply for non matching log leve and same logger namel", FilterReply.NEUTRAL, filter.decide(event)); + } +} Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java?rev=1685599&view=auto ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java (added) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java Mon Jun 15 15:43:53 2015 @@ -0,0 +1,95 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.logging; + +import static org.mockito.Mockito.mock; + +import java.security.Principal; +import java.security.PrivilegedAction; + +import javax.security.auth.Subject; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.spi.FilterReply; + +import org.apache.qpid.test.utils.QpidTestCase; + +public class PrincipalLogEventFilterTest extends QpidTestCase +{ + + private PrincipalLogEventFilter _principalLogEventFilter; + private ILoggingEvent _event = mock(ILoggingEvent.class); + private Subject _subject; + private Principal _principal; + + @Override + protected void setUp() throws Exception + { + super.setUp(); + _subject = new Subject(); + _principal = mock(Principal.class); + _principalLogEventFilter = new PrincipalLogEventFilter(_principal); + } + + public void testPrincipalMatches() + { + _subject.getPrincipals().add(_principal); + + FilterReply reply = doFilter(); + + assertEquals(FilterReply.NEUTRAL, reply); + } + + public void testNoPrincipal() + { + FilterReply reply = doFilter(); + + assertEquals(FilterReply.DENY, reply); + } + + public void testWrongPrincipal() + { + _subject.getPrincipals().add(mock(Principal.class)); + + FilterReply reply = doFilter(); + + assertEquals(FilterReply.DENY, reply); + } + + public void testNoSubject() + { + _subject.getPrincipals().add(mock(Principal.class)); + + assertEquals(FilterReply.DENY, _principalLogEventFilter.decide(_event)); + } + + private FilterReply doFilter() + { + return Subject.doAs(_subject, new PrivilegedAction<FilterReply>() + { + @Override + public FilterReply run() + { + return _principalLogEventFilter.decide(_event); + } + }); + } +} \ No newline at end of file Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java?rev=1685599&view=auto ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java (added) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java Mon Jun 15 15:43:53 2015 @@ -0,0 +1,104 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.logging; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Context; +import ch.qos.logback.core.encoder.Encoder; +import ch.qos.logback.core.rolling.RollingFileAppender; +import ch.qos.logback.core.rolling.RollingPolicy; +import ch.qos.logback.core.rolling.TimeBasedRollingPolicy; +import ch.qos.logback.core.rolling.TriggeringPolicy; +import ch.qos.logback.core.rolling.helper.CompressionMode; +import org.apache.qpid.test.utils.QpidTestCase; + +public class RollingFileAppenderFactoryTest extends QpidTestCase +{ + public static final String FILE_NAME = "TEST"; + public static final String LAYOUT = "%d %-5p [%t] \\(%c{2}\\) - %m%n"; + public static final String MAX_FILE_SIZE = "100mb"; + public static final int MAX_HISTORY = 10; + + private RollingFileAppenderFactory _helper; + private FileLoggerSettings _settings; + + @Override + public void setUp() throws Exception + { + super.setUp(); + _helper = new RollingFileAppenderFactory(); + _settings = mock(FileLoggerSettings.class); + when(_settings.getFileName()).thenReturn(FILE_NAME); + when(_settings.getLayout()).thenReturn(LAYOUT); + when(_settings.getMaxFileSize()).thenReturn(MAX_FILE_SIZE); + when(_settings.isCompressOldFiles()).thenReturn(Boolean.TRUE); + when(_settings.isRollDaily()).thenReturn(Boolean.TRUE); + when(_settings.isRollOnRestart()).thenReturn(Boolean.TRUE); + when(_settings.getMaxHistory()).thenReturn(MAX_HISTORY); + } + + public void testCreateRollingFileAppenderDailyRolling() + { + RollingFileAppender<ILoggingEvent> appender = _helper.createRollingFileAppender(_settings, mock(Context.class)); + + assertEquals("Unexpected appender file name", FILE_NAME, appender.getFile()); + + RollingPolicy rollingPolicy = appender.getRollingPolicy(); + assertTrue("Unexpected rolling policy", rollingPolicy instanceof TimeBasedRollingPolicy); + assertEquals("Unexpected max history", MAX_HISTORY, ((TimeBasedRollingPolicy) rollingPolicy).getMaxHistory()); + assertEquals("Unexpected file name pattern", FILE_NAME + ".%d{yyyy-MM-dd}.%i.gz", ((TimeBasedRollingPolicy) rollingPolicy).getFileNamePattern()); + assertEquals("Unexpected compression mode", CompressionMode.GZ, rollingPolicy.getCompressionMode()); + + TriggeringPolicy triggeringPolicy = ((TimeBasedRollingPolicy) rollingPolicy).getTimeBasedFileNamingAndTriggeringPolicy(); + assertTrue("Unexpected triggering policy", triggeringPolicy instanceof RollingFileAppenderFactory.DailyTriggeringPolicy); + assertEquals("Unexpected triggering policy", MAX_FILE_SIZE, ((RollingFileAppenderFactory.DailyTriggeringPolicy) triggeringPolicy).getMaxFileSize()); + } + + public void testCreateRollingFileAppenderNonDailyRolling() + { + when(_settings.isRollDaily()).thenReturn(Boolean.FALSE); + when(_settings.isCompressOldFiles()).thenReturn(Boolean.FALSE); + + RollingFileAppender<ILoggingEvent> appender = _helper.createRollingFileAppender(_settings, mock(Context.class)); + + assertEquals("Unexpected appender file name", FILE_NAME, appender.getFile()); + + RollingPolicy rollingPolicy = appender.getRollingPolicy(); + assertTrue("Unexpected rolling policy", rollingPolicy instanceof RollingFileAppenderFactory.SimpleRollingPolicy); + assertEquals("Unexpected max history", MAX_HISTORY, ((RollingFileAppenderFactory.SimpleRollingPolicy) rollingPolicy).getMaxIndex()); + assertEquals("Unexpected file name pattern", FILE_NAME + ".%i", ((RollingFileAppenderFactory.SimpleRollingPolicy) rollingPolicy).getFileNamePattern()); + assertEquals("Unexpected compression mode", CompressionMode.NONE, rollingPolicy.getCompressionMode()); + + TriggeringPolicy triggeringPolicy = appender.getTriggeringPolicy(); + assertEquals("Unexpected triggering policy", MAX_FILE_SIZE, ((RollingFileAppenderFactory.SizeTriggeringPolicy) triggeringPolicy).getMaxFileSize()); + + Encoder encoder = appender.getEncoder(); + assertTrue("Unexpected encoder", encoder instanceof PatternLayoutEncoder); + assertEquals("Unexpected layout pattern", LAYOUT, ((PatternLayoutEncoder)encoder).getPattern()); + + } + +} Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java?rev=1685599&view=auto ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java (added) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java Mon Jun 15 15:43:53 2015 @@ -0,0 +1,181 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.logging; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import org.apache.qpid.server.store.DurableConfigurationStore; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.qpid.server.configuration.updater.TaskExecutor; +import org.apache.qpid.server.configuration.updater.TaskExecutorImpl; +import org.apache.qpid.server.model.Broker; +import org.apache.qpid.server.model.BrokerModel; +import org.apache.qpid.server.model.ConfiguredObject; +import org.apache.qpid.server.model.Model; +import org.apache.qpid.server.model.State; +import org.apache.qpid.server.model.SystemConfig; +import org.apache.qpid.server.model.VirtualHost; +import org.apache.qpid.server.model.VirtualHostLogger; +import org.apache.qpid.server.model.VirtualHostNode; +import org.apache.qpid.server.security.SecurityManager; +import org.apache.qpid.server.virtualhost.TestMemoryVirtualHost; +import org.apache.qpid.test.utils.QpidTestCase; + +public class VirtualHostLoggerTest extends QpidTestCase +{ + private VirtualHost<?,?,?> _virtualHost; + private TaskExecutor _taskExecutor; + private File _logFile; + + @Override + public void setUp() throws Exception + { + super.setUp(); + _taskExecutor = new TaskExecutorImpl(); + _taskExecutor.start(); + + Model model = BrokerModel.getInstance(); + + SecurityManager securityManager = mock(SecurityManager.class); + EventLogger eventLogger = mock(EventLogger.class); + + SystemConfig<?> systemConfig = mock(SystemConfig.class); + when(systemConfig.getModel()).thenReturn(model); + when(systemConfig.getChildExecutor()).thenReturn(_taskExecutor); + when(systemConfig.getEventLogger()).thenReturn(eventLogger); + doReturn(SystemConfig.class).when(systemConfig).getCategoryClass(); + + Broker<?> broker = mock(Broker.class); + when(broker.getSecurityManager()).thenReturn(securityManager); + when(broker.getModel()).thenReturn(model); + when(broker.getChildExecutor()).thenReturn(_taskExecutor); + when(broker.getParent(SystemConfig.class)).thenReturn(systemConfig); + doReturn(Broker.class).when(broker).getCategoryClass(); + + VirtualHostNode<?> node = mock(VirtualHostNode.class); + when(node.getModel()).thenReturn(model); + when(node.getChildExecutor()).thenReturn(_taskExecutor); + when(node.getParent(Broker.class)).thenReturn(broker); + when(node.getConfigurationStore()).thenReturn(mock(DurableConfigurationStore.class)); + doReturn(VirtualHostNode.class).when(node).getCategoryClass(); + + // use real VH object rather then mock in order to test create/start/stop functionality + Map<String, Object> attributes = new HashMap<>(); + attributes.put(VirtualHost.NAME, getName()); + attributes.put(VirtualHost.TYPE, TestMemoryVirtualHost.VIRTUAL_HOST_TYPE); + _virtualHost = new TestMemoryVirtualHost(attributes, node); + _virtualHost.open(); + + _logFile = new File(TMP_FOLDER, "tmp-virtual-host.log." + System.currentTimeMillis()); + if (_logFile.exists()) + { + assertTrue(String.format("Log file '%s' is not deleted in setUp", _logFile.getPath()), _logFile.delete()); + } + } + + @Override + public void tearDown() throws Exception + { + try + { + _virtualHost.close(); + _taskExecutor.stopImmediately(); + if (_logFile != null && _logFile.exists()) + { + _logFile.delete(); + } + } + finally + { + super.tearDown(); + } + } + + public void testAddLogger() + { + VirtualHostLogger logger = createVirtualHostLogger(); + + assertTrue("Unexpected logger created " + logger, logger instanceof VirtualHostFileLogger); + assertEquals("Unexpected log file", _logFile.getPath(), ((VirtualHostFileLogger<?>) logger).getFileName()); + assertEquals("Unexpected state on creation", State.ACTIVE, logger.getState()); + + Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)) + .getAppender(logger.getName()); + assertTrue("Appender was not started", appender.isStarted()); + } + + public void testDeleteLogger() + { + VirtualHostLogger logger = createVirtualHostLogger(); + assertEquals("Unexpected state on creation", State.ACTIVE, logger.getState()); + + Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)) + .getAppender(logger.getName()); + assertTrue("Appender is not started", appender.isStarted()); + + logger.delete(); + + appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).getAppender(logger.getName()); + assertNull("Appender should be detached on logger deletion", appender); + } + + + public void testLoggersRemovedOnVirtualHostStop() + { + VirtualHostLogger logger = createVirtualHostLogger(); + _virtualHost.stop(); + + Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)) + .getAppender(logger.getName()); + assertNull("Appender was not deleted", appender); + } + + public void testLoggersRemovedOnVirtualHostClose() + { + VirtualHostLogger logger = createVirtualHostLogger(); + _virtualHost.close(); + + Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)) + .getAppender(logger.getName()); + assertNull("Appender was not deleted", appender); + } + + + private VirtualHostLogger createVirtualHostLogger() + { + Map<String, Object> attributes = new HashMap<>(); + attributes.put(VirtualHostLogger.NAME, getTestName()); + attributes.put(ConfiguredObject.TYPE, VirtualHostFileLogger.TYPE); + attributes.put(VirtualHostFileLogger.FILE_NAME, _logFile.getPath()); + return _virtualHost.createChild(VirtualHostLogger.class, attributes); + } + +} Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java?rev=1685599&view=auto ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java (added) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java Mon Jun 15 15:43:53 2015 @@ -0,0 +1,166 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.logging; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.filter.Filter; + +import org.apache.qpid.server.configuration.IllegalConfigurationException; +import org.apache.qpid.server.configuration.updater.TaskExecutor; +import org.apache.qpid.server.configuration.updater.TaskExecutorImpl; +import org.apache.qpid.server.model.Broker; +import org.apache.qpid.server.model.BrokerModel; +import org.apache.qpid.server.model.Model; +import org.apache.qpid.server.model.SystemConfig; +import org.apache.qpid.server.model.VirtualHost; +import org.apache.qpid.server.model.VirtualHostLogger; +import org.apache.qpid.server.model.VirtualHostNode; +import org.apache.qpid.server.security.*; +import org.apache.qpid.server.security.SecurityManager; +import org.apache.qpid.server.store.DurableConfigurationStore; +import org.apache.qpid.test.utils.QpidTestCase; + +public class VirtualHostNameAndLevelFilterImplTest extends QpidTestCase +{ + private VirtualHostLogger _virtualHostLogger; + private TaskExecutor _taskExecutor; + private final VirtualHost<?,?,?> _virtualhost = mock(VirtualHost.class); + + @Override + public void setUp() throws Exception + { + super.setUp(); + + _taskExecutor = new TaskExecutorImpl(); + _taskExecutor.start(); + + Model model = BrokerModel.getInstance(); + org.apache.qpid.server.security.SecurityManager securityManager = mock(SecurityManager.class); + + Broker broker = mock(Broker.class); + when(broker.getSecurityManager()).thenReturn(securityManager); + when(broker.getModel()).thenReturn(model); + when(broker.getChildExecutor()).thenReturn(_taskExecutor); + doReturn(Broker.class).when(broker).getCategoryClass(); + + VirtualHostNode<?> node = mock(VirtualHostNode.class); + when(node.getModel()).thenReturn(model); + when(node.getChildExecutor()).thenReturn(_taskExecutor); + when(node.getParent(Broker.class)).thenReturn(broker); + doReturn(VirtualHostNode.class).when(node).getCategoryClass(); + + when(_virtualhost.getModel()).thenReturn(model); + when(_virtualhost.getParent(VirtualHostNode.class)).thenReturn(node); + doReturn(VirtualHost.class).when(_virtualhost).getCategoryClass(); + + _virtualHostLogger = mock(VirtualHostLogger.class); + when(_virtualHostLogger.getModel()).thenReturn(model); + when(_virtualHostLogger.getChildExecutor()).thenReturn(_taskExecutor); + when(_virtualHostLogger.getParent(VirtualHost.class)).thenReturn(_virtualhost); + doReturn(VirtualHostLogger.class).when(_virtualHostLogger).getCategoryClass(); + } + + @Override + public void tearDown() throws Exception + { + try + { + _taskExecutor.stopImmediately(); + } + finally + { + super.tearDown(); + } + } + + + public void testAsFilter() + { + VirtualHostNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO); + + Filter<ILoggingEvent> filter = filterObject.asFilter(); + + assertTrue("Unexpected filter instance", filter instanceof LoggerNameAndLevelFilter); + + LoggerNameAndLevelFilter f = (LoggerNameAndLevelFilter)filter; + assertEquals("Unexpected log level", Level.INFO, f.getLevel()); + assertEquals("Unexpected logger name", "org.apache.qpid", f.getLoggerName()); + } + + public void testLevelChangeAffectsFilter() + { + VirtualHostNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO); + + LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter(); + + assertEquals("Unexpected log level", Level.INFO, filter.getLevel()); + + filterObject.setAttributes(Collections.<String, Object>singletonMap("level", LogLevel.DEBUG)); + assertEquals("Unexpected log level attribute", Level.DEBUG, filter.getLevel()); + } + + public void testLoggerNameChangeNotAllowed() + { + VirtualHostNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO); + + LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter(); + + assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName()); + + try + { + filterObject.setAttributes(Collections.<String,Object>singletonMap(BrokerNameAndLevelFilter.LOGGER_NAME, "org.apache.qpid.foo")); + fail("IllegalConfigurationException is expected to throw on attempt to change logger name"); + } + catch(IllegalConfigurationException e) + { + // pass + } + + assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName()); + } + + + private VirtualHostNameAndLevelFilter createFilter(String loggerName, LogLevel logLevel) + { + Map<String, Object> attributes = new HashMap<>(); + attributes.put("loggerName", loggerName); + attributes.put("level", logLevel); + attributes.put("name", "test"); + + VirtualHostNameAndLevelFilterImpl nameAndLevelFilter = new VirtualHostNameAndLevelFilterImpl(attributes, + _virtualHostLogger); + nameAndLevelFilter.open(); + return nameAndLevelFilter; + } + + + +} \ No newline at end of file Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java (original) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java Mon Jun 15 15:43:53 2015 @@ -72,19 +72,31 @@ public class BrokerTest extends QpidTest public void testCreateBrokerLogger() { - Broker broker = _systemConfig.getBroker(); - Map<String,Object> attributes = new HashMap<>(); final String brokerLoggerName = "TestBrokerLogger"; - attributes.put(ConfiguredObject.NAME, brokerLoggerName); - attributes.put(ConfiguredObject.TYPE, BrokerMemoryLogger.TYPE); - - BrokerLogger child = (BrokerLogger) broker.createChild(BrokerLogger.class, attributes); - assertEquals("Created BrokerLoger has unexcpected name", brokerLoggerName, child.getName()); - assertTrue("BrokerLogger has unexpected type", child instanceof BrokerMemoryLogger); - ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - Appender appender = rootLogger.getAppender(brokerLoggerName); - assertNotNull("Appender not attached to root logger after BrokerLogger creation", appender); + try + { + Broker broker = _systemConfig.getBroker(); + Map<String, Object> attributes = new HashMap<>(); + attributes.put(ConfiguredObject.NAME, brokerLoggerName); + attributes.put(ConfiguredObject.TYPE, BrokerMemoryLogger.TYPE); + + BrokerLogger child = (BrokerLogger) broker.createChild(BrokerLogger.class, attributes); + assertEquals("Created BrokerLoger has unexcpected name", brokerLoggerName, child.getName()); + assertTrue("BrokerLogger has unexpected type", child instanceof BrokerMemoryLogger); + + Appender appender = rootLogger.getAppender(brokerLoggerName); + assertNotNull("Appender not attached to root logger after BrokerLogger creation", appender); + } + finally + { + Appender appender = rootLogger.getAppender(brokerLoggerName); + if (appender!= null) + { + appender.stop(); + rootLogger.detachAppender(appender); + } + } } } Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java (original) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java Mon Jun 15 15:43:53 2015 @@ -24,6 +24,7 @@ import static org.apache.qpid.server.sec import static org.apache.qpid.server.security.access.Operation.ACCESS_LOGS; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -55,9 +56,10 @@ import org.apache.qpid.server.model.Stat import org.apache.qpid.server.model.TrustStore; import org.apache.qpid.server.model.User; import org.apache.qpid.server.model.VirtualHost; +import org.apache.qpid.server.model.VirtualHostLogger; +import org.apache.qpid.server.model.VirtualHostLoggerFilter; import org.apache.qpid.server.model.VirtualHostNode; import org.apache.qpid.server.protocol.AMQConnectionModel; -import org.apache.qpid.server.queue.AMQQueue; import org.apache.qpid.server.queue.QueueConsumer; import org.apache.qpid.server.security.access.ObjectProperties; import org.apache.qpid.server.security.access.ObjectProperties.Property; @@ -92,6 +94,8 @@ public class SecurityManagerTest extends when(_virtualHost.getName()).thenReturn(TEST_VIRTUAL_HOST); when(_virtualHost.getAttribute(VirtualHost.NAME)).thenReturn(TEST_VIRTUAL_HOST); + when(_virtualHost.getModel()).thenReturn(BrokerModel.getInstance()); + doReturn(VirtualHost.class).when(_virtualHost).getCategoryClass(); _broker = mock(Broker.class); when(_broker.getAccessControlProviders()).thenReturn(Collections.singleton(aclProvider)); @@ -832,15 +836,64 @@ public class SecurityManagerTest extends public void testAuthoriseBrokerLoggerFilterOperations() { + BrokerLogger bl = mock(BrokerLogger.class); + when(bl.getAttribute(ConfiguredObject.NAME)).thenReturn("LOGGER"); + when(bl.getCategoryClass()).thenReturn(BrokerLogger.class); + when(bl.getParent(Broker.class)).thenReturn(_broker); + BrokerLoggerFilter mock = mock(BrokerLoggerFilter.class); when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("TEST"); - when(mock.getCategoryClass()).thenReturn(BrokerLogger.class); - when(mock.getParent(Broker.class)).thenReturn(_broker); - assertBrokerChildCreateAuthorization(mock); + when(mock.getCategoryClass()).thenReturn(BrokerLoggerFilter.class); + when(mock.getParent(BrokerLogger.class)).thenReturn(bl); + when(mock.getModel()).thenReturn(BrokerModel.getInstance()); + assertBrokerChildCreateAuthorization(mock, bl); when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("test"); - assertBrokerChildUpdateAuthorization(mock); - assertBrokerChildDeleteAuthorization(mock); + assertBrokerChildUpdateAuthorization(mock, bl); + assertBrokerChildDeleteAuthorization(mock, bl); + } + + + public void testAuthoriseVirtualHostLoggerOperations() + { + ObjectProperties properties = new ObjectProperties(TEST_VIRTUAL_HOST); + + VirtualHostLogger<?> mock = mock(VirtualHostLogger.class); + when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("TEST"); + doReturn(VirtualHostLogger.class).when(mock).getCategoryClass(); + when(mock.getParent(VirtualHost.class)).thenReturn(_virtualHost); + when(mock.getModel()).thenReturn(BrokerModel.getInstance()); + + assertCreateAuthorization(mock, Operation.CREATE, ObjectType.VIRTUALHOST, properties, _virtualHost); + + when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("test"); + + assertUpdateAuthorization(mock, Operation.UPDATE, ObjectType.VIRTUALHOST, properties, _virtualHost); + assertDeleteAuthorization(mock, Operation.DELETE, ObjectType.VIRTUALHOST, properties, _virtualHost); + } + + public void testAuthoriseVirtualHostLoggerFilterOperations() + { + ObjectProperties properties = new ObjectProperties(TEST_VIRTUAL_HOST); + + VirtualHostLogger<?> vhl = mock(VirtualHostLogger.class); + when(vhl.getAttribute(ConfiguredObject.NAME)).thenReturn("LOGGER"); + doReturn(VirtualHostLogger.class).when(vhl).getCategoryClass(); + when(vhl.getParent(VirtualHost.class)).thenReturn(_virtualHost); + when(vhl.getModel()).thenReturn(BrokerModel.getInstance()); + + VirtualHostLoggerFilter<?> mock = mock(VirtualHostLoggerFilter.class); + when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("TEST"); + doReturn(VirtualHostLoggerFilter.class).when(mock).getCategoryClass(); + when(mock.getParent(VirtualHostLogger.class)).thenReturn(vhl); + when(mock.getModel()).thenReturn(BrokerModel.getInstance()); + + assertCreateAuthorization(mock, Operation.CREATE, ObjectType.VIRTUALHOST, properties, vhl); + + when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("test"); + + assertUpdateAuthorization(mock, Operation.UPDATE, ObjectType.VIRTUALHOST, properties, vhl); + assertDeleteAuthorization(mock, Operation.DELETE, ObjectType.VIRTUALHOST, properties, vhl); } private VirtualHost getMockVirtualHost() @@ -867,16 +920,26 @@ public class SecurityManagerTest extends private void assertBrokerChildCreateAuthorization(ConfiguredObject object) { + assertBrokerChildCreateAuthorization(object, _broker); + } + + private void assertBrokerChildCreateAuthorization(ConfiguredObject object, ConfiguredObject parent) + { String description = String.format("%s %s '%s'", Operation.CREATE.name().toLowerCase(), object.getCategoryClass().getSimpleName().toLowerCase(), "TEST"); ObjectProperties properties = new OperationLoggingDetails(description); - assertCreateAuthorization(object, Operation.CONFIGURE, ObjectType.BROKER, properties, _broker ); + assertCreateAuthorization(object, Operation.CONFIGURE, ObjectType.BROKER, properties, parent); } private void assertBrokerChildUpdateAuthorization(ConfiguredObject configuredObject) { + assertBrokerChildUpdateAuthorization(configuredObject, _broker); + } + + private void assertBrokerChildUpdateAuthorization(ConfiguredObject configuredObject, ConfiguredObject parent) + { String description = String.format("%s %s '%s'", Operation.UPDATE.name().toLowerCase(), configuredObject.getCategoryClass().getSimpleName().toLowerCase(), @@ -884,11 +947,16 @@ public class SecurityManagerTest extends ObjectProperties properties = new OperationLoggingDetails(description); assertUpdateAuthorization(configuredObject, Operation.CONFIGURE, ObjectType.BROKER, - properties, _broker ); + properties, parent); } private void assertBrokerChildDeleteAuthorization(ConfiguredObject configuredObject) { + assertBrokerChildDeleteAuthorization(configuredObject, _broker); + } + + private void assertBrokerChildDeleteAuthorization(ConfiguredObject configuredObject, ConfiguredObject parent) + { String description = String.format("%s %s '%s'", Operation.DELETE.name().toLowerCase(), configuredObject.getCategoryClass().getSimpleName().toLowerCase(), @@ -896,7 +964,7 @@ public class SecurityManagerTest extends ObjectProperties properties = new OperationLoggingDetails(description); assertDeleteAuthorization(configuredObject, Operation.CONFIGURE, ObjectType.BROKER, - properties, _broker ); + properties, parent ); } private void assertAuthorization(Operation operation, ConfiguredObject<?> configuredObject, Operation aclOperation, ObjectType aclObjectType, ObjectProperties expectedProperties, ConfiguredObject... objects) Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java (original) +++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java Mon Jun 15 15:43:53 2015 @@ -37,8 +37,9 @@ public class HouseKeepingTaskTest extend String expectedThreadNameDuringExecution = vhostName + ":" + "ThreadNameRememberingTask"; - VirtualHost virtualHost = mock(VirtualHost.class); + VirtualHostImpl virtualHost = mock(VirtualHostImpl.class); when(virtualHost.getName()).thenReturn(vhostName); + when(virtualHost.getPrincipal()).thenReturn(mock(VirtualHostPrincipal.class)); ThreadNameRememberingTask testTask = new ThreadNameRememberingTask(virtualHost); testTask.run(); Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java (original) +++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java Mon Jun 15 15:43:53 2015 @@ -245,6 +245,7 @@ public class ServerConnection extends Co { _messageCompressionThreshold = Integer.MAX_VALUE; } + _authorizedSubject.getPrincipals().add(_virtualHost.getPrincipal()); } @Override Modified: qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java (original) +++ qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java Mon Jun 15 15:43:53 2015 @@ -1066,6 +1066,7 @@ public class AMQProtocolEngine implement { _messageCompressionThreshold = Integer.MAX_VALUE; } + _authorizedSubject.getPrincipals().add(virtualHost.getPrincipal()); } public void addDeleteTask(Action<? super AMQProtocolEngine> task) Modified: qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java (original) +++ qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java Mon Jun 15 15:43:53 2015 @@ -161,6 +161,7 @@ public class Connection_1_0 implements C { setUserPrincipal(user); } + _subject.getPrincipals().add(_vhost.getPrincipal()); if(AuthenticatedPrincipal.getOptionalAuthenticatedPrincipalFromSubject(_subject) == null) { final Error err = new Error(); Modified: qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java (original) +++ qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java Mon Jun 15 15:43:53 2015 @@ -42,6 +42,7 @@ import java.util.UUID; import javax.security.auth.Subject; import javax.security.sasl.Sasl; +import org.apache.qpid.server.virtualhost.VirtualHostPrincipal; import org.mockito.ArgumentCaptor; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -122,6 +123,7 @@ public class ProtocolEngine_1_0_0Test ex } }).when(_connectionRegistry).registerConnection(connectionCaptor.capture()); when(virtualHost.getConnectionRegistry()).thenReturn(_connectionRegistry); + when(virtualHost.getPrincipal()).thenReturn(mock(VirtualHostPrincipal.class)); when(_port.getVirtualHost(anyString())).thenReturn(virtualHost); when(_authenticationProvider.getSubjectCreator(anyBoolean())).thenReturn(_subjectCreator); Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java?rev=1685599&r1=1685598&r2=1685599&view=diff ============================================================================== --- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java (original) +++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java Mon Jun 15 15:43:53 2015 @@ -302,7 +302,7 @@ public class HttpManagement extends Abst root.addFilter(new FilterHolder(new RedirectingAuthorisationFilter()), "/", EnumSet.of(DispatcherType.REQUEST)); addRestServlet(root, Broker.class); - + ServletHolder apiDocsServlet = new ServletHolder(new ApiDocsServlet(getModel(), Collections.<String>emptyList())); root.addServlet(apiDocsServlet, "/apidocs"); root.addServlet(apiDocsServlet, "/apidocs/"); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
