Skip to content

Commit

Permalink
generate stable database names and reuse container instance
Browse files Browse the repository at this point in the history
  • Loading branch information
Barsonax committed Apr 1, 2024
1 parent 2340e67 commit d347e27
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 6 deletions.
17 changes: 17 additions & 0 deletions TestExamplesDotnet.EntityFrameworkCore/DataBaseNameGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Microsoft.EntityFrameworkCore;

namespace TestExamplesDotnet;

public sealed class DataBaseNameGenerator<TDbContext> : IDataBaseNameGenerator
where TDbContext : DbContext
{
private int _counter;

public string GetDataBaseName()
{
var migrationId = typeof(TDbContext).Assembly.ManifestModule.ModuleVersionId.ToString("N");;

var counter = Interlocked.Increment(ref _counter);
return $"{migrationId}_{counter}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ public static void RegisterMigrationInitializer<TContext>(this IServiceCollectio
where TContext : DbContext
{
services.AddTransient<IDatabaseInitializer, DbContextMigrationInitializer<TContext>>();
services.AddSingleton<IDataBaseNameGenerator, DataBaseNameGenerator<TContext>>();
}
}
4 changes: 3 additions & 1 deletion TestExamplesDotnet.Mssql/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ public static void RegisterMssqlContainer(this IServiceCollection services)
});
services.AddTransient<IPooledObjectPolicy<IDatabase>, MsSqlDatabasePoolPolicy>();

var container = new MsSqlBuilder().Build();
var container = new MsSqlBuilder()
.WithReuse(true)
.Build();
Utils.RunWithoutSynchronizationContext(() => container.StartAsync().Wait());
services.AddSingleton(container);
}
Expand Down
4 changes: 2 additions & 2 deletions TestExamplesDotnet.PostgreSql/PostgreSqlDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ public sealed class PostgreSqlDatabase : IDatabase
private bool _initialized;
public string ConnectionString { get; }

public PostgreSqlDatabase(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions)
public PostgreSqlDatabase(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions, IDataBaseNameGenerator dataBaseNameGenerator)
{
_databaseInitializer = databaseInitializer;
_respawnerOptions = respawnerOptions;
ConnectionString = $"Host=127.0.0.1;Port={container.GetMappedPublicPort(5432)};Database={Guid.NewGuid()};Username=postgres;Password=postgres;Include Error Detail=true";
ConnectionString = $"Host=127.0.0.1;Port={container.GetMappedPublicPort(5432)};Database={dataBaseNameGenerator.GetDataBaseName()};Username=postgres;Password=postgres;Include Error Detail=true";
}

public void Initialize(IHost host)
Expand Down
6 changes: 4 additions & 2 deletions TestExamplesDotnet.PostgreSql/PostgreSqlDatabasePoolPolicy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@ public sealed class PostgreSqlDatabasePoolPolicy : IPooledObjectPolicy<IDatabase
private readonly PostgreSqlContainer _container;
private readonly IDatabaseInitializer _databaseInitializer;
private readonly RespawnerOptions _respawnerOptions;
private readonly IDataBaseNameGenerator _dataBaseNameGenerator;


public PostgreSqlDatabasePoolPolicy(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions)
public PostgreSqlDatabasePoolPolicy(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions, IDataBaseNameGenerator dataBaseNameGenerator)
{
_container = container;
_databaseInitializer = databaseInitializer;
_respawnerOptions = respawnerOptions;
_dataBaseNameGenerator = dataBaseNameGenerator;
}

public IDatabase Create() => new PostgreSqlDatabase(_container, _databaseInitializer, _respawnerOptions);
public IDatabase Create() => new PostgreSqlDatabase(_container, _databaseInitializer, _respawnerOptions, _dataBaseNameGenerator);

public bool Return(IDatabase obj) => true;
}
5 changes: 4 additions & 1 deletion TestExamplesDotnet.PostgreSql/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ public static void RegisterPostgreSqlContainer(this IServiceCollection services)
});
services.AddTransient<IPooledObjectPolicy<IDatabase>, PostgreSqlDatabasePoolPolicy>();

var container = new PostgreSqlBuilder().Build();
var container = new PostgreSqlBuilder()
.WithReuse(true)
.Build();
Utils.RunWithoutSynchronizationContext(() => container.StartAsync().Wait());

services.AddSingleton(container);
}
}
6 changes: 6 additions & 0 deletions TestExamplesDotnet/IDataBaseNameGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TestExamplesDotnet;

public interface IDataBaseNameGenerator
{
string GetDataBaseName();
}

0 comments on commit d347e27

Please sign in to comment.