blob: 47b38381c57169362b5cf07478a6d1a40a630400 [file] [log] [blame]
/*
*
* 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.systest.management.jmx;
import org.apache.qpid.management.common.mbeans.ManagedBroker;
import org.apache.qpid.management.common.mbeans.ManagedConnection;
import org.apache.qpid.management.common.mbeans.ManagedExchange;
import org.apache.qpid.server.logging.AbstractTestLogging;
import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject;
import org.apache.qpid.test.utils.JMXTestUtils;
import javax.jms.Connection;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.management.JMException;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* Test class to test if any change in the broker JMX code is affesting the management console
* There are some hardcoding of management feature names and parameter names to create a customized
* look in the console.
*/
public class ManagementActorLoggingTest extends AbstractTestLogging
{
private JMXTestUtils _jmxUtils;
private boolean _closed = false;
@Override
public void setUp() throws Exception
{
_jmxUtils = new JMXTestUtils(this);
_jmxUtils.setUp();
super.setUp();
_jmxUtils.open();
}
@Override
public void tearDown() throws Exception
{
if(!_closed)
{
_jmxUtils.close();
}
super.tearDown();
}
/**
* Description:
* When a connected client has its connection closed via the Management Console this will be logged as a CON-1002 message.
* Input:
*
* 1. Running Broker
* 2. Connected Client
* 3. Connection is closed via Management Console
* Output:
*
* <date> CON-1002 : Close
*
* Validation Steps:
* 4. The CON ID is correct
* 5. This must be the last CON message for the Connection
* 6. It must be preceded by a CON-1001 for this Connection
*
* @throws Exception - {@see ManagedConnection.closeConnection and #getConnection}
* @throws java.io.IOException - if there is a problem reseting the log monitor
*/
public void testConnectionCloseViaManagement() throws IOException, Exception
{
//Create a connection to the broker
Connection connection = getConnection();
// Monitor the connection for an exception being thrown
// this should be a DisconnectionException but it is not this tests
// job to valiate that. Only use the exception as a synchronisation
// to check the log file for the Close message
final CountDownLatch exceptionReceived = new CountDownLatch(1);
connection.setExceptionListener(new ExceptionListener()
{
public void onException(JMSException e)
{
//Failover being attempted.
exceptionReceived.countDown();
}
});
//Remove the connection close from any 0-10 connections
_monitor.markDiscardPoint();
// Get a managedConnection
ManagedConnection mangedConnection = _jmxUtils.getManagedObject(ManagedConnection.class, "org.apache.qpid:type=VirtualHost.Connection,*");
//Close the connection
mangedConnection.closeConnection();
//Wait for the connection to close
assertTrue("Timed out waiting for conneciton to report close",
exceptionReceived.await(2, TimeUnit.SECONDS));
//Validate results
List<String> results = waitAndFindMatches("CON-1002");
assertEquals("Unexpected Connection Close count", 1, results.size());
}
/**
* Description:
* Exchange creation is possible from the Management Console.
* When an exchanged is created in this way then a EXH-1001 create message
* is expected to be logged.
* Input:
*
* 1. Running broker
* 2. Connected Management Console
* 3. Exchange Created via Management Console
* Output:
*
* EXH-1001 : Create : [Durable] Type:<value> Name:<value>
*
* Validation Steps:
* 4. The EXH ID is correct
* 5. The correct tags are present in the message based on the create options
*
* @throws java.io.IOException - if there is a problem reseting the log monitor
* @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue}
*/
public void testCreateExchangeDirectTransientViaManagementConsole() throws IOException, JMException
{
_monitor.markDiscardPoint();
_jmxUtils.createExchange("test", getName(), "direct", false);
// Validate
//1 - ID is correct
List<String> results = waitAndFindMatches("EXH-1001");
assertEquals("More than one exchange creation found", 1, results.size());
String log = getLogMessage(results, 0);
// Validate correct exchange name
assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
public void testCreateExchangeTopicTransientViaManagementConsole() throws IOException, JMException
{
//Remove any previous exchange declares
_monitor.markDiscardPoint();
_jmxUtils.createExchange("test", getName(), "topic", false);
// Validate
//1 - ID is correct
List<String> results = waitAndFindMatches("EXH-1001");
assertEquals("More than one exchange creation found", 1, results.size());
String log = getLogMessage(results, 0);
// Validate correct exchange name
assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
public void testCreateExchangeFanoutTransientViaManagementConsole() throws IOException, JMException
{
//Remove any previous exchange declares
_monitor.markDiscardPoint();
_jmxUtils.createExchange("test", getName(), "fanout", false);
// Validate
//1 - ID is correct
List<String> results = waitAndFindMatches("EXH-1001");
assertEquals("More than one exchange creation found", 1, results.size());
String log = getLogMessage(results, 0);
// Validate correct exchange name
assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
public void testCreateExchangeHeadersTransientViaManagementConsole() throws IOException, JMException
{
//Remove any previous exchange declares
_monitor.markDiscardPoint();
_jmxUtils.createExchange("test", getName(), "headers", false);
// Validate
//1 - ID is correct
List<String> results = waitAndFindMatches("EXH-1001");
assertEquals("More than one exchange creation found", 1, results.size());
String log = getLogMessage(results, 0);
// Validate correct exchange name
assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
/**
* Description:
* Queue creation is possible from the Management Console. When a queue is created in this way then a QUE-1001 create message is expected to be logged.
* Input:
*
* 1. Running broker
* 2. Connected Management Console
* 3. Queue Created via Management Console
* Output:
*
* <date> QUE-1001 : Create : Transient Owner:<name>
*
* Validation Steps:
* 4. The QUE ID is correct
* 5. The correct tags are present in the message based on the create options
*
* @throws java.io.IOException - if there is a problem reseting the log monitor
* @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue}
*/
public void testCreateQueueTransientViaManagementConsole() throws IOException, JMException
{
//Remove any previous queue declares
_monitor.markDiscardPoint();
_jmxUtils.createQueue("test", getName(), null, false);
// Validate
List<String> results = waitAndFindMatches("QUE-1001");
assertEquals("More than one queue creation found", 1, results.size());
String log = getLogMessage(results, 0);
// Validate correct queue name
String subject = fromSubject(log);
assertEquals("Incorrect queue name created", getName(), AbstractTestLogSubject.getSlice("qu", subject));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
/**
* Description:
* The ManagementConsole can be used to delete a queue. When this is done a QUE-1002 Deleted message must be logged.
* Input:
*
* 1. Running Broker
* 2. Queue created on the broker with no subscribers
* 3. Management Console connected
* 4. Queue is deleted via Management Console
* Output:
*
* <date> QUE-1002 : Deleted
*
* Validation Steps:
* 5. The QUE ID is correct
*
* @throws java.io.IOException - if there is a problem reseting the log monitor
* @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue}
*/
public void testQueueDeleteViaManagementConsole() throws IOException, JMException
{
//Remove any previous queue declares
_monitor.markDiscardPoint();
_jmxUtils.createQueue("test", getName(), null, false);
ManagedBroker managedBroker = _jmxUtils.getManagedBroker("test");
managedBroker.deleteQueue(getName());
List<String> results = waitAndFindMatches("QUE-1002");
assertEquals("More than one queue deletion found", 1, results.size());
String log = getLog(results.get(0));
// Validate correct binding
String subject = fromSubject(log);
assertEquals("Incorrect queue named in delete", getName(), AbstractTestLogSubject.getSlice("qu", subject));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
/**
* Description:
* The binding of a Queue and an Exchange is done via a Binding. When this Binding is created via the Management Console a BND-1001 Create message will be logged.
* Input:
*
* 1. Running Broker
* 2. Connected Management Console
* 3. Use Management Console to perform binding
* Output:
*
* <date> BND-1001 : Create
*
* Validation Steps:
* 4. The BND ID is correct
* 5. This will be the first message for the given binding
*
* @throws java.io.IOException - if there is a problem reseting the log monitor
* @throws javax.management.JMException - {@see #createQueue and ManagedExchange.createNewBinding}
*/
public void testBindingCreateOnDirectViaManagementConsole() throws IOException, JMException
{
//Remove any previous queue declares
_monitor.markDiscardPoint();
_jmxUtils.createQueue("test", getName(), null, false);
ManagedExchange managedExchange = _jmxUtils.getManagedExchange("amq.direct");
managedExchange.createNewBinding(getName(), getName());
List<String> results = waitAndFindMatches("BND-1001");
assertEquals("Unexpected number of bindings logged", 2, results.size());
String log = getLogMessage(results, 0);
// Validate correct binding
String subject = fromSubject(log);
assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject));
assertEquals("Incorrect routing key in create", getName(), AbstractTestLogSubject.getSlice("rk", subject));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
public void testBindingCreateOnTopicViaManagementConsole() throws IOException, JMException
{
//Remove any previous queue declares
_monitor.markDiscardPoint();
_jmxUtils.createQueue("test", getName(), null, false);
ManagedExchange managedExchange = _jmxUtils.getManagedExchange("amq.topic");
managedExchange.createNewBinding(getName(), getName());
List<String> results = waitAndFindMatches("BND-1001");
assertEquals("Unexpected number of bindings logged", 2, results.size());
String log = getLogMessage(results, 0);
// Validate correct binding
String subject = fromSubject(log);
assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject));
assertEquals("Incorrect routing key in create", getName(), AbstractTestLogSubject.getSlice("rk", subject));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
public void testBindingCreateOnFanoutViaManagementConsole() throws IOException, JMException
{
//Remove any previous queue declares
_monitor.markDiscardPoint();
_jmxUtils.createQueue("test", getName(), null, false);
ManagedExchange managedExchange = _jmxUtils.getManagedExchange("amq.fanout");
managedExchange.createNewBinding(getName(), getName());
List<String> results = waitAndFindMatches("BND-1001");
assertEquals("Unexpected number of bindings logged", 2, results.size());
String log = getLogMessage(results, 0);
// Validate correct binding
String subject = fromSubject(log);
assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject));
assertEquals("Incorrect routing key in create", getName(), AbstractTestLogSubject.getSlice("rk", subject));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
/**
* Description:
* Bindings can be deleted so that a queue can be rebound with a different set of values. This can be performed via the Management Console
* Input:
*
* 1. Running Broker
* 2. Management Console connected
* 3. Management Console is used to perform unbind.
* Output:
*
* <date> BND-1002 : Deleted
*
* Validation Steps:
* 4. The BND ID is correct
* 5. There must have been a BND-1001 Create message first.
* 6. This will be the last message for the given binding
*
* @throws java.io.IOException - if there is a problem reseting the log monitor or an issue with the JMX Connection
* @throws javax.management.JMException - {@see #createExchange and ManagedBroker.unregisterExchange}
*/
public void testUnRegisterExchangeViaManagementConsole() throws IOException, JMException
{
//Remove any previous queue declares
_monitor.markDiscardPoint();
_jmxUtils.createExchange("test", getName(), "direct", false);
ManagedBroker managedBroker = _jmxUtils.getManagedBroker("test");
managedBroker.unregisterExchange(getName());
List<String> results = waitAndFindMatches("EXH-1002");
assertEquals("More than one exchange deletion found", 1, results.size());
String log = getLog(results.get(0));
// Validate correct binding
String subject = fromSubject(log);
assertEquals("Incorrect exchange named in delete", "direct/" + getName(), AbstractTestLogSubject.getSlice("ex", subject));
// Validate it was a management actor.
String actor = fromActor(log);
assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
}
}