From dbe349500e458cdf38cd4e561d27c9fa24dff7ca Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Fri, 18 May 2007 00:51:12 +0000 Subject: Merged revisions 537954-538078,538080-538083,538085-538097,538099-538108,538110-538239,538241-538881,538883-538906,538908-538911,538913-538921,538923-539191 via svnmerge from https://svn.apache.org/repos/asf/incubator/qpid/branches/M2 ........ r537954 | tomasr | 2007-05-14 14:10:59 -0500 (Mon, 14 May 2007) | 4 lines * QPID-487 (Contributed by Carlos Medina) Fix QpidConnectionInfo.ToString() * QPID-485 (Contributed by Carlos Medina) Fix AmqBrokerInfo.Equals() * QPID-456 Enforce virtual host names start with '/' ........ r538035 | tomasr | 2007-05-14 20:33:00 -0500 (Mon, 14 May 2007) | 6 lines * QPID-452 Improve message classes API * Add XML documentation to IChannel and IMessage * Add missing BrokerDetailTests * Add new tests for message creation and message factories * Fix wrong default encoding for text messages ........ r539178 | tomasr | 2007-05-17 18:50:50 -0500 (Thu, 17 May 2007) | 6 lines * QPID-492 Fix Race condition in message decoding * QPID-249 Make ServiceRequestingClient and ServiceProvidingClient a single, self contained test * Fix incorrect exception message in Qpid.Buffers, improve tests * Make ContentBody use an sliced buffer to avoid extra data copy * Remove useless tests in Qpid.Client (Blocking IO tests) ........ r539191 | tomasr | 2007-05-17 19:18:26 -0500 (Thu, 17 May 2007) | 1 line QPID-490 (Contributed by Carlos Medina) Implement PurgeQueue and DeleteQueue ........ git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@539198 13f79535-47bb-0310-9956-ffa450edef68 --- .../BrokerDetails/BrokerDetailsTest.cs | 65 ++++++ .../Channel/ChannelMessageCreationTests.cs | 78 +++++++ .../Qpid.Client.Tests/Channel/ChannelQueueTest.cs | 251 +++++++++++++++++++++ .../Messages/MessageFactoryRegistryTests.cs | 113 ++++++++++ .../MultiConsumer/ProducerMultiConsumer.cs | 8 +- dotnet/Qpid.Client.Tests/Qpid.Client.Tests.csproj | 5 +- dotnet/Qpid.Client.Tests/bio/BlockingIo.cs | 73 ------ dotnet/Qpid.Client.Tests/log4net.config | 6 +- .../requestreply1/ServiceProvidingClient.cs | 66 +++--- .../requestreply1/ServiceRequestingClient.cs | 64 +----- dotnet/Qpid.Client.Tests/url/ConnectionUrlTest.cs | 38 ++++ 11 files changed, 602 insertions(+), 165 deletions(-) create mode 100644 dotnet/Qpid.Client.Tests/BrokerDetails/BrokerDetailsTest.cs create mode 100644 dotnet/Qpid.Client.Tests/Channel/ChannelMessageCreationTests.cs create mode 100644 dotnet/Qpid.Client.Tests/Channel/ChannelQueueTest.cs create mode 100644 dotnet/Qpid.Client.Tests/Messages/MessageFactoryRegistryTests.cs delete mode 100644 dotnet/Qpid.Client.Tests/bio/BlockingIo.cs (limited to 'dotnet/Qpid.Client.Tests') diff --git a/dotnet/Qpid.Client.Tests/BrokerDetails/BrokerDetailsTest.cs b/dotnet/Qpid.Client.Tests/BrokerDetails/BrokerDetailsTest.cs new file mode 100644 index 0000000000..8bc615bd20 --- /dev/null +++ b/dotnet/Qpid.Client.Tests/BrokerDetails/BrokerDetailsTest.cs @@ -0,0 +1,65 @@ +/* + * + * 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. + * + */ +using System; +using System.Net; +using NUnit.Framework; +using Qpid.Client.Qms; + +namespace Qpid.Client.Tests.BrokerDetails +{ + [TestFixture] + public class BrokerDetailsTest + { + + [Test] + public void ValidateBrokerInfoEqualsMethod() + { + AmqBrokerInfo broker = new AmqBrokerInfo("amqp", "localhost", 5672, true); + AmqBrokerInfo broker1 = new AmqBrokerInfo("Amqp", "localhost", 5672, true); + + Assert.IsTrue(broker.Equals(broker1),"The two AmqBrokerInfo objects are not equals"); + Console.WriteLine(string.Format("The object broker: {0} and broker1: {1} are equals", broker, broker1)); + } + + [Test] + public void ValidateBrokerInfoWithDifferentSSL() + { + AmqBrokerInfo broker = new AmqBrokerInfo("amqp", "localhost", 5672, true); + AmqBrokerInfo broker1 = new AmqBrokerInfo("amqp", "localhost", 5672, false); + + Assert.IsFalse(broker.Equals(broker1), "The two AmqBrokerInfo objects are equals"); + Console.WriteLine(string.Format("The object broker: {0} and broker1: {1} are not equals", broker, broker1)); + } + + [Test] + public void ValidateBrokerInfoFromToString() + { + String url = "tcp://localhost:5672?timeout='200',immediatedelivery='true'"; + + AmqBrokerInfo broker = new AmqBrokerInfo(url); + AmqBrokerInfo broker1 = new AmqBrokerInfo(broker.ToString()); + + Assert.AreEqual(broker.GetOption("timeout"), broker1.GetOption("timeout")); + Assert.AreEqual(broker.GetOption("immediatedelivery"), broker1.GetOption("immediatedelivery")); + } + + } +} diff --git a/dotnet/Qpid.Client.Tests/Channel/ChannelMessageCreationTests.cs b/dotnet/Qpid.Client.Tests/Channel/ChannelMessageCreationTests.cs new file mode 100644 index 0000000000..40ba1dd25a --- /dev/null +++ b/dotnet/Qpid.Client.Tests/Channel/ChannelMessageCreationTests.cs @@ -0,0 +1,78 @@ +/* + * + * 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. + * + */ + +using System; + +using log4net; +using NUnit.Framework; +using Qpid.Client; +using Qpid.Client.Message; +using Qpid.Messaging; + +namespace Qpid.Client.Tests.Channel +{ + /// + /// Test that channels can create messages correctly + /// + [TestFixture] + public class ChannelMessageCreationTests + { + [Test] + public void CanCreateTextMessage() + { + IChannel channel = AmqChannel.CreateDisconnectedChannel(); + ITextMessage msg = channel.CreateTextMessage(); + Assert.IsNotNull(msg); + } + [Test] + public void CanCreateTextMessageWithContent() + { + IChannel channel = AmqChannel.CreateDisconnectedChannel(); + const string CONTENT = "1234567890"; + ITextMessage msg = channel.CreateTextMessage(CONTENT); + Assert.IsNotNull(msg); + Assert.AreEqual(CONTENT, msg.Text); + } + [Test] + public void CanCreateBytesMessage() + { + IChannel channel = AmqChannel.CreateDisconnectedChannel(); + IBytesMessage msg = channel.CreateBytesMessage(); + Assert.IsNotNull(msg); + } + [Test] + public void CanCreateMessage() + { + IChannel channel = AmqChannel.CreateDisconnectedChannel(); + IMessage msg = channel.CreateMessage(); + Assert.IsNotNull(msg); + } + [Test] + public void CanCreateMessageFromMimeType() + { + IChannel channel = AmqChannel.CreateDisconnectedChannel(); + IMessage msg = channel.CreateMessage("text/xml"); + Assert.IsNotNull(msg); + Assert.IsInstanceOfType(typeof(ITextMessage), msg); + } + } +} // namespace Qpid.Client.Tests.Channel + diff --git a/dotnet/Qpid.Client.Tests/Channel/ChannelQueueTest.cs b/dotnet/Qpid.Client.Tests/Channel/ChannelQueueTest.cs new file mode 100644 index 0000000000..88a056a245 --- /dev/null +++ b/dotnet/Qpid.Client.Tests/Channel/ChannelQueueTest.cs @@ -0,0 +1,251 @@ +/* + * + * 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. + * + */ +using System; +using System.Net; +using System.Threading; +using log4net; +using Qpid.Client.Qms; +using Qpid.Messaging; +using NUnit.Framework; + +namespace Qpid.Client.Tests.Channel +{ + /// + /// Test the queue methods + /// + [TestFixture] + public class ChannelQueueTest + { + + private static ILog _logger = LogManager.GetLogger(typeof(ChannelQueueTest)); + + /// The default AMQ connection URL to use for tests. + const string DEFAULT_URI = "amqp://guest:guest@default/test?brokerlist='tcp://localhost:5672'"; + const string _routingKey = "ServiceQ1"; + + private ExceptionListenerDelegate _exceptionDelegate; + private AutoResetEvent _evt = new AutoResetEvent(false); + private Exception _lastException = null; + + private IMessageConsumer _consumer; + private IMessagePublisher _publisher; + private IChannel _channel; + private IConnection _connection; + + private string _queueName; + + [SetUp] + public virtual void Init() + { + _logger.Info("public virtual void Init(): called"); + + // Create a connection to the broker. + IConnectionInfo connectionInfo = QpidConnectionInfo.FromUrl(DEFAULT_URI); + _connection = new AMQConnection(connectionInfo); + _logger.Info("Starting..."); + + // Register this to listen for exceptions on the test connection. + _exceptionDelegate = new ExceptionListenerDelegate(OnException); + _connection.ExceptionListener += _exceptionDelegate; + + // Establish a session on the broker. + _channel = _connection.CreateChannel(false, AcknowledgeMode.AutoAcknowledge, 1); + + // Create a durable, non-temporary, non-exclusive queue. + _queueName = _channel.GenerateUniqueName(); + _channel.DeclareQueue(_queueName, true, false, false); + + _channel.Bind(_queueName, ExchangeNameDefaults.TOPIC, _routingKey); + + // Clear the most recent message and exception. + _lastException = null; + } + + [TearDown] + public virtual void ShutDown() + { + _logger.Info("public virtual void Shutdown(): called"); + + if (_connection != null) + { + _logger.Info("Disposing connection."); + _connection.Dispose(); + _logger.Info("Connection disposed."); + } + } + + [Test] + public void DeleteInExistentQueue() + { + try + { + _channel.DeleteQueue("Q1", false, false, true); + _logger.Info("queue deleted"); + } + catch (AMQException e) + { + _logger.Info(e.ToString()); + } + } + + [Test] + public void DeleteUsedQueue() + { + // Create the consumer + _consumer = _channel.CreateConsumerBuilder(_queueName) + .WithPrefetchLow(100) + .Create(); + _logger.Info("Consumer was created..."); + + // delete the queue + _channel.DeleteQueue(_queueName, false, true, true); + _logger.InfoFormat("Queue {0} was delete", _queueName); + + Assert.IsNull(_lastException); + } + + [Test] + public void DeleteUnUsedQueue() + { + // delete the queue + _channel.DeleteQueue(_queueName, true, true, true); + _logger.InfoFormat("Queue {0} was delete", _queueName); + + Assert.IsNull(_lastException); + } + + [Test] + public void DeleteNonEmptyQueue() + { + // Create the publisher + _publisher = _channel.CreatePublisherBuilder() + .WithExchangeName(ExchangeNameDefaults.TOPIC) + .WithRoutingKey(_routingKey) + .Create(); + _logger.Info("Publisher created..."); + SendTestMessage("Message 1"); + + try + { + _channel.DeleteQueue(_queueName, true, false, true); + } + catch (AMQException) + { + Assert.Fail("The test fails"); + } + } + + [Test] + public void DeleteEmptyQueue() + { + // Create the publisher + _publisher = _channel.CreatePublisherBuilder() + .WithExchangeName(ExchangeNameDefaults.TOPIC) + .WithRoutingKey(_routingKey) + .Create(); + _logger.Info("Publisher created..."); + + // delete an empty queue with ifEmpty = true + _channel.DeleteQueue(_queueName, false, true, true); + + Assert.IsNull(_lastException); + } + + [Test] + public void DeleteQueueWithResponse() + { + // Create the publisher + _publisher = _channel.CreatePublisherBuilder() + .WithExchangeName(ExchangeNameDefaults.TOPIC) + .WithRoutingKey(_routingKey) + .Create(); + _logger.Info("Publisher created..."); + + SendTestMessage("Message 1"); + SendTestMessage("Message 2"); + + // delete the queue, the server must respond + _channel.DeleteQueue(_queueName, false, false, false); + } + + [Test] + public void PurgeQueueWithResponse() + { + _publisher = _channel.CreatePublisherBuilder() + .WithExchangeName(ExchangeNameDefaults.TOPIC) + .WithRoutingKey(_routingKey) + .Create(); + _logger.Info("Pubisher created"); + + SendTestMessage("Message 1"); + SendTestMessage("Message 2"); + + _channel.PurgeQueue(_queueName, false); + } + + [Test] + public void PurgeQueueWithOutResponse() + { + _publisher = _channel.CreatePublisherBuilder() + .WithExchangeName(ExchangeNameDefaults.TOPIC) + .WithRoutingKey(_routingKey) + .Create(); + _logger.Info("Pubisher created"); + + SendTestMessage("Message 1"); + SendTestMessage("Message 2"); + + _channel.PurgeQueue(_queueName, true); + } + + + /// + /// Callback method to handle any exceptions raised by the test connection. /// + /// The connection exception. + public void OnException(Exception e) + { + // Preserve the most recent exception in case test cases need to examine it. + _lastException = e; + + // Notify any waiting threads that an exception event has occurred. + _evt.Set(); + } + + /// + /// Sends the specified message to the test publisher, and confirms that it was received by the test consumer or not + /// depending on whether or not the message should be received by the consumer. + /// + /// Any exceptions raised by the connection will cause an Assert failure exception to be raised. + /// + /// + /// The message to send. + private void SendTestMessage(string msg) + { + // create the IMessage object + IMessage msgSend = _channel.CreateTextMessage(msg); + + // send the message + _publisher.Send(msgSend); + _logger.InfoFormat("The messages \"{0}\" was sent", msg); + } + + } +} diff --git a/dotnet/Qpid.Client.Tests/Messages/MessageFactoryRegistryTests.cs b/dotnet/Qpid.Client.Tests/Messages/MessageFactoryRegistryTests.cs new file mode 100644 index 0000000000..421d0d4e02 --- /dev/null +++ b/dotnet/Qpid.Client.Tests/Messages/MessageFactoryRegistryTests.cs @@ -0,0 +1,113 @@ +/* + * + * 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. + * + */ + +using System; + +using log4net; +using NUnit.Framework; +using Qpid.Messaging; +using Qpid.Client.Message; + +namespace Qpid.Client.Tests.Messages +{ + /// + /// Ensure a factory creates messages correctly + /// + [TestFixture] + public class MessageFactoryRegistryTests + { + const string TEXT_PLAIN = "text/plain"; + const string TEXT_XML = "text/xml"; + const string OCTET_STREAM = "application/octet-stream"; + + /// + /// Check default registry can create text/plain messages + /// + [Test] + public void CanCreateTextPlain() + { + MessageFactoryRegistry registry = + MessageFactoryRegistry.NewDefaultRegistry(); + + IMessage message = registry.CreateMessage(TEXT_PLAIN); + Assert.IsNotNull(message); + Assert.AreEqual(TEXT_PLAIN, message.ContentType); + Assert.IsInstanceOfType(typeof(QpidTextMessage), message); + } + /// + /// Check default registry can create text/xml messages + /// + [Test] + public void CanCreateTextXml() + { + MessageFactoryRegistry registry = + MessageFactoryRegistry.NewDefaultRegistry(); + + IMessage message = registry.CreateMessage(TEXT_XML); + Assert.IsNotNull(message); + Assert.AreEqual(TEXT_XML, message.ContentType); + Assert.IsInstanceOfType(typeof(QpidTextMessage), message); + } + /// + /// Check default registry can create application/octet-stream messages + /// + [Test] + public void CanCreateBinary() + { + MessageFactoryRegistry registry = + MessageFactoryRegistry.NewDefaultRegistry(); + + IMessage message = registry.CreateMessage(OCTET_STREAM); + Assert.IsNotNull(message); + Assert.AreEqual(OCTET_STREAM, message.ContentType); + Assert.IsInstanceOfType(typeof(QpidBytesMessage), message); + } + /// + /// Check default registry can create messages for unknown types + /// + [Test] + public void CanCreateUnknownType() + { + MessageFactoryRegistry registry = + MessageFactoryRegistry.NewDefaultRegistry(); + + const string OTHER = "application/unknown"; + IMessage message = registry.CreateMessage(OTHER); + Assert.IsNotNull(message); + Assert.AreEqual(OTHER, message.ContentType); + Assert.IsInstanceOfType(typeof(QpidBytesMessage), message); + } + /// + /// Check that text messages default to UTF-8 encoding + /// + [Test] + public void TextMessagesDefaultToUTF8Encoding() + { + MessageFactoryRegistry registry = + MessageFactoryRegistry.NewDefaultRegistry(); + + IMessage message = registry.CreateMessage(TEXT_PLAIN); + Assert.AreEqual("utf-8", message.ContentEncoding.ToLower()); + } + + } +} // namespace Qpid.Client.Tests.Messages + diff --git a/dotnet/Qpid.Client.Tests/MultiConsumer/ProducerMultiConsumer.cs b/dotnet/Qpid.Client.Tests/MultiConsumer/ProducerMultiConsumer.cs index 687f08eeef..fd1400d9d8 100644 --- a/dotnet/Qpid.Client.Tests/MultiConsumer/ProducerMultiConsumer.cs +++ b/dotnet/Qpid.Client.Tests/MultiConsumer/ProducerMultiConsumer.cs @@ -38,7 +38,7 @@ namespace Qpid.Client.Tests private const int MESSAGE_COUNT = 1000; - private const string MESSAGE_DATA_BYTES = "jfd ghljgl hjvhlj cvhvjf ldhfsj lhfdsjf hldsjfk hdslkfj hsdflk "; + private const string MESSAGE_DATA_BYTES = "****jfd ghljgl hjvhlj cvhvjf ldhfsj lhfdsjf hldsjfk hdslkfj hsdflk "; AutoResetEvent _finishedEvent = new AutoResetEvent(false); @@ -100,7 +100,9 @@ namespace Qpid.Client.Tests _logger.Info("All messages received"); _finishedEvent.Set(); } - } + if ( newCount % 100 == 0 ) + System.Diagnostics.Debug.WriteLine(((ITextMessage)m).Text); + } [Test] public void RunTest() @@ -110,7 +112,7 @@ namespace Qpid.Client.Tests ITextMessage msg; try { - msg = _channel.CreateTextMessage(GetData(512 + 8*i)); + msg = _channel.CreateTextMessage(GetData(512 + 8*i)); } catch (Exception e) { diff --git a/dotnet/Qpid.Client.Tests/Qpid.Client.Tests.csproj b/dotnet/Qpid.Client.Tests/Qpid.Client.Tests.csproj index 819d43b5b0..cbe632ace9 100644 --- a/dotnet/Qpid.Client.Tests/Qpid.Client.Tests.csproj +++ b/dotnet/Qpid.Client.Tests/Qpid.Client.Tests.csproj @@ -44,7 +44,10 @@ - + + + + diff --git a/dotnet/Qpid.Client.Tests/bio/BlockingIo.cs b/dotnet/Qpid.Client.Tests/bio/BlockingIo.cs deleted file mode 100644 index 24f3299dae..0000000000 --- a/dotnet/Qpid.Client.Tests/bio/BlockingIo.cs +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * 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. - * - */ -using System; -using System.Threading; -using NUnit.Framework; -using Qpid.Client.Protocol; -using Qpid.Framing; -using Qpid.Messaging; - -namespace Qpid.Client.Transport -{ - [TestFixture] - public class BlockingIo - { - [Test] - public void connectFromOutside() - { - QpidConnectionInfo connectionInfo = new QpidConnectionInfo(); - connectionInfo.AddBrokerInfo(new AmqBrokerInfo("amqp", "localhost", 5672, false)); - AMQConnection connection = new AMQConnection(connectionInfo); - ProtocolWriter protocolWriter = connection.ConvenientProtocolWriter; - - // TODO: Open channels and handle them simultaneously. - // Need more thread here? - // Send ChannelOpen. - ushort channelId = 1; - protocolWriter.SyncWrite(ChannelOpenBody.CreateAMQFrame(channelId, null), typeof (ChannelOpenOkBody)); - - connection.Close(); - } - - [Test] - public void regularConnection() - { - QpidConnectionInfo connectionInfo = new QpidConnectionInfo(); - connectionInfo.AddBrokerInfo(new AmqBrokerInfo("amqp", "localhost", 5672, false)); - using (IConnection connection = new AMQConnection(connectionInfo)) { - Console.WriteLine("connection = {0}", connection); - Thread.Sleep(2000); - } - } - - [Test] - public void connectionAndSleepForHeartbeats() - { - QpidConnectionInfo connectionInfo = new QpidConnectionInfo(); - connectionInfo.AddBrokerInfo(new AmqBrokerInfo("amqp", "localhost", 5672, false)); - using (IConnection connection = new AMQConnection(connectionInfo)) - { - Console.WriteLine("connection = {0}", connection); - Thread.Sleep(60000); - } - } - } -} diff --git a/dotnet/Qpid.Client.Tests/log4net.config b/dotnet/Qpid.Client.Tests/log4net.config index e5340a1500..4346e0eaeb 100644 --- a/dotnet/Qpid.Client.Tests/log4net.config +++ b/dotnet/Qpid.Client.Tests/log4net.config @@ -49,8 +49,12 @@ + + + + - + diff --git a/dotnet/Qpid.Client.Tests/requestreply1/ServiceProvidingClient.cs b/dotnet/Qpid.Client.Tests/requestreply1/ServiceProvidingClient.cs index 515ae41e1c..ad5981a5c5 100644 --- a/dotnet/Qpid.Client.Tests/requestreply1/ServiceProvidingClient.cs +++ b/dotnet/Qpid.Client.Tests/requestreply1/ServiceProvidingClient.cs @@ -35,16 +35,15 @@ namespace Qpid.Client.Tests private string _replyToExchangeName; private string _replyToRoutingKey; + const int PACK = 100; private IMessagePublisher _destinationPublisher; + private IMessageConsumer _consumer; private string _serviceName = "ServiceQ1"; private string _selector = null; - //private EventWaitHandle _event = new ManualResetEvent(false); - private AutoResetEvent _event = new AutoResetEvent(false); - [SetUp] public override void Init() { @@ -59,36 +58,38 @@ namespace Qpid.Client.Tests _channel.DeclareQueue(_serviceName, false, false, false); - IMessageConsumer consumer = _channel.CreateConsumerBuilder(_serviceName) + _consumer = _channel.CreateConsumerBuilder(_serviceName) .WithPrefetchLow(100) .WithPrefetchHigh(500) .WithNoLocal(true) .Create(); - consumer.OnMessage = new MessageReceivedDelegate(OnMessage); + _consumer.OnMessage = new MessageReceivedDelegate(OnMessage); + } + + public override void Shutdown() + { + _consumer.Dispose(); + base.Shutdown(); } private void OnConnectionException(Exception e) { _logger.Info("Connection exception occurred", e); - _event.Set(); // Shutdown test on error // XXX: Test still doesn't shutdown when broker terminates. Is there no heartbeat? } [Test] - public void TestFail() - { - Assert.Fail("Tests in this class do not run on autopilot, but hang forever, so commented out until can be fixed."); - } - - /*[Test] public void Test() { _connection.Start(); _logger.Info("Waiting..."); - _event.WaitOne(); - }*/ - public void OnMessage(IMessage message) + ServiceRequestingClient client = new ServiceRequestingClient(); + client.Init(); + client.SendMessages(); + } + + private void OnMessage(IMessage message) { // _logger.Info("Got message '" + message + "'"); @@ -109,9 +110,9 @@ namespace Qpid.Client.Tests _destinationPublisher = _channel.CreatePublisherBuilder() .WithExchangeName(_replyToExchangeName) .WithRoutingKey(_replyToRoutingKey) + .WithDeliveryMode(DeliveryMode.NonPersistent) .Create(); _destinationPublisher.DisableMessageTimestamp = true; - _destinationPublisher.DeliveryMode = DeliveryMode.NonPersistent; _logger.Debug("After create a producer"); } catch (QpidException e) @@ -120,7 +121,7 @@ namespace Qpid.Client.Tests throw e; } _messageCount++; - if (_messageCount % 1000 == 0) + if (_messageCount % PACK == 0) { _logger.Info("Received message total: " + _messageCount); _logger.Info(string.Format("Sending response to '{0}:{1}'", @@ -129,25 +130,20 @@ namespace Qpid.Client.Tests try { - String payload = "This is a response: sing together: 'Mahnah mahnah...'" + tm.Text; - ITextMessage msg = _channel.CreateTextMessage(payload); - if (tm.Headers.Contains("timeSent")) - { -// _logger.Info("timeSent property set on message"); -// _logger.Info("timeSent value is: " + tm.Headers["timeSent"]); - msg.Headers["timeSent"] = tm.Headers["timeSent"]; - } - _destinationPublisher.Send(msg); - if (_messageCount % 1000 == 0) - { - _logger.Info(string.Format("Sending response to '{0}:{1}'", - _replyToExchangeName, _replyToRoutingKey)); - } - } - catch (QpidException e) + String payload = "This is a response: sing together: 'Mahnah mahnah...'" + tm.Text; + ITextMessage msg = _channel.CreateTextMessage(payload); + if ( tm.Headers.Contains("timeSent") ) + { + msg.Headers["timeSent"] = tm.Headers["timeSent"]; + } + _destinationPublisher.Send(msg); + } catch ( QpidException e ) { - _logger.Error("Error sending message: " + e, e); - throw e; + _logger.Error("Error sending message: " + e, e); + throw e; + } finally + { + _destinationPublisher.Dispose(); } } } diff --git a/dotnet/Qpid.Client.Tests/requestreply1/ServiceRequestingClient.cs b/dotnet/Qpid.Client.Tests/requestreply1/ServiceRequestingClient.cs index 4479d767ea..8264879c1f 100644 --- a/dotnet/Qpid.Client.Tests/requestreply1/ServiceRequestingClient.cs +++ b/dotnet/Qpid.Client.Tests/requestreply1/ServiceRequestingClient.cs @@ -26,18 +26,18 @@ using Qpid.Messaging; namespace Qpid.Client.Tests { - [TestFixture] public class ServiceRequestingClient : BaseMessagingTestFixture { private const int MESSAGE_SIZE = 1024; private static string MESSAGE_DATA = new string('x', MESSAGE_SIZE); - private const int NUM_MESSAGES = 10000; + private const int PACK = 100; + private const int NUM_MESSAGES = PACK*10; // increase when in standalone private static ILog _log = LogManager.GetLogger(typeof(ServiceRequestingClient)); - AutoResetEvent _finishedEvent = new AutoResetEvent(false); - + ManualResetEvent _finishedEvent = new ManualResetEvent(false); + private int _expectedMessageCount = NUM_MESSAGES; private long _startTime = 0; @@ -54,9 +54,9 @@ namespace Qpid.Client.Tests { _publisher = _channel.CreatePublisherBuilder() .WithRoutingKey(_commandQueueName) + .WithDeliveryMode(DeliveryMode.NonPersistent) .Create(); _publisher.DisableMessageTimestamp = true; // XXX: need a "with" for this in builder? - _publisher.DeliveryMode = DeliveryMode.NonPersistent; // XXX: need a "with" for this in builder? } catch (QpidException e) { @@ -64,7 +64,7 @@ namespace Qpid.Client.Tests } } - /*[Test] + [Test] public void SendMessages() { InitialiseProducer(); @@ -100,47 +100,18 @@ namespace Qpid.Client.Tests // Added timestamp. long timeNow = DateTime.Now.Ticks; string timeSentString = String.Format("{0:G}", timeNow); -// _log.Info(String.Format("timeSent={0} timeSentString={1}", timeNow, timeSentString)); - msg.Headers.SetString("timeSent", timeSentString); - //msg.Headers.SetLong("sentAt", timeNow); + msg.Headers.SetLong("timeSent", timeNow); - try - { - _publisher.Send(msg); - } - catch (Exception e) - { - _log.Error("Error sending message: " + e, e); - //base._port = 5673; - _log.Info("Reconnecting but on port 5673"); - try - { - base.Init(); - InitialiseProducer(); - // cheesy but a quick test - _log.Info("Calling SendMessages again"); - SendMessages(); - } - catch (Exception ex) - { - _log.Error("Totally busted: failed to reconnect: " + ex, ex); - } - } + _publisher.Send(msg); } // Assert that the test finishes within a reasonable amount of time. - const int waitSeconds = 10; + const int waitSeconds = 40; const int waitMilliseconds = waitSeconds * 1000; _log.Info("Finished sending " + _expectedMessageCount + " messages"); _log.Info(String.Format("Waiting {0} seconds to receive last message...", waitSeconds)); Assert.IsTrue(_finishedEvent.WaitOne(waitMilliseconds, false), String.Format("Expected to finish in {0} seconds", waitSeconds)); - }*/ - - [Test] - public void TestFail() - { - Assert.Fail("Tests in this class do not run on autopilot, but hang forever, so commented out until can be fixed."); } public void OnMessage(IMessage m) @@ -150,23 +121,19 @@ namespace Qpid.Client.Tests _log.Debug("Message received: " + m); } - //if (m.Headers.Contains("sentAt")) if (!m.Headers.Contains("timeSent")) { throw new Exception("Set timeSent!"); } - //long sentAt = m.Headers.GetLong("sentAt"); - long sentAt = Int64.Parse(m.Headers.GetString("timeSent")); + + long sentAt = m.Headers.GetLong("timeSent"); long now = DateTime.Now.Ticks; long latencyTicks = now - sentAt; -// _log.Info(String.Format("latency = {0} ticks ", latencyTicks)); long latencyMilliseconds = latencyTicks / TimeSpan.TicksPerMillisecond; -// _log.Info(String.Format("latency = {0} ms", latencyMilliseconds)); averager.Add(latencyMilliseconds); - // Output average every 1000 messages. - if (averager.Num % 1000 == 0) + if (averager.Num % PACK == 0) { _log.Info("Ticks per millisecond = " + TimeSpan.TicksPerMillisecond); _log.Info(String.Format("Average latency (ms) = {0}", averager)); @@ -185,13 +152,6 @@ namespace Qpid.Client.Tests _finishedEvent.Set(); // Notify main thread to quit. } } - - /*public static void Main(String[] args) - { - ServiceRequestingClient c = new ServiceRequestingClient(); - c.Init(); - c.SendMessages(); - }*/ } class Avergager diff --git a/dotnet/Qpid.Client.Tests/url/ConnectionUrlTest.cs b/dotnet/Qpid.Client.Tests/url/ConnectionUrlTest.cs index 4ab6dd5736..b3ee0272b4 100644 --- a/dotnet/Qpid.Client.Tests/url/ConnectionUrlTest.cs +++ b/dotnet/Qpid.Client.Tests/url/ConnectionUrlTest.cs @@ -404,5 +404,43 @@ namespace Qpid.Client.Tests.url Assert.AreEqual("Unterminated option", e.Message); } } + + [Test] + public void ValidateQpidConnectionInfoFromToString() + { + String url = "amqp://ritchiem:bob@default/temp?brokerlist='tcp://localhost:5672;tcp://fancyserver:3000/',failover='roundrobin'"; + + IConnectionInfo connectionInfo = QpidConnectionInfo.FromUrl(url); + IConnectionInfo connectionInfo1 = QpidConnectionInfo.FromUrl(connectionInfo.ToString()); + + Console.WriteLine(connectionInfo.ToString()); + Console.WriteLine(connectionInfo1.ToString()); + + Assert.AreEqual(connectionInfo.Username, connectionInfo1.Username); + Assert.AreEqual(connectionInfo.Password, connectionInfo1.Password); + Assert.AreEqual(connectionInfo.VirtualHost, connectionInfo1.VirtualHost); + + Assert.IsTrue((connectionInfo1.GetAllBrokerInfos().Count == 2)); + Assert.IsTrue(connectionInfo.GetBrokerInfo(0).Equals(connectionInfo1.GetBrokerInfo(0))); + Assert.IsTrue(connectionInfo.GetBrokerInfo(1).Equals(connectionInfo1.GetBrokerInfo(1))); + + } + + [Test] + public void EnsureVirtualHostStartsWithSlash() + { + IConnectionInfo connection = new QpidConnectionInfo(); + connection.VirtualHost = "test"; + Assert.AreEqual("/test", connection.VirtualHost); + + connection.VirtualHost = "/mytest"; + Assert.AreEqual("/mytest", connection.VirtualHost); + + connection.VirtualHost = ""; + Assert.AreEqual("/", connection.VirtualHost); + + connection.VirtualHost = null; + Assert.AreEqual("/", connection.VirtualHost); + } } } -- cgit v1.2.1