Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Connectors/src/Connectors/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,8 @@ Steeltoe.Connectors.SqlServer.SqlServerOptions.SqlServerOptions() -> void
Steeltoe.Connectors.SqlServer.SqlServerServiceCollectionExtensions
virtual Steeltoe.Connectors.ConnectorCreateConnection.Invoke(System.IServiceProvider! serviceProvider, string! serviceBindingName) -> object!
virtual Steeltoe.Connectors.ConnectorCreateHealthContributor.Invoke(System.IServiceProvider! serviceProvider, string! serviceBindingName) -> Steeltoe.Common.HealthChecks.IHealthContributor!
Steeltoe.Connectors.RelationalDatabaseHealthContributor
Steeltoe.Connectors.RelationalDatabaseHealthContributor.RelationalDatabaseHealthContributor(System.Data.Common.DbConnection! connection, string? id, string? host, string? commandText, Microsoft.Extensions.Logging.ILogger<Steeltoe.Connectors.RelationalDatabaseHealthContributor!>! logger) -> void
Steeltoe.Connectors.RelationalDatabaseHealthContributor.RelationalDatabaseHealthContributor(System.Data.Common.DbConnection! connection, string? host, Microsoft.Extensions.Logging.ILogger<Steeltoe.Connectors.RelationalDatabaseHealthContributor!>! logger) -> void
Steeltoe.Connectors.RelationalDatabaseHealthContributor.CheckHealthAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Steeltoe.Common.HealthChecks.HealthCheckResult?>!
Steeltoe.Connectors.RelationalDatabaseHealthContributor.Dispose() -> void
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,31 @@

namespace Steeltoe.Connectors;

internal sealed class RelationalDatabaseHealthContributor : IHealthContributor, IDisposable
public sealed class RelationalDatabaseHealthContributor : IHealthContributor, IDisposable
{
private readonly DbConnection _connection;
private readonly ILogger<RelationalDatabaseHealthContributor> _logger;
private readonly string _commandText;

public string Id { get; }
public string Host { get; }
public string? ServiceName { get; set; }

public RelationalDatabaseHealthContributor(DbConnection connection, string? host, ILogger<RelationalDatabaseHealthContributor> logger)
public RelationalDatabaseHealthContributor(DbConnection connection, string? id, string? host, string? commandText, ILogger<RelationalDatabaseHealthContributor> logger)
{
ArgumentNullException.ThrowIfNull(connection);
ArgumentNullException.ThrowIfNull(logger);

_connection = connection;
_commandText = commandText ?? "SELECT 1;";
Id = id ?? GetDatabaseType(connection);
Host = host ?? string.Empty;
_logger = logger;
Id = GetDatabaseType(connection);
}

public RelationalDatabaseHealthContributor(DbConnection connection, string? host, ILogger<RelationalDatabaseHealthContributor> logger):
this(connection, null, host, null, logger)
{
}

public async Task<HealthCheckResult?> CheckHealthAsync(CancellationToken cancellationToken)
Expand All @@ -51,7 +58,7 @@ public RelationalDatabaseHealthContributor(DbConnection connection, string? host
{
await _connection.OpenAsync(cancellationToken);
DbCommand command = _connection.CreateCommand();
command.CommandText = "SELECT 1;";
command.CommandText = _commandText;
await command.ExecuteScalarAsync(cancellationToken);

result.Status = HealthStatus.Up;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,4 +181,46 @@ public async Task Canceled_Throws()

await action.Should().ThrowExactlyAsync<OperationCanceledException>();
}

[Fact]
public async Task Uses_Custom_Command_Text()
{
var commandMock = new Mock<DbCommand>();
commandMock.Setup(command => command.ExecuteScalarAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult<object?>(1));

var connectionMock = new Mock<DbConnection>();
connectionMock.Setup(connection => connection.Open());
connectionMock.Protected().Setup<DbCommand>("CreateDbCommand").Returns(() => commandMock.Object);

using var healthContributor =
new RelationalDatabaseHealthContributor(connectionMock.Object, null, "localhost", "FOO_COMMAND", NullLogger<RelationalDatabaseHealthContributor>.Instance)
{
ServiceName = "Example"
};

await healthContributor.CheckHealthAsync(TestContext.Current.CancellationToken);

commandMock.VerifySet(command => command.CommandText = "FOO_COMMAND", Times.Once());
}

[Fact]
public async Task Uses_Default_Command_Text()
{
var commandMock = new Mock<DbCommand>();
commandMock.Setup(command => command.ExecuteScalarAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult<object?>(1));

var connectionMock = new Mock<DbConnection>();
connectionMock.Setup(connection => connection.Open());
connectionMock.Protected().Setup<DbCommand>("CreateDbCommand").Returns(() => commandMock.Object);

using var healthContributor =
new RelationalDatabaseHealthContributor(connectionMock.Object, "localhost", NullLogger<RelationalDatabaseHealthContributor>.Instance)
{
ServiceName = "Example"
};

await healthContributor.CheckHealthAsync(TestContext.Current.CancellationToken);

commandMock.VerifySet(command => command.CommandText = "SELECT 1;", Times.Once());
}
}