From 03ee9a77cc1d27fe7a70ce0d0092e464bb309b97 Mon Sep 17 00:00:00 2001 From: Matt Kotsenas Date: Tue, 30 Sep 2025 14:57:41 -0700 Subject: [PATCH 1/7] Extract resilence pipeline and add tests --- .../AzureKustoBuilderExtensions.cs | 12 +--- .../KustoResiliencePipelines.cs | 29 ++++++++ .../KustoResiliencePipelinesTests.cs | 66 +++++++++++++++++++ 3 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs create mode 100644 tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs diff --git a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs index d86bf9f2379..e8f4cdef3a9 100644 --- a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs +++ b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs @@ -13,7 +13,6 @@ using Kusto.Data.Net.Client; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Polly; namespace Aspire.Hosting.Azure.Kusto; @@ -22,15 +21,6 @@ namespace Aspire.Hosting.Azure.Kusto; /// public static class AzureKustoBuilderExtensions { - private static readonly ResiliencePipeline s_pipeline = new ResiliencePipelineBuilder() - .AddRetry(new() - { - MaxRetryAttempts = 3, - Delay = TimeSpan.FromSeconds(2), - ShouldHandle = new PredicateBuilder().Handle(), - }) - .Build(); - /// /// Adds an Azure Data Explorer (Kusto) cluster resource to the application model. /// @@ -293,7 +283,7 @@ private static async Task CreateDatabaseAsync(ICslAdminProvider adminProvider, A try { - await s_pipeline.ExecuteAsync(async cancellationToken => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); + await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(async cancellationToken => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); logger.LogDebug("Database '{DatabaseName}' created successfully", databaseResource.DatabaseName); } catch (KustoBadRequestException e) when (e.Message.Contains("EntityNameAlreadyExistsException")) diff --git a/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs b/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs new file mode 100644 index 00000000000..ccb14c29d86 --- /dev/null +++ b/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Kusto.Data.Exceptions; +using Polly; + +namespace Aspire.Hosting.Azure.Kusto; + +/// +/// Provides pre-configured resilience pipelines for Azure Kusto operations. +/// +internal static class KustoResiliencePipelines +{ + /// + /// Gets a resilience pipeline configured to handle Kusto throttling exceptions with retry logic. + /// + /// + /// This pipeline retries operations that fail with + /// up to 3 times with a 2-second delay between attempts. + /// + public static ResiliencePipeline ThrottleRetry { get; } = new ResiliencePipelineBuilder() + .AddRetry(new() + { + MaxRetryAttempts = 3, + Delay = TimeSpan.FromSeconds(2), + ShouldHandle = new PredicateBuilder().Handle(), + }) + .Build(); +} diff --git a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs new file mode 100644 index 00000000000..565018a5427 --- /dev/null +++ b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs @@ -0,0 +1,66 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Kusto.Data.Exceptions; + +namespace Aspire.Hosting.Azure.Kusto.Tests; + +public class KustoResiliencePipelinesTests +{ + [Fact] + public async Task ShouldRetryOnTemporaryExceptions() + { + // Arrange + var attemptCount = 0; + ValueTask work(CancellationToken ct) + { + attemptCount++; + throw new KustoRequestThrottledException(); + } + + // Act + Assert + await Assert.ThrowsAsync(async () => + { + await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(work, TestContext.Current.CancellationToken); + }); + Assert.True(attemptCount > 1, "Operation should have been retried"); + } + + [Fact] + public async Task ShouldNotRetryOnOtherExceptions() + { + // Arrange + var attemptCount = 0; + ValueTask work(CancellationToken ct) + { + attemptCount++; + throw new InvalidOperationException(); + } + + // Act + Assert + await Assert.ThrowsAsync(async () => + { + await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(work, TestContext.Current.CancellationToken); + }); + Assert.True(attemptCount == 1, "Operation should not have been retried"); + } + + [Fact] + public async Task ShouldNotRetryOnPermanateExceptions() + { + // Arrange + var attemptCount = 0; + ValueTask work(CancellationToken ct) + { + attemptCount++; + throw new KustoBadRequestException(); + } + + // Act + Assert + await Assert.ThrowsAsync(async () => + { + await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(work, TestContext.Current.CancellationToken); + }); + Assert.True(attemptCount == 1, "Operation should not have been retried"); + } +} From e2f0129ae521b45aa402bb20050cfa8ffe3d545a Mon Sep 17 00:00:00 2001 From: Matt Kotsenas Date: Tue, 30 Sep 2025 15:05:41 -0700 Subject: [PATCH 2/7] Generalize reslience pipeline to handle any non-permanent exception --- .../AzureKustoBuilderExtensions.cs | 2 +- .../KustoResiliencePipelines.cs | 12 ++++-------- .../KustoResiliencePipelinesTests.cs | 8 ++++---- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs index e8f4cdef3a9..f040a26065e 100644 --- a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs +++ b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs @@ -283,7 +283,7 @@ private static async Task CreateDatabaseAsync(ICslAdminProvider adminProvider, A try { - await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(async cancellationToken => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); + await KustoResiliencePipelines.Default.ExecuteAsync(async cancellationToken => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); logger.LogDebug("Database '{DatabaseName}' created successfully", databaseResource.DatabaseName); } catch (KustoBadRequestException e) when (e.Message.Contains("EntityNameAlreadyExistsException")) diff --git a/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs b/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs index ccb14c29d86..329f98e4bbe 100644 --- a/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs +++ b/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs @@ -1,7 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using Kusto.Data.Exceptions; +using Kusto.Cloud.Platform.Utils; using Polly; namespace Aspire.Hosting.Azure.Kusto; @@ -12,18 +12,14 @@ namespace Aspire.Hosting.Azure.Kusto; internal static class KustoResiliencePipelines { /// - /// Gets a resilience pipeline configured to handle Kusto throttling exceptions with retry logic. + /// Gets a resilience pipeline configured to handle non-permanent exceptions. /// - /// - /// This pipeline retries operations that fail with - /// up to 3 times with a 2-second delay between attempts. - /// - public static ResiliencePipeline ThrottleRetry { get; } = new ResiliencePipelineBuilder() + public static ResiliencePipeline Default { get; } = new ResiliencePipelineBuilder() .AddRetry(new() { MaxRetryAttempts = 3, Delay = TimeSpan.FromSeconds(2), - ShouldHandle = new PredicateBuilder().Handle(), + ShouldHandle = new PredicateBuilder().Handle(e => e is ICloudPlatformException cpe && !cpe.IsPermanent), }) .Build(); } diff --git a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs index 565018a5427..62d5dfec909 100644 --- a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs +++ b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs @@ -21,7 +21,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(work, TestContext.Current.CancellationToken); + await KustoResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount > 1, "Operation should have been retried"); } @@ -40,13 +40,13 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(work, TestContext.Current.CancellationToken); + await KustoResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount == 1, "Operation should not have been retried"); } [Fact] - public async Task ShouldNotRetryOnPermanateExceptions() + public async Task ShouldNotRetryOnPermanentExceptions() { // Arrange var attemptCount = 0; @@ -59,7 +59,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoResiliencePipelines.ThrottleRetry.ExecuteAsync(work, TestContext.Current.CancellationToken); + await KustoResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount == 1, "Operation should not have been retried"); } From 8b3d23b0b1ee4e61ac627bf85a3aff85f662f73b Mon Sep 17 00:00:00 2001 From: Matt Kotsenas Date: Tue, 30 Sep 2025 15:14:54 -0700 Subject: [PATCH 3/7] Clean up naming --- .../AzureKustoBuilderExtensions.cs | 2 +- ...lines.cs => KustoEmulatorResiliencePipelines.cs} | 13 ++++++++----- .../KustoResiliencePipelinesTests.cs | 6 +++--- 3 files changed, 12 insertions(+), 9 deletions(-) rename src/Aspire.Hosting.Azure.Kusto/{KustoResiliencePipelines.cs => KustoEmulatorResiliencePipelines.cs} (65%) diff --git a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs index f040a26065e..4166b897394 100644 --- a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs +++ b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs @@ -283,7 +283,7 @@ private static async Task CreateDatabaseAsync(ICslAdminProvider adminProvider, A try { - await KustoResiliencePipelines.Default.ExecuteAsync(async cancellationToken => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); + await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(async ct => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); logger.LogDebug("Database '{DatabaseName}' created successfully", databaseResource.DatabaseName); } catch (KustoBadRequestException e) when (e.Message.Contains("EntityNameAlreadyExistsException")) diff --git a/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs b/src/Aspire.Hosting.Azure.Kusto/KustoEmulatorResiliencePipelines.cs similarity index 65% rename from src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs rename to src/Aspire.Hosting.Azure.Kusto/KustoEmulatorResiliencePipelines.cs index 329f98e4bbe..04bc337e161 100644 --- a/src/Aspire.Hosting.Azure.Kusto/KustoResiliencePipelines.cs +++ b/src/Aspire.Hosting.Azure.Kusto/KustoEmulatorResiliencePipelines.cs @@ -7,9 +7,9 @@ namespace Aspire.Hosting.Azure.Kusto; /// -/// Provides pre-configured resilience pipelines for Azure Kusto operations. +/// Provides pre-configured resilience pipelines for Azure Kusto emulator operations. /// -internal static class KustoResiliencePipelines +internal static class KustoEmulatorResiliencePipelines { /// /// Gets a resilience pipeline configured to handle non-permanent exceptions. @@ -17,9 +17,12 @@ internal static class KustoResiliencePipelines public static ResiliencePipeline Default { get; } = new ResiliencePipelineBuilder() .AddRetry(new() { - MaxRetryAttempts = 3, - Delay = TimeSpan.FromSeconds(2), - ShouldHandle = new PredicateBuilder().Handle(e => e is ICloudPlatformException cpe && !cpe.IsPermanent), + MaxRetryAttempts = 10, + Delay = TimeSpan.FromMilliseconds(100), + BackoffType = DelayBackoffType.Exponential, + ShouldHandle = new PredicateBuilder().Handle(IsTransient), }) .Build(); + + private static bool IsTransient(Exception ex) => ex is ICloudPlatformException cpe && !cpe.IsPermanent; } diff --git a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs index 62d5dfec909..e6da8da661b 100644 --- a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs +++ b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs @@ -21,7 +21,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); + await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount > 1, "Operation should have been retried"); } @@ -40,7 +40,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); + await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount == 1, "Operation should not have been retried"); } @@ -59,7 +59,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); + await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount == 1, "Operation should not have been retried"); } From cf5167498e38e0bf97192dfc3dd33d45e77af120 Mon Sep 17 00:00:00 2001 From: Matt Kotsenas Date: Tue, 30 Sep 2025 15:27:44 -0700 Subject: [PATCH 4/7] Fix up names --- .../AzureKustoBuilderExtensions.cs | 2 +- ...ipelines.cs => AzureKustoEmulatorResiliencePipelines.cs} | 2 +- .../KustoResiliencePipelinesTests.cs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename src/Aspire.Hosting.Azure.Kusto/{KustoEmulatorResiliencePipelines.cs => AzureKustoEmulatorResiliencePipelines.cs} (94%) diff --git a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs index 4166b897394..bb4158f8c0d 100644 --- a/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs +++ b/src/Aspire.Hosting.Azure.Kusto/AzureKustoBuilderExtensions.cs @@ -283,7 +283,7 @@ private static async Task CreateDatabaseAsync(ICslAdminProvider adminProvider, A try { - await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(async ct => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); + await AzureKustoEmulatorResiliencePipelines.Default.ExecuteAsync(async ct => await adminProvider.ExecuteControlCommandAsync(databaseResource.DatabaseName, script, crp).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); logger.LogDebug("Database '{DatabaseName}' created successfully", databaseResource.DatabaseName); } catch (KustoBadRequestException e) when (e.Message.Contains("EntityNameAlreadyExistsException")) diff --git a/src/Aspire.Hosting.Azure.Kusto/KustoEmulatorResiliencePipelines.cs b/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs similarity index 94% rename from src/Aspire.Hosting.Azure.Kusto/KustoEmulatorResiliencePipelines.cs rename to src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs index 04bc337e161..44fa619cf71 100644 --- a/src/Aspire.Hosting.Azure.Kusto/KustoEmulatorResiliencePipelines.cs +++ b/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs @@ -9,7 +9,7 @@ namespace Aspire.Hosting.Azure.Kusto; /// /// Provides pre-configured resilience pipelines for Azure Kusto emulator operations. /// -internal static class KustoEmulatorResiliencePipelines +internal static class AzureKustoEmulatorResiliencePipelines { /// /// Gets a resilience pipeline configured to handle non-permanent exceptions. diff --git a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs index e6da8da661b..a2e91904734 100644 --- a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs +++ b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs @@ -21,7 +21,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); + await AzureKustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount > 1, "Operation should have been retried"); } @@ -40,7 +40,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); + await AzureKustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount == 1, "Operation should not have been retried"); } @@ -59,7 +59,7 @@ ValueTask work(CancellationToken ct) // Act + Assert await Assert.ThrowsAsync(async () => { - await KustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); + await AzureKustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); Assert.True(attemptCount == 1, "Operation should not have been retried"); } From 15b76e6cd668bfafed68d08e8260dfb653922ea4 Mon Sep 17 00:00:00 2001 From: Matt Kotsenas Date: Tue, 30 Sep 2025 15:31:12 -0700 Subject: [PATCH 5/7] Add comment --- .../AzureKustoEmulatorResiliencePipelines.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs b/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs index 44fa619cf71..88569a80730 100644 --- a/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs +++ b/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs @@ -24,5 +24,12 @@ internal static class AzureKustoEmulatorResiliencePipelines }) .Build(); + /// + /// Determines whether the specified exception represents a transient error that may succeed if retried. + /// + /// + /// There's no common base exception type between exceptions in the Kusto.Data and Kusto.Ingest libraries, however + /// they do share a common interface, , which has the IsPermanent property. + /// private static bool IsTransient(Exception ex) => ex is ICloudPlatformException cpe && !cpe.IsPermanent; } From 154fd06ce00e67d96d8185dd6f831a0b88d2d45a Mon Sep 17 00:00:00 2001 From: Matt Kotsenas Date: Tue, 30 Sep 2025 15:35:40 -0700 Subject: [PATCH 6/7] Fix namespace --- .../AzureKustoEmulatorResiliencePipelines.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs b/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs index 88569a80730..c8964d96aca 100644 --- a/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs +++ b/src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorResiliencePipelines.cs @@ -4,7 +4,7 @@ using Kusto.Cloud.Platform.Utils; using Polly; -namespace Aspire.Hosting.Azure.Kusto; +namespace Aspire.Hosting.Azure; /// /// Provides pre-configured resilience pipelines for Azure Kusto emulator operations. From 2823ef6a7cfb13d0aa0e8cf3b68ab5460df553ca Mon Sep 17 00:00:00 2001 From: Matt Kotsenas Date: Tue, 30 Sep 2025 15:36:24 -0700 Subject: [PATCH 7/7] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../KustoResiliencePipelinesTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs index a2e91904734..daf2a51f59e 100644 --- a/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs +++ b/tests/Aspire.Hosting.Azure.Kusto.Tests/KustoResiliencePipelinesTests.cs @@ -42,7 +42,7 @@ await Assert.ThrowsAsync(async () => { await AzureKustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); - Assert.True(attemptCount == 1, "Operation should not have been retried"); + Assert.Equal(1, attemptCount); } [Fact] @@ -61,6 +61,6 @@ await Assert.ThrowsAsync(async () => { await AzureKustoEmulatorResiliencePipelines.Default.ExecuteAsync(work, TestContext.Current.CancellationToken); }); - Assert.True(attemptCount == 1, "Operation should not have been retried"); + Assert.Equal(1, attemptCount); } }