Skip to content

Commit 5d5a278

Browse files
authored
Made ConsulConfigurationProvider.Dispose idempotent (#99)
1 parent 0a3cc96 commit 5d5a278

2 files changed

Lines changed: 24 additions & 0 deletions

File tree

src/Winton.Extensions.Configuration.Consul/ConsulConfigurationProvider.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ internal sealed class ConsulConfigurationProvider : ConfigurationProvider, IDisp
2727
private readonly IConsulConfigurationSource _source;
2828
private ulong _lastIndex;
2929
private Task? _pollTask;
30+
private bool _disposed;
3031

3132
public ConsulConfigurationProvider(
3233
IConsulConfigurationSource source,
@@ -44,8 +45,14 @@ public ConsulConfigurationProvider(
4445

4546
public void Dispose()
4647
{
48+
if (_disposed)
49+
{
50+
return;
51+
}
52+
4753
_cancellationTokenSource.Cancel();
4854
_cancellationTokenSource.Dispose();
55+
_disposed = true;
4956
}
5057

5158
public override void Load()

test/Winton.Extensions.Configuration.Consul.Test/ConsulConfigurationProviderTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,23 @@ private async Task ShouldCancelPollingTaskWhenReloading()
112112
kv => kv.List("Test", It.IsAny<QueryOptions>(), It.IsAny<CancellationToken>()),
113113
Times.Between(expectedKvCalls, expectedKvCalls + 1, Range.Inclusive));
114114
}
115+
116+
[Fact]
117+
private void ShouldNotThrowOnMultipleDisposeCalls()
118+
{
119+
_source.ReloadOnChange = true;
120+
_source.Optional = true;
121+
_kvEndpoint
122+
.Setup(kv => kv.List("Test", It.IsAny<QueryOptions>(), It.IsAny<CancellationToken>()))
123+
.ReturnsAsync(new QueryResult<KVPair[]> { StatusCode = HttpStatusCode.OK });
124+
125+
_provider.Load();
126+
_provider.Dispose();
127+
128+
var secondDispose = _provider.Invoking(p => p.Dispose());
129+
130+
secondDispose.Should().NotThrow();
131+
}
115132
}
116133

117134
public sealed class DoNotReloadOnChange : ConsulConfigurationProviderTests

0 commit comments

Comments
 (0)