diff options
author | Robert Gemmell <robbie@apache.org> | 2011-06-26 13:55:11 +0000 |
---|---|---|
committer | Robert Gemmell <robbie@apache.org> | 2011-06-26 13:55:11 +0000 |
commit | 205003bbf28de2c64a85cd47aa1a0e9d245885d3 (patch) | |
tree | 9a3c36ffc4d8832ff0fae01b7d1d1eec69058259 | |
parent | 4edfb54cabefeba396f8e326fd22ce55854ac406 (diff) | |
download | qpid-python-205003bbf28de2c64a85cd47aa1a0e9d245885d3.tar.gz |
QPID-3318: ensure the abstract HouseKeepingTask class removes the LogActor it adds to the stack
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1139793 13f79535-47bb-0310-9956-ffa450edef68
3 files changed, 342 insertions, 0 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java index 2db1944cd1..ebace95f65 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java @@ -63,6 +63,10 @@ public abstract class HouseKeepingTask implements Runnable { _logger.warn(this.getClass().getSimpleName() + " throw exception: " + e, e); } + finally + { + CurrentActor.remove(); + } } public VirtualHost getVirtualHost() diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java new file mode 100644 index 0000000000..98bf381712 --- /dev/null +++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java @@ -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.util.concurrent.CountDownLatch; + +import org.apache.qpid.server.logging.LogActor; +import org.apache.qpid.server.logging.NullRootMessageLogger; +import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.actors.TestLogActor; +import org.apache.qpid.test.utils.QpidTestCase; + +public class HouseKeepingTaskTest extends QpidTestCase +{ + /** + * Tests that the abstract HouseKeepingTask properly cleans up any LogActor + * it adds to the CurrentActor stack by verifying the CurrentActor set + * before task execution is the CurrentActor after execution. + */ + public void testCurrentActorStackBalance() throws Exception + { + //create and set a test actor + LogActor testActor = new TestLogActor(new NullRootMessageLogger()); + CurrentActor.set(testActor); + + //verify it is returned correctly before executing a HouseKeepingTask + assertEquals("Expected LogActor was not returned", testActor, CurrentActor.get()); + + final CountDownLatch latch = new CountDownLatch(1); + HouseKeepingTask testTask = new HouseKeepingTask(new MockVirtualHost("HouseKeepingTaskTestVhost")) + { + @Override + public void execute() + { + latch.countDown(); + } + }; + + //run the test HouseKeepingTask using the current Thread to influence its CurrentActor stack + testTask.run(); + + assertEquals("The expected LogActor was not returned, the CurrentActor stack has become unbalanced", + testActor, CurrentActor.get()); + assertEquals("HouseKeepingTask execute() method was not run", 0, latch.getCount()); + + //clean up the test actor + CurrentActor.remove(); + } +} diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java new file mode 100644 index 0000000000..7aa314bf22 --- /dev/null +++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java @@ -0,0 +1,271 @@ +/* + * + * 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.util.UUID; + +import org.apache.qpid.server.binding.BindingFactory; +import org.apache.qpid.server.configuration.BrokerConfig; +import org.apache.qpid.server.configuration.ConfigStore; +import org.apache.qpid.server.configuration.ConfiguredObject; +import org.apache.qpid.server.configuration.VirtualHostConfig; +import org.apache.qpid.server.configuration.VirtualHostConfigType; +import org.apache.qpid.server.configuration.VirtualHostConfiguration; +import org.apache.qpid.server.connection.IConnectionRegistry; +import org.apache.qpid.server.exchange.ExchangeFactory; +import org.apache.qpid.server.exchange.ExchangeRegistry; +import org.apache.qpid.server.federation.BrokerLink; +import org.apache.qpid.server.management.ManagedObject; +import org.apache.qpid.server.queue.QueueRegistry; +import org.apache.qpid.server.registry.IApplicationRegistry; +import org.apache.qpid.server.security.SecurityManager; +import org.apache.qpid.server.security.auth.manager.AuthenticationManager; +import org.apache.qpid.server.stats.StatisticsCounter; +import org.apache.qpid.server.store.DurableConfigurationStore; +import org.apache.qpid.server.store.MessageStore; +import org.apache.qpid.server.store.TransactionLog; + +public class MockVirtualHost implements VirtualHost +{ + private String _name; + + public MockVirtualHost(String name) + { + _name = name; + } + + public void close() + { + + } + + public void createBrokerConnection(String transport, String host, int port, + String vhost, boolean durable, String authMechanism, + String username, String password) + { + + } + + public IApplicationRegistry getApplicationRegistry() + { + return null; + } + + public AuthenticationManager getAuthenticationManager() + { + return null; + } + + public BindingFactory getBindingFactory() + { + return null; + } + + public UUID getBrokerId() + { + return null; + } + + public ConfigStore getConfigStore() + { + return null; + } + + public VirtualHostConfiguration getConfiguration() + { + return null; + } + + public IConnectionRegistry getConnectionRegistry() + { + return null; + } + + public DurableConfigurationStore getDurableConfigurationStore() + { + return null; + } + + public ExchangeFactory getExchangeFactory() + { + return null; + } + + public ExchangeRegistry getExchangeRegistry() + { + return null; + } + + public int getHouseKeepingActiveCount() + { + return 0; + } + + public long getHouseKeepingCompletedTaskCount() + { + return 0; + } + + public int getHouseKeepingPoolSize() + { + return 0; + } + + public long getHouseKeepingTaskCount() + { + return 0; + } + + public ManagedObject getManagedObject() + { + return null; + } + + public MessageStore getMessageStore() + { + return null; + } + + public String getName() + { + return _name; + } + + public QueueRegistry getQueueRegistry() + { + return null; + } + + public SecurityManager getSecurityManager() + { + return null; + } + + public TransactionLog getTransactionLog() + { + return null; + } + + public void removeBrokerConnection(BrokerLink brokerLink) + { + + } + + public void scheduleHouseKeepingTask(long period, HouseKeepingTask task) + { + + } + + public void setHouseKeepingPoolSize(int newSize) + { + + } + + public BrokerConfig getBroker() + { + return null; + } + + public String getFederationTag() + { + return null; + } + + public void setBroker(BrokerConfig brokerConfig) + { + + } + + public VirtualHostConfigType getConfigType() + { + return null; + } + + public long getCreateTime() + { + return 0; + } + + public UUID getId() + { + return null; + } + + public ConfiguredObject<VirtualHostConfigType, VirtualHostConfig> getParent() + { + return null; + } + + public boolean isDurable() + { + return false; + } + + public StatisticsCounter getDataDeliveryStatistics() + { + return null; + } + + public StatisticsCounter getDataReceiptStatistics() + { + return null; + } + + public StatisticsCounter getMessageDeliveryStatistics() + { + return null; + } + + public StatisticsCounter getMessageReceiptStatistics() + { + return null; + } + + public void initialiseStatistics() + { + + } + + public boolean isStatisticsEnabled() + { + return false; + } + + public void registerMessageDelivered(long messageSize) + { + + } + + public void registerMessageReceived(long messageSize, long timestamp) + { + + } + + public void resetStatistics() + { + + } + + public void setStatisticsEnabled(boolean enabled) + { + + } +}
\ No newline at end of file |