blob: d38665b162692e5a4431a9d95fe31babd872c851 [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.server.logging;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import javax.jms.Connection;
import org.apache.qpid.configuration.CommonProperties;
public class ConnectionLoggingTest extends AbstractTestLogging
{
private static final String CONNECTION_PREFIX = "CON-";
// No explicit startup configuration is required for this test
// so no setUp() method
/**
* Description:
* When a new connection is made to the broker this must be logged.
*
* Input:
* 1. Running Broker
* 2. Connecting client
* Output:
* <date> CON-1001 : Open ....
*
* Validation Steps:
* 1. The CON ID is correct
* 2. This is the first CON message for that Connection
*
* @throws Exception - if an error occurs
*/
public void testConnectionOpen() throws Exception
{
assertLoggingNotYetOccured(CONNECTION_PREFIX);
Connection connection = getConnection();
String clientid = connection.getClientID();
// Wait until opened
waitForMessage("CON-1001");
// Close the connection
connection.close();
// Wait to ensure that the desired message is logged
waitForMessage("CON-1002");
List<String> results = waitAndFindMatches("CON-1001");
// MESSAGE [con:1(/127.0.0.1:46927)] CON-1001 : Open : Destination : amqp(127.0.0.1:15672) : Protocol Version : 0-10
// MESSAGE [con:1(guest@/127.0.0.1:46927/test)] CON-1001 : Open : Destination : amqp(127.0.0.1:15672) : Protocol Version : 0-10 : Client ID : clientid : Client Version : 6.0.0-SNAPSHOT : Client Product : qpid
// MESSAGE [con:1(guest@/127.0.0.1:46927/test)] CON-1002 : Close
Map<Integer, List<String>> connectionData = splitResultsOnConnectionID(results);
// Get the last Integer from keySet of the ConnectionData
int connectionID = new TreeSet<>(connectionData.keySet()).last();
//Use just the data from the last connection for the test
results = connectionData.get(connectionID);
assertEquals("Unexpected CON-1001 messages count", 2, results.size());
// validate the two CON-1001 messages.
// MESSAGE [con:1(guest@/127.0.0.1:46927/test)] CON-1001 : Open : Destination : amqp(127.0.0.1:15672) : Protocol Version : 0-10 : Client ID : clientid : Client Version : 6.0.0-SNAPSHOT : Client Product : qpid
validateConnectionOpen(results, 0,
true, getBrokerProtocol().getProtocolVersion(),
true, clientid,
true, CommonProperties.getReleaseVersion(),
true, CommonProperties.getProductName());
// MESSAGE [con:1(/127.0.0.1:46927)] CON-1001 : Open : Destination : amqp(127.0.0.1:15672) : Protocol Version : 0-10
validateConnectionOpen(results, 1,
true, getBrokerProtocol().getProtocolVersion(),
false, null,
false, null,
false, null);
}
private void validateConnectionOpen(List<String> results, int positionFromEnd,
boolean protocolVersionPresent, final String protocolVersionValue,
boolean clientIdOptionPresent, String clientIdValue,
boolean clientVersionPresent, String clientVersionValue,
boolean clientProductPresent, String clientProductValue)
{
String log = getLogMessageFromEnd(results, positionFromEnd);
validateMessageID("CON-1001", log);
String message = fromMessage(log);
assertTrue("Destination not present", message.contains("Destination :"));
assertEquals("unexpected Protocol Version option state",
protocolVersionPresent, message.contains("Protocol Version :"));
if(protocolVersionPresent && protocolVersionValue != null)
{
assertTrue("Protocol Version value is not present: " + protocolVersionValue, message.contains(protocolVersionValue));
}
assertEquals("unexpected Client ID option state", clientIdOptionPresent, message.contains("Client ID :"));
if(clientIdOptionPresent && clientIdValue != null)
{
assertTrue("Client ID value is not present: " + clientIdValue, message.contains(clientIdValue));
}
assertEquals("unexpected Client Version option state", clientVersionPresent, message.contains(
"Client Version :"));
if(clientVersionPresent && clientVersionValue != null && !isBroker10())
{
assertTrue("Client version value is not present: " + clientVersionValue, message.contains(
clientVersionValue));
}
assertEquals("unexpected Client Product option state", clientVersionPresent, message.contains(
"Client Product :"));
if(clientProductPresent && clientProductValue != null && !isBroker10())
{
assertTrue("Client product value is not present: " + clientProductValue, message.contains(
clientProductValue));
}
}
/**
* Description:
* When a connected client closes the connection this will be logged as a CON-1002 message.
* Input:
*
* 1. Running Broker
* 2. Connected Client
* Output:
*
* <date> CON-1002 : Close
*
* Validation Steps:
* 3. The CON ID is correct
* 4. This must be the last CON message for the Connection
* 5. It must be preceded by a CON-1001 for this Connection
*/
public void testConnectionClose() throws Exception
{
assertLoggingNotYetOccured(CONNECTION_PREFIX);
Connection connection = getConnection();
// Wait until opened
waitForMessage("CON-1001");
// Close the conneciton
connection.close();
// Wait to ensure that the desired message is logged
waitForMessage("CON-1002");
List<String> results = findMatches(CONNECTION_PREFIX);
// Validation
assertEquals("CON messages not logged:" + results.size(), 3, results.size());
// Validate Close message occurs
String log = getLogMessageFromEnd(results, 0);
validateMessageID("CON-1002",log);
assertTrue("Message does not end with close:" + log, log.endsWith("Close"));
// Extract connection ID to validate there is a CON-1001 message for it
final String logSubject = fromActor(log);
int closeConnectionID = getConnectionID(logSubject);
assertTrue("Could not get the connection id from CLOSE message: " + logSubject, closeConnectionID != -1);
//Previous log message should be the open
log = getLogMessageFromEnd(results, 1);
// MESSAGE [con:1(/127.0.0.1:52540)] CON-1001 : Open : Client ID : clientid : Protocol Version : 0-9
validateMessageID("CON-1001",log);
// Extract connection ID to validate it matches the CON-1002 messasge
int openConnectionID = getConnectionID(fromActor(log));
assertTrue("Could not find connection id in OPEN", openConnectionID != -1);
// Check connection ids match
assertEquals("Connection IDs do not match", closeConnectionID, openConnectionID);
}
}