using System;
using System.Text;
using log4net;
using Apache.Qpid.Messaging;
namespace Apache.Qpid.Client.Tests.interop.TestCases
{
///
/// Implements test case 2, basic P2P. Sends/receives a specified number of messages to a specified route on the
/// default direct exchange. Produces reports on the actual number of messages sent/received.
///
///
CRC Card
///
Responsibilities
Collaborations
///
Supply the name of the test case that this implements.
///
Accept/Reject invites based on test parameters.
///
Adapt to assigned roles.
///
Send required number of test messages.
///
Generate test reports.
///
///
public class TestCase2BasicP2P : InteropClientTestCase
{
/// Used for debugging.
private static ILog log = LogManager.GetLogger(typeof(TestCase2BasicP2P));
/// Holds the count of test messages received.
private int messageCount;
/// The role to be played by the test.
private Roles role;
/// The number of test messages to send.
private int numMessages;
/// The routing key to send them to on the default direct exchange.
private string sendDestination;
/// The connection to send the test messages on.
private IConnection connection;
/// The session to send the test messages on.
private IChannel channel;
/// The producer to send the test messages with.
private IMessagePublisher publisher;
///
/// Should provide the name of the test case that this class implements. The exact names are defined in the
/// interop testing spec.
///
///
/// The name of the test case that this implements.
public String GetName()
{
log.Debug("public String GetName(): called");
return "TC2_BasicP2P";
}
///
/// Determines whether the test invite that matched this test case is acceptable.
///
///
/// The invitation to accept or reject.
///
/// true to accept the invitation, false to reject it.
public bool AcceptInvite(IMessage inviteMessage)
{
log.Debug("public boolean AcceptInvite(Message inviteMessage = " + inviteMessage + "): called");
// All invites are acceptable.
return true;
}
///
/// Assigns the role to be played by this test case. The test parameters are fully specified in the
/// assignment message. When this method return the test case will be ready to execute.
///
///
/// The role to be played; sender or receiver.
/// The role assingment message, contains the full test parameters.
public void AssignRole(Roles role, IMessage assignRoleMessage)
{
log.Debug("public void AssignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
+ "): called");
// Reset the message count for a new test.
messageCount = 0;
// Take note of the role to be played.
this.role = role;
// Create a new connection to pass the test messages on.
connection =
TestClient.CreateConnection(TestClient.brokerUrl, TestClient.virtualHost);
channel = connection.CreateChannel(false, AcknowledgeMode.AutoAcknowledge);
// Extract and retain the test parameters.
numMessages = assignRoleMessage.Headers.GetInt("P2P_NUM_MESSAGES");
string queueAndKeyName = assignRoleMessage.Headers.GetString("P2P_QUEUE_AND_KEY_NAME");
channel.DeclareQueue(queueAndKeyName, false, true, true);
channel.Bind(queueAndKeyName, ExchangeNameDefaults.DIRECT, queueAndKeyName);
sendDestination = queueAndKeyName;
log.Debug("numMessages = " + numMessages);
log.Debug("sendDestination = " + sendDestination);
log.Debug("role = " + role);
switch (role)
{
// Check if the sender role is being assigned, and set up a message producer if so.
case Roles.SENDER:
publisher = channel.CreatePublisherBuilder()
.WithExchangeName(ExchangeNameDefaults.DIRECT)
.WithRoutingKey(sendDestination)
.Create();
break;
// Otherwise the receiver role is being assigned, so set this up to listen for messages.
case Roles.RECEIVER:
IMessageConsumer consumer = channel.CreateConsumerBuilder(sendDestination).Create();
consumer.OnMessage += new MessageReceivedDelegate(OnMessage);
break;
}
connection.Start();
}
/// Performs the test case actions.
public void Start()
{
log.Debug("public void start(): called");
// Check that the sender role is being performed.
if (role == Roles.SENDER)
{
IMessage testMessage = channel.CreateTextMessage("test");
for (int i = 0; i < numMessages; i++)
{
publisher.Send(testMessage);
// Increment the message count.
messageCount++;
}
}
}
///
/// Gets a report on the actions performed by the test case in its assigned role.
///
///
/// The session to create the report message in.
///
/// The report message.
public IMessage GetReport(IChannel channel)
{
log.Debug("public Message GetReport(IChannel channel): called");
// Close the test connection.
//connection.Stop();
// Generate a report message containing the count of the number of messages passed.
IMessage report = channel.CreateMessage();
//report.Headers.SetString("CONTROL_TYPE", "REPORT");
report.Headers.SetInt("MESSAGE_COUNT", messageCount);
return report;
}
///
/// Counts incoming test messages.
///
///
/// The incoming test message.
public void OnMessage(IMessage message)
{
log.Debug("public void OnMessage(IMessage message = " + message + "): called");
// Increment the message count.
messageCount++;
}
}
}