File: SqlServerTests.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.Caching.Hybrid.Tests\Microsoft.Extensions.Caching.Hybrid.Tests.csproj (Microsoft.Extensions.Caching.Hybrid.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.DependencyInjection;
using Xunit.Abstractions;
 
namespace Microsoft.Extensions.Caching.Hybrid.Tests;
 
public class SqlServerTests : DistributedCacheTests
{
    public SqlServerTests(ITestOutputHelper log)
        : base(log)
    {
    }
 
    protected override bool CustomClockSupported => true;
 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Caught and logged")]
    protected override async ValueTask ConfigureAsync(IServiceCollection services)
    {
        // create a local DB named CacheBench, then
        // dotnet tool install --global dotnet-sql-cache
        // dotnet sql-cache create "Data Source=.;Initial Catalog=CacheBench;Integrated Security=True;Trust Server Certificate=True" dbo BenchmarkCache
 
        const string ConnectionString = "Data Source=.;Initial Catalog=CacheBench;Integrated Security=True;Trust Server Certificate=True";
 
        try
        {
            using var conn = new SqlConnection(ConnectionString);
            using var cmd = conn.CreateCommand();
            cmd.CommandText = "truncate table dbo.BenchmarkCache";
            await conn.OpenAsync();
            await cmd.ExecuteNonQueryAsync();
 
            // if that worked: we should be fine
            services.AddDistributedSqlServerCache(options =>
            {
                options.SchemaName = "dbo";
                options.TableName = "BenchmarkCache";
                options.ConnectionString = ConnectionString;
                options.SystemClock = Clock;
            });
        }
        catch (Exception ex)
        {
            Log.WriteLine(ex.Message);
        }
    }
}