/
PostgresDatabaseStarter.cs
67 lines (57 loc) · 2.28 KB
/
PostgresDatabaseStarter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Data.Common;
using System.Threading.Tasks;
using DotNet.Testcontainers.Containers.Builders;
using DotNet.Testcontainers.Containers.Configurations.Databases;
using DotNet.Testcontainers.Containers.Modules.Abstractions;
using DotNet.Testcontainers.Containers.Modules.Databases;
using EvoMaster.DatabaseController.Abstractions;
using Npgsql;
namespace EvoMaster.DatabaseController
{
public class PostgresDatabaseController : IDatabaseController
{
private static TestcontainerDatabase _database;
private static NpgsqlConnection _connection;
public PostgresDatabaseController(string databaseName, int port, string password, int timeout = 60)
{
DatabaseName = databaseName;
Port = port;
Timeout = timeout;
Password = password;
}
public string DatabaseName { get; }
public int Port { get; }
public int Timeout { get; }
public string Password { get; }
public async Task<(string, DbConnection)> StartAsync()
{
var postgresBuilder = new TestcontainersBuilder<PostgreSqlTestcontainer>()
.WithName($"EvoMaster-DB-Postgres-{Guid.NewGuid()}")
.WithDatabase(new PostgreSqlTestcontainerConfiguration
{
Database = DatabaseName,
Username = "user",
Password = Password
})
.WithExposedPort(Port).WithCleanUp(true);
_database = postgresBuilder.Build();
await _database.StartAsync();
_connection = new NpgsqlConnection(_database.ConnectionString);
await _connection.OpenAsync();
//No idea why the password is missing in the connection string
var connectionString = $"{_connection.ConnectionString};Password={_database.Password}";
return (connectionString, _connection);
}
public async Task StopAsync()
{
await _connection.CloseAsync();
await _database.StopAsync();
}
public void Stop()
{
_connection.Close();
_database.StopAsync().GetAwaiter().GetResult();
}
}
}