Skip to content

Trying snapshots #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
2 changes: 1 addition & 1 deletion ContosoUniversity.IntegrationTests/IntegrationTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace ContosoUniversity.IntegrationTests
{
public abstract class IntegrationTestBase : IAsyncLifetime
{
public virtual Task InitializeAsync() => SliceFixture.ResetCheckpoint();
public virtual async Task InitializeAsync() => await SliceFixture.ResetCheckpoint();

public virtual Task DisposeAsync() => Task.FromResult(0);
}
Expand Down
51 changes: 50 additions & 1 deletion ContosoUniversity.IntegrationTests/SliceFixture.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Data.SqlClient;
using System.IO;
using System.Threading.Tasks;
using ContosoUniversity.Data;
Expand All @@ -19,6 +20,9 @@ public class SliceFixture
private static readonly Checkpoint _checkpoint;
private static readonly IConfigurationRoot _configuration;
private static readonly IServiceScopeFactory _scopeFactory;
private static readonly string TestConnectionString;
private static readonly string MasterConnectionString;
private static string TestDbName;

static SliceFixture()
{
Expand All @@ -37,10 +41,55 @@ static SliceFixture()
startup.ConfigureServices(services);
var provider = services.BuildServiceProvider();
_scopeFactory = provider.GetService<IServiceScopeFactory>();

TestConnectionString = _configuration.GetConnectionString("DefaultConnection");
var connStringBuilder = new SqlConnectionStringBuilder(TestConnectionString);
TestDbName = connStringBuilder.InitialCatalog;
connStringBuilder.InitialCatalog = "master";
MasterConnectionString = connStringBuilder.ToString();

_checkpoint = new Checkpoint();

CreateSnapshot();
}

public static Task ResetCheckpoint() => _checkpoint.Reset(_configuration.GetConnectionString("DefaultConnection"));
private static void CreateSnapshot()
{
_checkpoint.Reset(TestConnectionString).GetAwaiter().GetResult();

using (var conn = new SqlConnection(MasterConnectionString))
{
conn.Open();
var snapshotDbName = TestDbName + "-Snapshot";
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = $"DROP DATABASE IF EXISTS [{snapshotDbName}]";
cmd.ExecuteNonQuery();
}
using (var cmd = conn.CreateCommand())
{
var filename = Path.Combine(Environment.CurrentDirectory, $"{snapshotDbName}.ss");
cmd.CommandText = $"CREATE DATABASE [{snapshotDbName}] ON (Name = [{TestDbName}], Filename='{filename}') AS SNAPSHOT OF [{TestDbName}]";
cmd.ExecuteNonQuery();
}
}
}

public static async Task ResetCheckpoint()
{
using (var conn = new SqlConnection(MasterConnectionString))
{
await conn.OpenAsync();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = $@"ALTER DATABASE [{TestDbName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [{TestDbName}] FROM DATABASE_SNAPSHOT = '{TestDbName}-Snapshot';
ALTER DATABASE [{TestDbName}] SET MULTI_USER;";
await cmd.ExecuteNonQueryAsync();
}
}
}
//=> await _checkpoint.Reset(_configuration.GetConnectionString("DefaultConnection"));

public static async Task ExecuteScopeAsync(Func<IServiceProvider, Task> action)
{
Expand Down