public void PutGetDeleteOverflowing()
		{
			var provider = GlobalSetup.Container.Resolve<IQueueStorageProvider>();

			Assert.IsNotNull(provider, "#A00");

			// 20k chosen so that it doesn't fit into the queue.
			var message = new MyMessage { MyBuffer = new byte[20000] };

			// fill buffer with random content
			_rand.NextBytes(message.MyBuffer);

			provider.Clear(QueueName);

			provider.Put(QueueName, message);
			var retrieved = provider.Get<MyMessage>(QueueName, 1).First();

			Assert.AreEqual(message.MyGuid, retrieved.MyGuid, "#A01");
			CollectionAssert.AreEquivalent(message.MyBuffer, retrieved.MyBuffer, "#A02");

			for (int i = 0; i < message.MyBuffer.Length; i++)
			{
				Assert.AreEqual(message.MyBuffer[i], retrieved.MyBuffer[i], "#A02-" + i);
			}

			provider.Delete(retrieved);
		}
		public void PutGetDelete()
		{
			var provider = GlobalSetup.Container.Resolve<IQueueStorageProvider>();

			Assert.IsNotNull(provider, "#A00");

			var message = new MyMessage();

			provider.DeleteQueue(QueueName); // deleting queue on purpose 
			// (it's slow but necessary to really validate the retry policy)

			provider.Put(QueueName, message);
			var retrieved = provider.Get<MyMessage>(QueueName, 1).First();

			Assert.AreEqual(message.MyGuid, retrieved.MyGuid, "#A01");

			provider.Delete(retrieved);
		}
		public void PersistRestore()
		{
			var provider = GlobalSetup.Container.Resolve<IQueueStorageProvider>();
			const string storeName = "TestStore";

			Assert.IsNotNull(provider, "#A00");

			var message = new MyMessage();

			// clean up
			provider.DeleteQueue(QueueName);
			foreach (var skey in provider.ListPersisted(storeName))
			{
				provider.DeletePersisted(storeName, skey);
			}

			// put
			provider.Put(QueueName, message);

			// get
			var retrieved = provider.Get<MyMessage>(QueueName, 1).First();
			Assert.AreEqual(message.MyGuid, retrieved.MyGuid, "#A01");

			// persist
			provider.Persist(retrieved, storeName, "manual test");

			// abandon should fail (since not invisible anymore)
			Assert.IsFalse(provider.Abandon(retrieved), "#A02");

			// list persisted message
			var key = provider.ListPersisted(storeName).Single();

			// get persisted message
			var persisted = provider.GetPersisted(storeName, key);
			Assert.IsTrue(persisted.HasValue, "#A03");
			Assert.IsTrue(persisted.Value.DataXml.HasValue, "#A04");
			var xml = persisted.Value.DataXml.Value;
			var property = xml.Elements().Single(x => x.Name.LocalName == "MyGuid");
			Assert.AreEqual(message.MyGuid, new Guid(property.Value), "#A05");

			// restore persisted message
			provider.RestorePersisted(storeName, key);

			// list no longer contains key
			Assert.IsFalse(provider.ListPersisted(storeName).Any(), "#A06");

			// get
			var retrieved2 = provider.Get<MyMessage>(QueueName, 1).First();
			Assert.AreEqual(message.MyGuid, retrieved2.MyGuid, "#A07");

			// delete
			Assert.IsTrue(provider.Delete(retrieved2), "#A08");
		}
		public void PutGetAbandonDelete()
		{
			var provider = GlobalSetup.Container.Resolve<IQueueStorageProvider>();

			Assert.IsNotNull(provider, "#A00");

			var message = new MyMessage();

			provider.DeleteQueue(QueueName); // deleting queue on purpose 
			// (it's slow but necessary to really validate the retry policy)

			// put
			provider.Put(QueueName, message);

			// get
			var retrieved = provider.Get<MyMessage>(QueueName, 1).First();
			Assert.AreEqual(message.MyGuid, retrieved.MyGuid, "#A01");

			// abandon
			var abandoned = provider.Abandon(retrieved);
			Assert.IsTrue(abandoned, "#A02");

			// abandon II should fail (since not invisible)
			var abandoned2 = provider.Abandon(retrieved);
			Assert.IsFalse(abandoned2, "#A03");

			// get again
			var retrieved2 = provider.Get<MyMessage>(QueueName, 1).First();
			Assert.AreEqual(message.MyGuid, retrieved2.MyGuid, "#A04");

			// delete
			var deleted = provider.Delete(retrieved2);
			Assert.IsTrue(deleted, "#A05");

			// get now should fail
			var retrieved3 = provider.Get<MyMessage>(QueueName, 1).FirstOrEmpty();
			Assert.IsFalse(retrieved3.HasValue, "#A06");

			// abandon does not put it to the queue again
			var abandoned3 = provider.Abandon(retrieved2);
			Assert.IsFalse(abandoned3, "#A07");

			// get now should still fail
			var retrieved4 = provider.Get<MyMessage>(QueueName, 1).FirstOrEmpty();
			Assert.IsFalse(retrieved4.HasValue, "#A07");
		}