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); }); }
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"))); }); }
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)); }); }
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); }); }