public void Test_PubSubMessenger_MessageFiltering()
        {
            // Arrange
            var messenger = new PubSubMessenger(new PubSubJsonAuthConfig()
            {
                JsonAuthFile = _fixture.CredentialPath,
                ProjectId    = _fixture.ProjectId
            });
            var manager = messenger.EntityManager as PubSubManager;

            // Act
            // Create the filter topic for testing.
            manager.CreateTopicDefaults(_fixture.MessageFilterTopic, null, "defaultsub").GetAwaiter().GetResult();
            manager.CreateSubscription(_fixture.MessageFilterTopic, "filteredsub", "attributes:pickme").GetAwaiter().GetResult();

            // Send two messages, one that wont be picked up by the filter subscription and the other that
            // will.  The result is two messages to the defaultsub, one to filteredsub
            messenger.Send(_fixture.MessageFilterTopic, "test").GetAwaiter().GetResult();
            messenger.Send(_fixture.MessageFilterTopic, "testfilter", new KeyValuePair <string, object>[]
            {
                new KeyValuePair <string, object>("pickme", "please")
            }).GetAwaiter().GetResult();

            // Receive from both subscriptions.
            var nonFilteredMessages = messenger.ReceiveBatch <string>("defaultsub", 100).GetAwaiter().GetResult();
            var filteredMessages    = messenger.ReceiveBatch <string>("filteredsub", 100).GetAwaiter().GetResult();
            var filteredMessage     = messenger.ReceiveOne <string>("filteredsub").GetAwaiter().GetResult();

            // Assert
            nonFilteredMessages.Count().Should().Be(2);
            filteredMessages.Count().Should().Be(1);
            filteredMessage.Should().NotBe(null);
            filteredMessage.Should().Be("testfilter");
        }
        public void Test_PubSubMessenger_StreamMessages()
        {
            // Arrange
            var pubsub = new PubSubMessenger(new PubSubJsonAuthConfig()
            {
                JsonAuthFile   = _fixture.CredentialPath,
                ProjectId      = _fixture.ProjectId,
                ReceiverConfig = new ReceiverConfig
                {
                    EntityName = _fixture.StreamTopicName,
                    CreateEntityIfNotExists = true
                },
                Sender = new SenderConfig
                {
                    EntityName = _fixture.StreamTopicName,
                    CreateEntityIfNotExists = true
                }
            });
            var lorem                     = Lorem.GetSentences(10);
            var waitTimer                 = new Stopwatch();
            var messagesProcessed         = 0;
            var processedAfterCancelCount = 0;

            // Act
            pubsub.Send(lorem).GetAwaiter().GetResult();
            pubsub.Receive <string>((m) =>
            {
                pubsub.Complete(m).GetAwaiter().GetResult();
                messagesProcessed++;
                processedAfterCancelCount++;
            }, (e) =>
            {
            });
            waitTimer.Start();

            do
            {
                Task.Delay(500).GetAwaiter().GetResult();
            } while (waitTimer.Elapsed.TotalSeconds < 5);

            pubsub.CancelReceive <string>();

            Task.Delay(500).GetAwaiter().GetResult();

            waitTimer.Reset();
            waitTimer.Start();
            processedAfterCancelCount = 0; // verify no more messages were processed after cancellation.
            do
            {
                Task.Delay(500).GetAwaiter().GetResult();
            } while (waitTimer.Elapsed.TotalSeconds < 5);

            // Assert
            messagesProcessed.Should().BeGreaterOrEqualTo(1);
            processedAfterCancelCount.Should().Be(0);
        }