public void OneMessage(
            [CombinatorialValues(false, true)] bool hardStop)
        {
            var        topicName     = new TopicName("FakeProject", "FakeTopic");
            var        scheduler     = new TestScheduler();
            TaskHelper taskHelper    = scheduler.TaskHelper;
            var        client        = new FakePublisherServiceApiClient(scheduler, taskHelper);
            var        settings      = MakeSettings(scheduler);
            int        shutdownCount = 0;
            var        pub           = new PublisherClientImpl(topicName, new[] { client }, settings, () =>
            {
                Interlocked.Increment(ref shutdownCount);
                return(Task.FromResult(0));
            }, taskHelper);

            scheduler.Run(async() =>
            {
                var id           = await taskHelper.ConfigureAwait(pub.PublishAsync("1"));
                bool isCancelled = await taskHelper.ConfigureAwaitHideCancellation(
                    () => pub.ShutdownAsync(new CancellationToken(hardStop)));
                Assert.Equal(hardStop, isCancelled);
                Assert.Equal("1", id);
                Assert.Equal(1, shutdownCount);
            });
        }
        public void Shutdown(
            [CombinatorialValues(false, true)] bool hardStop)
        {
            var        topicName     = new TopicName("FakeProject", "FakeTopic");
            var        scheduler     = new TestScheduler();
            TaskHelper taskHelper    = scheduler.TaskHelper;
            var        client        = new FakePublisherServiceApiClient(scheduler, taskHelper, TimeSpan.FromSeconds(1));
            var        settings      = MakeSettings(scheduler, batchElementCountThreshold: 2, batchRequestByteThreshold: 1000);
            int        shutdownCount = 0;
            var        pub           = new PublisherClientImpl(topicName, new[] { client }, settings, () =>
            {
                Interlocked.Increment(ref shutdownCount);
                return(Task.FromResult(0));
            }, taskHelper);

            scheduler.Run(async() =>
            {
                var pubTask     = pub.PublishAsync("1");
                var isCancelled = await taskHelper.ConfigureAwaitHideCancellation(
                    () => pub.ShutdownAsync(new CancellationToken(hardStop)));
                var pubResult = await taskHelper.ConfigureAwaitHideCancellation(() => pubTask, null);
                Assert.Equal(hardStop, pubTask.IsCanceled);
                Assert.Equal(hardStop, isCancelled);
                Assert.Equal(hardStop ? null : "1", pubResult);
                Assert.Equal(hardStop ? 0 : 1, client.HandledMessages.Count);
                Assert.Equal(1, shutdownCount);
            });
        }
Exemplo n.º 3
0
        public void PublishingMessageWithOrderingKeyRequiresOrderingEnabled()
        {
            var        topicName     = new TopicName("FakeProject", "FakeTopic");
            var        scheduler     = new TestScheduler();
            TaskHelper taskHelper    = scheduler.TaskHelper;
            var        client        = new FakePublisherServiceApiClient(scheduler, taskHelper);
            var        settings      = MakeSettings(scheduler);
            int        shutdownCount = 0;
            var        pub           = new PublisherClientImpl(topicName, new[] { client }, settings, () =>
            {
                Interlocked.Increment(ref shutdownCount);
                return(Task.FromResult(0));
            }, taskHelper);

            scheduler.Run(async() =>
            {
                await taskHelper.ConfigureAwait(
                    Assert.ThrowsAsync <InvalidOperationException>(() => pub.PublishAsync("an ordering key", "1")));
            });
        }
Exemplo n.º 4
0
        public void OrderingKeyResumePublish()
        {
            const string unrecoverableKey = "error-unrecoverable";
            const string recoverableKey   = "error-recoverable";
            var          topicName        = new TopicName("FakeProject", "FakeTopic");
            var          scheduler        = new TestScheduler();
            TaskHelper   taskHelper       = scheduler.TaskHelper;
            var          client           = new FakePublisherServiceApiClient(scheduler, taskHelper,
                                                                              orderingKeyErrorUnrecoverable: unrecoverableKey, orderingKeyErrorRecoverable: recoverableKey);
            var settings      = MakeSettings(scheduler, enableMessageOrdering: true);
            int shutdownCount = 0;
            var pub           = new PublisherClientImpl(topicName, new[] { client }, settings, () =>
            {
                Interlocked.Increment(ref shutdownCount);
                return(Task.FromResult(0));
            }, taskHelper);

            scheduler.Run(async() =>
            {
                // First call will trigger an unrecoverable error.
                var ex = await taskHelper.ConfigureAwait(
                    Assert.ThrowsAsync <RpcException>(() => pub.PublishAsync(unrecoverableKey, "unrecoverable error")));
                Assert.Equal(StatusCode.DataLoss, ex.StatusCode);
                // Sending again will reject the message.
                await taskHelper.ConfigureAwait(
                    Assert.ThrowsAsync <OrderingKeyInErrorStateException>(() => pub.PublishAsync(unrecoverableKey, "key in error state")));
                // Other ordering-keys publish OK.
                await taskHelper.ConfigureAwait(pub.PublishAsync("ok-key", "ok"));
                // Including a recoverable error.
                await taskHelper.ConfigureAwait(pub.PublishAsync(recoverableKey, "recoverable error"));
                // Including a message without an ordering key.
                await taskHelper.ConfigureAwait(pub.PublishAsync("key not ordered"));
                // Resume publishing on the ordering key.
                pub.ResumePublish(unrecoverableKey);
                await taskHelper.ConfigureAwait(pub.PublishAsync(unrecoverableKey, "unrecoverable key resumed"));
                var expected = new HashSet <string>(new[] { "ok", "key not ordered", "recoverable error", "unrecoverable key resumed" });
                Assert.Equal(expected, new HashSet <string>(client.HandledMessages));
            });
        }
Exemplo n.º 5
0
        public void FlowState()
        {
            var        topicName = new TopicName("FakeProject", "FakeTopic");
            var        scheduler = new TestScheduler();
            TaskHelper taskHelper = scheduler.TaskHelper;
            var        client = new FakePublisherServiceApiClient(scheduler, taskHelper, TimeSpan.FromSeconds(1));
            var        settings = MakeSettings(scheduler);
            var        pub = new PublisherClientImpl(topicName, new[] { client }, settings, null, taskHelper);
            var        msgSize = new PubsubMessage {
                Data = ByteString.CopyFromUtf8("1")
            }.CalculateSize();

            scheduler.Run(async() =>
            {
                // Publish 2 msgs; 1st will be immediately sent, 2nd will stay in queue for 1 second.
                var pubTask = Task.WhenAll(pub.PublishAsync("1"), pub.PublishAsync("2"));
                Assert.Equal(1, pub.GetCurrentFlowState().ElementCount);
                Assert.Equal(msgSize, pub.GetCurrentFlowState().ByteCount);
                await taskHelper.ConfigureAwait(pubTask);
                Assert.Equal(0, pub.GetCurrentFlowState().ElementCount);
                Assert.Equal(0, pub.GetCurrentFlowState().ByteCount);
            });
        }