chore: implement more robust wait strategies in testcontainers services

This commit is contained in:
Manuel de la Peña
2025-02-18 17:58:47 +01:00
parent d3c0d39dc8
commit 0c2d884898
7 changed files with 45 additions and 7 deletions

View File

@@ -13,6 +13,7 @@ import (
"github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/clickhouse" "github.com/testcontainers/testcontainers-go/modules/clickhouse"
"github.com/testcontainers/testcontainers-go/wait"
) )
const ( const (
@@ -39,6 +40,14 @@ func getTestConnection(t testing.TB, cfg Config) (*Storage, error) {
clickhouse.WithUsername(clickhouseUser), clickhouse.WithUsername(clickhouseUser),
clickhouse.WithPassword(clickhousePass), clickhouse.WithPassword(clickhousePass),
clickhouse.WithDatabase(clickhouseDB), clickhouse.WithDatabase(clickhouseDB),
testcontainers.WithWaitStrategy(
wait.ForAll(
wait.ForListeningPort("8123/tcp"),
wait.NewHTTPStrategy("/").WithPort("8123/tcp").WithStatusCodeMatcher(func(status int) bool {
return status == 200
}),
),
),
) )
testcontainers.CleanupContainer(t, c) testcontainers.CleanupContainer(t, c)
if err != nil { if err != nil {

View File

@@ -10,6 +10,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/minio" "github.com/testcontainers/testcontainers-go/modules/minio"
"github.com/testcontainers/testcontainers-go/wait"
) )
const ( const (
@@ -34,6 +35,10 @@ func newTestStore(t testing.TB) (*Storage, error) {
img, img,
minio.WithUsername(minioUser), minio.WithUsername(minioUser),
minio.WithPassword(minioPass), minio.WithPassword(minioPass),
testcontainers.WithWaitStrategy(
wait.ForListeningPort("9000/tcp"),
wait.ForHTTP("/minio/health/live").WithPort("9000"),
),
) )
testcontainers.CleanupContainer(t, c) testcontainers.CleanupContainer(t, c)
if err != nil { if err != nil {

View File

@@ -9,6 +9,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/mongodb" "github.com/testcontainers/testcontainers-go/modules/mongodb"
"github.com/testcontainers/testcontainers-go/wait"
) )
const ( const (
@@ -29,7 +30,15 @@ func newTestStore(t testing.TB) (*Storage, error) {
ctx := context.Background() ctx := context.Background()
c, err := mongodb.Run(ctx, img, mongodb.WithUsername(mongoDBUser), mongodb.WithPassword(mongoDBPass)) c, err := mongodb.Run(
ctx, img, mongodb.WithUsername(mongoDBUser), mongodb.WithPassword(mongoDBPass),
testcontainers.WithWaitStrategy(
wait.ForAll(
wait.ForListeningPort("27017/tcp"),
wait.ForLog("Waiting for connections"),
),
),
)
testcontainers.CleanupContainer(t, c) testcontainers.CleanupContainer(t, c)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -10,6 +10,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/mysql" "github.com/testcontainers/testcontainers-go/modules/mysql"
"github.com/testcontainers/testcontainers-go/wait"
) )
const ( const (
@@ -51,6 +52,10 @@ func mustStartMySQL(t testing.TB) *mysql.MySQLContainer {
mysql.WithPassword(mysqlPass), mysql.WithPassword(mysqlPass),
mysql.WithUsername(mysqlUser), mysql.WithUsername(mysqlUser),
mysql.WithDatabase(mysqlDatabase), mysql.WithDatabase(mysqlDatabase),
testcontainers.WithWaitStrategy(
wait.ForListeningPort("3306/tcp"),
wait.ForLog("port: 3306 MySQL Community Server"),
),
) )
testcontainers.CleanupContainer(t, c) testcontainers.CleanupContainer(t, c)
require.NoError(t, err) require.NoError(t, err)

View File

@@ -8,7 +8,9 @@ import (
"time" "time"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/neo4j" "github.com/testcontainers/testcontainers-go/modules/neo4j"
"github.com/testcontainers/testcontainers-go/wait"
) )
var testStore *Storage var testStore *Storage
@@ -21,6 +23,13 @@ func TestMain(m *testing.M) {
neo4jContainer, err := neo4j.Run(ctx, neo4jContainer, err := neo4j.Run(ctx,
"neo4j:5.26", "neo4j:5.26",
neo4j.WithAdminPassword("pass#w*#d"), neo4j.WithAdminPassword("pass#w*#d"),
testcontainers.WithWaitStrategy(
wait.ForAll(
wait.ForListeningPort("7474/tcp"),
wait.ForListeningPort("7687/tcp"),
wait.ForLog("Bolt enabled on"),
),
),
) )
if err != nil { if err != nil {
log.Fatalf("Failed to start Neo4j container: %v", err) log.Fatalf("Failed to start Neo4j container: %v", err)

View File

@@ -10,7 +10,6 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/postgres" "github.com/testcontainers/testcontainers-go/modules/postgres"
"github.com/testcontainers/testcontainers-go/wait"
) )
const ( const (
@@ -36,11 +35,7 @@ func newTestStore(t testing.TB) (*Storage, error) {
postgres.WithUsername(postgresUser), postgres.WithUsername(postgresUser),
postgres.WithPassword(postgresPass), postgres.WithPassword(postgresPass),
postgres.WithDatabase(postgresDatabase), postgres.WithDatabase(postgresDatabase),
testcontainers.WithWaitStrategy( postgres.BasicWaitStrategies(),
// First, we wait for the container to log readiness twice.
// This is because it will restart itself after the first startup.
wait.ForLog("database system is ready to accept connections").WithOccurrence(2),
),
) )
testcontainers.CleanupContainer(t, c) testcontainers.CleanupContainer(t, c)
require.NoError(t, err) require.NoError(t, err)

View File

@@ -6,7 +6,9 @@ import (
"testing" "testing"
"time" "time"
"github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/minio" "github.com/testcontainers/testcontainers-go/modules/minio"
"github.com/testcontainers/testcontainers-go/wait"
) )
const ( const (
@@ -35,6 +37,10 @@ func TestMain(m *testing.M) {
img, img,
minio.WithUsername(minioUser), minio.WithUsername(minioUser),
minio.WithPassword(minioPass), minio.WithPassword(minioPass),
testcontainers.WithWaitStrategy(
wait.ForListeningPort("9000/tcp"),
wait.ForHTTP("/minio/health/live").WithPort("9000"),
),
) )
if err != nil { if err != nil {
panic(err) panic(err)