test: migrate postgres to testcontainers (#11209)

This commit is contained in:
Joshua Powers 2022-06-02 07:48:13 -06:00 committed by GitHub
parent 43c9e051b5
commit 936b90806b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 96 additions and 14 deletions

View File

@ -4,21 +4,50 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/docker/go-connections/nat"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go/wait"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
) )
const servicePort = "5432"
func launchTestContainer(t *testing.T) *testutil.Container {
container := testutil.Container{
Image: "postgres:alpine",
ExposedPorts: []string{servicePort},
Env: map[string]string{
"POSTGRES_HOST_AUTH_METHOD": "trust",
},
WaitingFor: wait.ForAll(
wait.ForLog("database system is ready to accept connections"),
wait.ForListeningPort(nat.Port(servicePort)),
),
}
err := container.Start()
require.NoError(t, err, "failed to start container")
return &container
}
func TestPostgresqlGeneratesMetricsIntegration(t *testing.T) { func TestPostgresqlGeneratesMetricsIntegration(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
container := launchTestContainer(t)
defer func() {
require.NoError(t, container.Terminate(), "terminating container failed")
}()
p := &Postgresql{ p := &Postgresql{
Service: Service{ Service: Service{
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=postgres sslmode=disable", "host=%s port=%s user=postgres sslmode=disable",
testutil.GetLocalHost(), container.Address,
container.Ports[servicePort],
), ),
IsPgBouncer: false, IsPgBouncer: false,
}, },
@ -99,11 +128,17 @@ func TestPostgresqlTagsMetricsWithDatabaseNameIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
container := launchTestContainer(t)
defer func() {
require.NoError(t, container.Terminate(), "terminating container failed")
}()
p := &Postgresql{ p := &Postgresql{
Service: Service{ Service: Service{
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=postgres sslmode=disable", "host=%s port=%s user=postgres sslmode=disable",
testutil.GetLocalHost(), container.Address,
container.Ports[servicePort],
), ),
}, },
Databases: []string{"postgres"}, Databases: []string{"postgres"},
@ -125,11 +160,17 @@ func TestPostgresqlDefaultsToAllDatabasesIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
container := launchTestContainer(t)
defer func() {
require.NoError(t, container.Terminate(), "terminating container failed")
}()
p := &Postgresql{ p := &Postgresql{
Service: Service{ Service: Service{
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=postgres sslmode=disable", "host=%s port=%s user=postgres sslmode=disable",
testutil.GetLocalHost(), container.Address,
container.Ports[servicePort],
), ),
}, },
} }
@ -158,11 +199,17 @@ func TestPostgresqlIgnoresUnwantedColumnsIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
container := launchTestContainer(t)
defer func() {
require.NoError(t, container.Terminate(), "terminating container failed")
}()
p := &Postgresql{ p := &Postgresql{
Service: Service{ Service: Service{
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=postgres sslmode=disable", "host=%s port=%s user=postgres sslmode=disable",
testutil.GetLocalHost(), container.Address,
container.Ports[servicePort],
), ),
}, },
} }
@ -181,11 +228,17 @@ func TestPostgresqlDatabaseWhitelistTestIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
container := launchTestContainer(t)
defer func() {
require.NoError(t, container.Terminate(), "terminating container failed")
}()
p := &Postgresql{ p := &Postgresql{
Service: Service{ Service: Service{
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=postgres sslmode=disable", "host=%s port=%s user=postgres sslmode=disable",
testutil.GetLocalHost(), container.Address,
container.Ports[servicePort],
), ),
}, },
Databases: []string{"template0"}, Databases: []string{"template0"},
@ -221,11 +274,17 @@ func TestPostgresqlDatabaseBlacklistTestIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
container := launchTestContainer(t)
defer func() {
require.NoError(t, container.Terminate(), "terminating container failed")
}()
p := &Postgresql{ p := &Postgresql{
Service: Service{ Service: Service{
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=postgres sslmode=disable", "host=%s port=%s user=postgres sslmode=disable",
testutil.GetLocalHost(), container.Address,
container.Ports[servicePort],
), ),
}, },
IgnoredDatabases: []string{"template0"}, IgnoredDatabases: []string{"template0"},

View File

@ -6,25 +6,48 @@ import (
"testing" "testing"
"time" "time"
"github.com/docker/go-connections/nat"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go/wait"
"github.com/influxdata/telegraf/plugins/inputs/postgresql" "github.com/influxdata/telegraf/plugins/inputs/postgresql"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
) )
func queryRunner(t *testing.T, q query) *testutil.Accumulator { func queryRunner(t *testing.T, q query) *testutil.Accumulator {
servicePort := "5432"
container := testutil.Container{
Image: "postgres:alpine",
ExposedPorts: []string{servicePort},
Env: map[string]string{
"POSTGRES_HOST_AUTH_METHOD": "trust",
},
WaitingFor: wait.ForAll(
wait.ForLog("database system is ready to accept connections"),
wait.ForListeningPort(nat.Port(servicePort)),
),
}
err := container.Start()
require.NoError(t, err, "failed to start container")
defer func() {
require.NoError(t, container.Terminate(), "terminating container failed")
}()
p := &Postgresql{ p := &Postgresql{
Log: testutil.Logger{}, Log: testutil.Logger{},
Service: postgresql.Service{ Service: postgresql.Service{
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=postgres sslmode=disable", "host=%s port=%s user=postgres sslmode=disable",
testutil.GetLocalHost(), container.Address,
container.Ports[servicePort],
), ),
IsPgBouncer: false, IsPgBouncer: false,
}, },
Databases: []string{"postgres"}, Databases: []string{"postgres"},
Query: q, Query: q,
} }
var acc testutil.Accumulator var acc testutil.Accumulator
require.NoError(t, p.Init()) require.NoError(t, p.Init())
require.NoError(t, p.Start(&acc)) require.NoError(t, p.Start(&acc))