test: refactor testcontainer port lookup (#11198)

This commit is contained in:
Joshua Powers 2022-05-27 10:24:31 -06:00 committed by GitHub
parent 02dd7c1752
commit 1200f3c87e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 207 additions and 84 deletions

View File

@ -12,10 +12,12 @@ import (
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
) )
const servicePort = "3000"
func launchTestServer(t *testing.T) testutil.Container { func launchTestServer(t *testing.T) testutil.Container {
container := testutil.Container{ container := testutil.Container{
Image: "aerospike:ce-6.0.0.1", Image: "aerospike:ce-6.0.0.1",
ExposedPorts: []string{"3000"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForLog("migrations: complete"), WaitingFor: wait.ForLog("migrations: complete"),
} }
err := container.Start() err := container.Start()
@ -35,7 +37,7 @@ func TestAerospikeStatisticsIntegration(t *testing.T) {
}() }()
a := &Aerospike{ a := &Aerospike{
Servers: []string{fmt.Sprintf("%s:%s", container.Address, container.Port)}, Servers: []string{fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort])},
} }
var acc testutil.Accumulator var acc testutil.Accumulator
@ -65,7 +67,7 @@ func TestAerospikeStatisticsPartialErrIntegration(t *testing.T) {
a := &Aerospike{ a := &Aerospike{
Servers: []string{ Servers: []string{
fmt.Sprintf("%s:%s", container.Address, container.Port), fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort]),
testutil.GetLocalHost() + ":9999", testutil.GetLocalHost() + ":9999",
}, },
} }
@ -94,7 +96,7 @@ func TestSelectNamespacesIntegration(t *testing.T) {
// Select nonexistent namespace // Select nonexistent namespace
a := &Aerospike{ a := &Aerospike{
Servers: []string{fmt.Sprintf("%s:%s", container.Address, container.Port)}, Servers: []string{fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort])},
Namespaces: []string{"notTest"}, Namespaces: []string{"notTest"},
} }
@ -133,7 +135,7 @@ func TestDisableQueryNamespacesIntegration(t *testing.T) {
a := &Aerospike{ a := &Aerospike{
Servers: []string{ Servers: []string{
fmt.Sprintf("%s:%s", container.Address, container.Port), fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort]),
}, },
DisableQueryNamespaces: true, DisableQueryNamespaces: true,
} }
@ -163,7 +165,7 @@ func TestQuerySetsIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
portInt, err := strconv.Atoi(container.Port) portInt, err := strconv.Atoi(container.Ports[servicePort])
require.NoError(t, err) require.NoError(t, err)
// create a set // create a set
@ -192,7 +194,7 @@ func TestQuerySetsIntegration(t *testing.T) {
a := &Aerospike{ a := &Aerospike{
Servers: []string{ Servers: []string{
fmt.Sprintf("%s:%s", container.Address, container.Port), fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort]),
}, },
QuerySets: true, QuerySets: true,
DisableQueryNamespaces: true, DisableQueryNamespaces: true,
@ -220,7 +222,7 @@ func TestSelectQuerySetsIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
portInt, err := strconv.Atoi(container.Port) portInt, err := strconv.Atoi(container.Ports[servicePort])
require.NoError(t, err) require.NoError(t, err)
// create a set // create a set
@ -249,7 +251,7 @@ func TestSelectQuerySetsIntegration(t *testing.T) {
a := &Aerospike{ a := &Aerospike{
Servers: []string{ Servers: []string{
fmt.Sprintf("%s:%s", container.Address, container.Port), fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort]),
}, },
QuerySets: true, QuerySets: true,
Sets: []string{"test/foo"}, Sets: []string{"test/foo"},
@ -280,7 +282,7 @@ func TestDisableTTLHistogramIntegration(t *testing.T) {
a := &Aerospike{ a := &Aerospike{
Servers: []string{ Servers: []string{
fmt.Sprintf("%s:%s", container.Address, container.Port), fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort]),
}, },
QuerySets: true, QuerySets: true,
EnableTTLHistogram: false, EnableTTLHistogram: false,
@ -307,7 +309,7 @@ func TestDisableObjectSizeLinearHistogramIntegration(t *testing.T) {
a := &Aerospike{ a := &Aerospike{
Servers: []string{ Servers: []string{
fmt.Sprintf("%s:%s", container.Address, container.Port), fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort]),
}, },
QuerySets: true, QuerySets: true,
EnableObjectSizeLinearHistogram: false, EnableObjectSizeLinearHistogram: false,

View File

@ -6,6 +6,7 @@ import (
"strings" "strings"
"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/testcontainers/testcontainers-go/wait"
@ -17,10 +18,11 @@ func TestMemcachedGeneratesMetricsIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
servicePort := "11211"
container := testutil.Container{ container := testutil.Container{
Image: "memcached", Image: "memcached",
ExposedPorts: []string{"11211"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("11211/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -29,7 +31,7 @@ func TestMemcachedGeneratesMetricsIntegration(t *testing.T) {
}() }()
m := &Memcached{ m := &Memcached{
Servers: []string{fmt.Sprintf("%s:%s", container.Address, container.Port)}, Servers: []string{fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort])},
} }
var acc testutil.Accumulator var acc testutil.Accumulator

View File

@ -5,12 +5,15 @@ import (
"testing" "testing"
"github.com/DATA-DOG/go-sqlmock" "github.com/DATA-DOG/go-sqlmock"
"github.com/docker/go-connections/nat"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go/wait" "github.com/testcontainers/testcontainers-go/wait"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
) )
const servicePort = "3306"
func TestMysqlDefaultsToLocalIntegration(t *testing.T) { func TestMysqlDefaultsToLocalIntegration(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")
@ -21,8 +24,8 @@ func TestMysqlDefaultsToLocalIntegration(t *testing.T) {
Env: map[string]string{ Env: map[string]string{
"MYSQL_ALLOW_EMPTY_PASSWORD": "yes", "MYSQL_ALLOW_EMPTY_PASSWORD": "yes",
}, },
ExposedPorts: []string{"3306"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("3306"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
@ -32,7 +35,7 @@ func TestMysqlDefaultsToLocalIntegration(t *testing.T) {
}() }()
m := &Mysql{ m := &Mysql{
Servers: []string{fmt.Sprintf("root@tcp(%s:%s)/", container.Address, container.Port)}, Servers: []string{fmt.Sprintf("root@tcp(%s:%s)/", container.Address, container.Ports[servicePort])},
} }
var acc testutil.Accumulator var acc testutil.Accumulator
@ -55,8 +58,8 @@ func TestMysqlMultipleInstancesIntegration(t *testing.T) {
Env: map[string]string{ Env: map[string]string{
"MYSQL_ALLOW_EMPTY_PASSWORD": "yes", "MYSQL_ALLOW_EMPTY_PASSWORD": "yes",
}, },
ExposedPorts: []string{"3306"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("3306/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
@ -65,7 +68,7 @@ func TestMysqlMultipleInstancesIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
testServer := fmt.Sprintf("root@tcp(%s:%s)/?tls=false", container.Address, container.Port) testServer := fmt.Sprintf("root@tcp(%s:%s)/?tls=false", container.Address, container.Ports[servicePort])
m := &Mysql{ m := &Mysql{
Servers: []string{testServer}, Servers: []string{testServer},
IntervalSlow: "30s", IntervalSlow: "30s",

View File

@ -6,6 +6,7 @@ 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/testcontainers/testcontainers-go/wait"
@ -22,6 +23,8 @@ type OPCTags struct {
Want interface{} Want interface{}
} }
const servicePort = "4840"
func TestGetDataBadNodeContainerIntegration(t *testing.T) { func TestGetDataBadNodeContainerIntegration(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")
@ -29,8 +32,8 @@ func TestGetDataBadNodeContainerIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "open62541/open62541", Image: "open62541/open62541",
ExposedPorts: []string{"4840"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("4840/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -46,7 +49,7 @@ func TestGetDataBadNodeContainerIntegration(t *testing.T) {
var o OpcUA var o OpcUA
o.MetricName = "testing" o.MetricName = "testing"
o.Endpoint = fmt.Sprintf("opc.tcp://%s:%s", container.Address, container.Port) o.Endpoint = fmt.Sprintf("opc.tcp://%s:%s", container.Address, container.Ports[servicePort])
fmt.Println(o.Endpoint) fmt.Println(o.Endpoint)
o.AuthMethod = "Anonymous" o.AuthMethod = "Anonymous"
o.ConnectTimeout = config.Duration(10 * time.Second) o.ConnectTimeout = config.Duration(10 * time.Second)
@ -82,8 +85,8 @@ func TestClient1Integration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "open62541/open62541", Image: "open62541/open62541",
ExposedPorts: []string{"4840"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("4840/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -101,7 +104,7 @@ func TestClient1Integration(t *testing.T) {
var o OpcUA var o OpcUA
o.MetricName = "testing" o.MetricName = "testing"
o.Endpoint = fmt.Sprintf("opc.tcp://%s:%s", container.Address, container.Port) o.Endpoint = fmt.Sprintf("opc.tcp://%s:%s", container.Address, container.Ports[servicePort])
o.AuthMethod = "Anonymous" o.AuthMethod = "Anonymous"
o.ConnectTimeout = config.Duration(10 * time.Second) o.ConnectTimeout = config.Duration(10 * time.Second)
o.RequestTimeout = config.Duration(1 * time.Second) o.RequestTimeout = config.Duration(1 * time.Second)

View File

@ -5,6 +5,7 @@ import (
"strconv" "strconv"
"testing" "testing"
"github.com/docker/go-connections/nat"
"github.com/go-ldap/ldap/v3" "github.com/go-ldap/ldap/v3"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go/wait" "github.com/testcontainers/testcontainers-go/wait"
@ -12,6 +13,11 @@ import (
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
) )
const (
servicePort = "1389"
servicePortSecure = "1636"
)
func TestOpenldapMockResult(t *testing.T) { func TestOpenldapMockResult(t *testing.T) {
var acc testutil.Accumulator var acc testutil.Accumulator
@ -59,12 +65,15 @@ func TestOpenldapGeneratesMetricsIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "bitnami/openldap", Image: "bitnami/openldap",
ExposedPorts: []string{"1389"}, ExposedPorts: []string{servicePort},
Env: map[string]string{ Env: map[string]string{
"LDAP_ADMIN_USERNAME": "manager", "LDAP_ADMIN_USERNAME": "manager",
"LDAP_ADMIN_PASSWORD": "secret", "LDAP_ADMIN_PASSWORD": "secret",
}, },
WaitingFor: wait.ForLog("Starting slapd"), WaitingFor: wait.ForAll(
wait.ForLog("Starting slapd"),
wait.ForListeningPort(nat.Port(servicePort)),
),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -72,7 +81,7 @@ func TestOpenldapGeneratesMetricsIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
port, err := strconv.Atoi(container.Port) port, err := strconv.Atoi(container.Ports[servicePort])
require.NoError(t, err) require.NoError(t, err)
o := &Openldap{ o := &Openldap{
@ -104,7 +113,7 @@ func TestOpenldapStartTLSIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "bitnami/openldap", Image: "bitnami/openldap",
ExposedPorts: []string{"1389", "1636"}, ExposedPorts: []string{servicePort},
Env: map[string]string{ Env: map[string]string{
"LDAP_ADMIN_USERNAME": "manager", "LDAP_ADMIN_USERNAME": "manager",
"LDAP_ADMIN_PASSWORD": "secret", "LDAP_ADMIN_PASSWORD": "secret",
@ -118,7 +127,10 @@ func TestOpenldapStartTLSIntegration(t *testing.T) {
"/server.crt": tlsCert, "/server.crt": tlsCert,
"/server.key": tlsKey, "/server.key": tlsKey,
}, },
WaitingFor: wait.ForListeningPort("1389/tcp"), WaitingFor: wait.ForAll(
wait.ForLog("Starting slapd"),
wait.ForListeningPort(nat.Port(servicePort)),
),
} }
err = container.Start() err = container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -126,7 +138,7 @@ func TestOpenldapStartTLSIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
port, err := strconv.Atoi(container.Port) port, err := strconv.Atoi(container.Ports[servicePort])
require.NoError(t, err) require.NoError(t, err)
cert, err := filepath.Abs(pki.ClientCertPath()) cert, err := filepath.Abs(pki.ClientCertPath())
@ -164,7 +176,7 @@ func TestOpenldapLDAPSIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "bitnami/openldap", Image: "bitnami/openldap",
ExposedPorts: []string{"1636"}, ExposedPorts: []string{servicePortSecure},
Env: map[string]string{ Env: map[string]string{
"LDAP_ADMIN_USERNAME": "manager", "LDAP_ADMIN_USERNAME": "manager",
"LDAP_ADMIN_PASSWORD": "secret", "LDAP_ADMIN_PASSWORD": "secret",
@ -178,7 +190,10 @@ func TestOpenldapLDAPSIntegration(t *testing.T) {
"/server.crt": tlsCert, "/server.crt": tlsCert,
"/server.key": tlsKey, "/server.key": tlsKey,
}, },
WaitingFor: wait.ForListeningPort("1636/tcp"), WaitingFor: wait.ForAll(
wait.ForLog("Starting slapd"),
wait.ForListeningPort(nat.Port(servicePortSecure)),
),
} }
err = container.Start() err = container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -186,7 +201,7 @@ func TestOpenldapLDAPSIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
port, err := strconv.Atoi(container.Port) port, err := strconv.Atoi(container.Ports[servicePortSecure])
require.NoError(t, err) require.NoError(t, err)
o := &Openldap{ o := &Openldap{
@ -219,7 +234,7 @@ func TestOpenldapInvalidSSLIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "bitnami/openldap", Image: "bitnami/openldap",
ExposedPorts: []string{"1636"}, ExposedPorts: []string{servicePortSecure},
Env: map[string]string{ Env: map[string]string{
"LDAP_ADMIN_USERNAME": "manager", "LDAP_ADMIN_USERNAME": "manager",
"LDAP_ADMIN_PASSWORD": "secret", "LDAP_ADMIN_PASSWORD": "secret",
@ -233,7 +248,10 @@ func TestOpenldapInvalidSSLIntegration(t *testing.T) {
"/server.crt": tlsCert, "/server.crt": tlsCert,
"/server.key": tlsKey, "/server.key": tlsKey,
}, },
WaitingFor: wait.ForListeningPort("1636/tcp"), WaitingFor: wait.ForAll(
wait.ForLog("Starting slapd"),
wait.ForListeningPort(nat.Port(servicePortSecure)),
),
} }
err = container.Start() err = container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -241,7 +259,7 @@ func TestOpenldapInvalidSSLIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
port, err := strconv.Atoi(container.Port) port, err := strconv.Atoi(container.Ports[servicePortSecure])
require.NoError(t, err) require.NoError(t, err)
o := &Openldap{ o := &Openldap{
@ -265,12 +283,15 @@ func TestOpenldapBindIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "bitnami/openldap", Image: "bitnami/openldap",
ExposedPorts: []string{"1389"}, ExposedPorts: []string{servicePort},
Env: map[string]string{ Env: map[string]string{
"LDAP_ADMIN_USERNAME": "manager", "LDAP_ADMIN_USERNAME": "manager",
"LDAP_ADMIN_PASSWORD": "secret", "LDAP_ADMIN_PASSWORD": "secret",
}, },
WaitingFor: wait.ForListeningPort("1389/tcp"), WaitingFor: wait.ForAll(
wait.ForLog("Starting slapd"),
wait.ForListeningPort(nat.Port(servicePort)),
),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -278,7 +299,7 @@ func TestOpenldapBindIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
port, err := strconv.Atoi(container.Port) port, err := strconv.Atoi(container.Ports[servicePort])
require.NoError(t, err) require.NoError(t, err)
o := &Openldap{ o := &Openldap{
@ -314,12 +335,15 @@ func TestOpenldapReverseMetricsIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "bitnami/openldap", Image: "bitnami/openldap",
ExposedPorts: []string{"1389"}, ExposedPorts: []string{servicePort},
Env: map[string]string{ Env: map[string]string{
"LDAP_ADMIN_USERNAME": "manager", "LDAP_ADMIN_USERNAME": "manager",
"LDAP_ADMIN_PASSWORD": "secret", "LDAP_ADMIN_PASSWORD": "secret",
}, },
WaitingFor: wait.ForListeningPort("1389/tcp"), WaitingFor: wait.ForAll(
wait.ForLog("Starting slapd"),
wait.ForListeningPort(nat.Port(servicePort)),
),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -327,7 +351,7 @@ func TestOpenldapReverseMetricsIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
port, err := strconv.Atoi(container.Port) port, err := strconv.Atoi(container.Ports[servicePort])
require.NoError(t, err) require.NoError(t, err)
o := &Openldap{ o := &Openldap{

View File

@ -4,6 +4,7 @@ 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/testcontainers/testcontainers-go/wait"
@ -16,9 +17,12 @@ func TestPgBouncerGeneratesMetricsIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
postgresServicePort := "5432"
pgBouncerServicePort := "6432"
backend := testutil.Container{ backend := testutil.Container{
Image: "postgres:alpine", Image: "postgres:alpine",
ExposedPorts: []string{"5432"}, ExposedPorts: []string{postgresServicePort},
Env: map[string]string{ Env: map[string]string{
"POSTGRES_HOST_AUTH_METHOD": "trust", "POSTGRES_HOST_AUTH_METHOD": "trust",
}, },
@ -32,12 +36,12 @@ func TestPgBouncerGeneratesMetricsIntegration(t *testing.T) {
container := testutil.Container{ container := testutil.Container{
Image: "z9pascal/pgbouncer-container:1.17.0-latest", Image: "z9pascal/pgbouncer-container:1.17.0-latest",
ExposedPorts: []string{"6432"}, ExposedPorts: []string{pgBouncerServicePort},
Env: map[string]string{ Env: map[string]string{
"PG_ENV_POSTGRESQL_USER": "pgbouncer", "PG_ENV_POSTGRESQL_USER": "pgbouncer",
"PG_ENV_POSTGRESQL_PASS": "pgbouncer", "PG_ENV_POSTGRESQL_PASS": "pgbouncer",
}, },
WaitingFor: wait.ForListeningPort("6432"), WaitingFor: wait.ForListeningPort(nat.Port(pgBouncerServicePort)),
} }
err = container.Start() err = container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -50,7 +54,7 @@ func TestPgBouncerGeneratesMetricsIntegration(t *testing.T) {
Address: fmt.Sprintf( Address: fmt.Sprintf(
"host=%s user=pgbouncer password=pgbouncer dbname=pgbouncer port=%s sslmode=disable", "host=%s user=pgbouncer password=pgbouncer dbname=pgbouncer port=%s sslmode=disable",
container.Address, container.Address,
container.Port, container.Ports[pgBouncerServicePort],
), ),
IsPgBouncer: true, IsPgBouncer: true,
}, },

View File

@ -7,6 +7,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/docker/go-connections/nat"
"github.com/go-redis/redis" "github.com/go-redis/redis"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go/wait" "github.com/testcontainers/testcontainers-go/wait"
@ -38,10 +39,11 @@ func TestRedisConnectIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
servicePort := "6379"
container := testutil.Container{ container := testutil.Container{
Image: "redis:alpine", Image: "redis:alpine",
ExposedPorts: []string{"6379"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("6379/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -49,7 +51,7 @@ func TestRedisConnectIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
addr := fmt.Sprintf("%s:%s", container.Address, container.Port) addr := fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort])
r := &Redis{ r := &Redis{
Log: testutil.Logger{}, Log: testutil.Logger{},

View File

@ -8,6 +8,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/docker/go-connections/nat"
"github.com/influxdata/telegraf" "github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
"github.com/testcontainers/testcontainers-go/wait" "github.com/testcontainers/testcontainers-go/wait"
@ -22,10 +23,11 @@ func TestRedisSentinelConnect(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
servicePort := "6379"
container := testutil.Container{ container := testutil.Container{
Image: "redis:alpine", Image: "redis:alpine",
ExposedPorts: []string{"6379"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("6379/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -33,7 +35,7 @@ func TestRedisSentinelConnect(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
addr := fmt.Sprintf("tcp://%s:%s", container.Address, container.Port) addr := fmt.Sprintf("tcp://%s:%s", container.Address, container.Ports[servicePort])
r := &RedisSentinel{ r := &RedisSentinel{
Servers: []string{addr}, Servers: []string{addr},

View File

@ -4,6 +4,7 @@ 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/testcontainers/testcontainers-go/wait"
@ -15,13 +16,14 @@ func TestZookeeperGeneratesMetricsIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
servicePort := "2181"
container := testutil.Container{ container := testutil.Container{
Image: "zookeeper", Image: "zookeeper",
ExposedPorts: []string{"2181"}, ExposedPorts: []string{servicePort},
Env: map[string]string{ Env: map[string]string{
"ZOO_4LW_COMMANDS_WHITELIST": "mntr", "ZOO_4LW_COMMANDS_WHITELIST": "mntr",
}, },
WaitingFor: wait.ForListeningPort("2181"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -31,7 +33,7 @@ func TestZookeeperGeneratesMetricsIntegration(t *testing.T) {
z := &Zookeeper{ z := &Zookeeper{
Servers: []string{ Servers: []string{
fmt.Sprintf("%s:%s", container.Address, container.Port), fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort]),
}, },
} }

View File

@ -7,6 +7,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/docker/go-connections/nat"
"github.com/influxdata/telegraf" "github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/metric" "github.com/influxdata/telegraf/metric"
@ -15,15 +16,20 @@ import (
"github.com/testcontainers/testcontainers-go/wait" "github.com/testcontainers/testcontainers-go/wait"
) )
const servicePort = "5432"
func createTestContainer(t *testing.T) testutil.Container { func createTestContainer(t *testing.T) testutil.Container {
container := testutil.Container{ container := testutil.Container{
Image: "crate", Image: "crate",
ExposedPorts: []string{"5432"}, ExposedPorts: []string{servicePort},
Entrypoint: []string{ Entrypoint: []string{
"/docker-entrypoint.sh", "/docker-entrypoint.sh",
"-Cdiscovery.type=single-node", "-Cdiscovery.type=single-node",
}, },
WaitingFor: wait.ForListeningPort("5432/tcp"), WaitingFor: wait.ForAll(
wait.ForListeningPort(nat.Port(servicePort)),
wait.ForLog("recovered [0] indices into cluster_state"),
),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -40,8 +46,9 @@ func TestConnectAndWriteIntegration(t *testing.T) {
defer func() { defer func() {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
url := fmt.Sprintf("postgres://crate@%s:%s/test", container.Address, container.Port) url := fmt.Sprintf("postgres://crate@%s:%s/test", container.Address, container.Ports[servicePort])
fmt.Println(url)
table := "testing" table := "testing"
db, err := sql.Open("pgx", url) db, err := sql.Open("pgx", url)
require.NoError(t, err) require.NoError(t, err)
@ -151,7 +158,7 @@ func Test_escapeValueIntegration(t *testing.T) {
defer func() { defer func() {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
url := fmt.Sprintf("postgres://crate@%s:%s/test", container.Address, container.Port) url := fmt.Sprintf("postgres://crate@%s:%s/test", container.Address, container.Ports[servicePort])
db, err := sql.Open("pgx", url) db, err := sql.Open("pgx", url)
require.NoError(t, err) require.NoError(t, err)

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/docker/go-connections/nat"
"github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/plugins/serializers"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
"github.com/testcontainers/testcontainers-go/wait" "github.com/testcontainers/testcontainers-go/wait"
@ -16,10 +17,11 @@ func TestConnectAndWriteIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
servicePort := "1883"
container := testutil.Container{ container := testutil.Container{
Image: "ncarlier/mqtt", Image: "ncarlier/mqtt",
ExposedPorts: []string{"1883"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForListeningPort("1883/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -27,7 +29,7 @@ func TestConnectAndWriteIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
var url = fmt.Sprintf("%s:%s", container.Address, container.Port) var url = fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort])
s, _ := serializers.NewInfluxSerializer() s, _ := serializers.NewInfluxSerializer()
m := &MQTT{ m := &MQTT{
Servers: []string{url}, Servers: []string{url},

View File

@ -15,9 +15,10 @@ func TestConnectAndWriteIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
servicePort := "4222"
container := testutil.Container{ container := testutil.Container{
Image: "nats", Image: "nats",
ExposedPorts: []string{"4222"}, ExposedPorts: []string{servicePort},
WaitingFor: wait.ForLog("Server is ready"), WaitingFor: wait.ForLog("Server is ready"),
} }
err := container.Start() err := container.Start()
@ -26,7 +27,7 @@ func TestConnectAndWriteIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
server := []string{fmt.Sprintf("nats://%s:%s", container.Address, container.Port)} server := []string{fmt.Sprintf("nats://%s:%s", container.Address, container.Ports[servicePort])}
s, _ := serializers.NewInfluxSerializer() s, _ := serializers.NewInfluxSerializer()
n := &NATS{ n := &NATS{
Servers: server, Servers: server,

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/docker/go-connections/nat"
"github.com/influxdata/telegraf/plugins/serializers" "github.com/influxdata/telegraf/plugins/serializers"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -15,11 +16,12 @@ func TestConnectAndWriteIntegration(t *testing.T) {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")
} }
servicePort := "4150"
container := testutil.Container{ container := testutil.Container{
Image: "nsqio/nsq", Image: "nsqio/nsq",
ExposedPorts: []string{"4150"}, ExposedPorts: []string{servicePort},
Entrypoint: []string{"/nsqd"}, Entrypoint: []string{"/nsqd"},
WaitingFor: wait.ForListeningPort("4150/tcp"), WaitingFor: wait.ForListeningPort(nat.Port(servicePort)),
} }
err := container.Start() err := container.Start()
require.NoError(t, err, "failed to start container") require.NoError(t, err, "failed to start container")
@ -27,7 +29,7 @@ func TestConnectAndWriteIntegration(t *testing.T) {
require.NoError(t, container.Terminate(), "terminating container failed") require.NoError(t, container.Terminate(), "terminating container failed")
}() }()
server := []string{fmt.Sprintf("%s:%s", container.Address, container.Port)} server := []string{fmt.Sprintf("%s:%s", container.Address, container.Ports[servicePort])}
s, _ := serializers.NewInfluxSerializer() s, _ := serializers.NewInfluxSerializer()
n := &NSQ{ n := &NSQ{
Server: server[0], Server: server[0],

View File

@ -6,6 +6,7 @@ package testutil
import ( import (
"context" "context"
"fmt" "fmt"
"strings"
"github.com/docker/go-connections/nat" "github.com/docker/go-connections/nat"
"github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go"
@ -13,15 +14,17 @@ import (
) )
type Container struct { type Container struct {
Image string BindMounts map[string]string
Entrypoint []string Entrypoint []string
Env map[string]string Env map[string]string
ExposedPorts []string ExposedPorts []string
BindMounts map[string]string Image string
Name string
Networks []string
WaitingFor wait.Strategy WaitingFor wait.Strategy
Address string Address string
Port string Ports map[string]string
container testcontainers.Container container testcontainers.Container
ctx context.Context ctx context.Context
@ -32,11 +35,13 @@ func (c *Container) Start() error {
req := testcontainers.GenericContainerRequest{ req := testcontainers.GenericContainerRequest{
ContainerRequest: testcontainers.ContainerRequest{ ContainerRequest: testcontainers.ContainerRequest{
Image: c.Image,
Env: c.Env,
ExposedPorts: c.ExposedPorts,
BindMounts: c.BindMounts, BindMounts: c.BindMounts,
Entrypoint: c.Entrypoint, Entrypoint: c.Entrypoint,
Env: c.Env,
ExposedPorts: c.ExposedPorts,
Image: c.Image,
Name: c.Name,
Networks: c.Networks,
WaitingFor: c.WaitingFor, WaitingFor: c.WaitingFor,
}, },
Started: true, Started: true,
@ -48,19 +53,44 @@ func (c *Container) Start() error {
} }
c.container = container c.container = container
c.Address, err = c.container.Host(c.ctx) c.Address = "localhost"
err = c.LookupMappedPorts()
if err != nil { if err != nil {
return fmt.Errorf("container host address failed: %s", err) _ = c.Terminate()
return fmt.Errorf("port lookup failed: %s", err)
} }
// assume the first port is the one the test will connect to return nil
// additional ports can be used for the waiting for section }
if len(c.ExposedPorts) > 0 {
p, err := c.container.MappedPort(c.ctx, nat.Port(c.ExposedPorts[0])) // create a lookup table of exposed ports to mapped ports
if err != nil { func (c *Container) LookupMappedPorts() error {
return fmt.Errorf("container host port failed: %s", err) if len(c.ExposedPorts) == 0 {
return nil
}
if len(c.Ports) == 0 {
c.Ports = make(map[string]string)
}
for _, port := range c.ExposedPorts {
// strip off leading host port: 80:8080 -> 8080
if strings.Contains(port, ":") {
port = strings.Split(port, ":")[1]
} }
c.Port = p.Port()
// strip off the transport: 80/tcp -> 80
if strings.Contains(port, "/") {
port = strings.Split(port, "/")[0]
}
p, err := c.container.MappedPort(c.ctx, nat.Port(port))
if err != nil {
return fmt.Errorf("failed to find '%s' - %s", port, err)
}
fmt.Printf("mapped container port '%s' to host port '%s'\n", port, p.Port())
c.Ports[port] = p.Port()
} }
return nil return nil

View File

@ -22,6 +22,43 @@ func TestEmptyContainer(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
} }
func TestMappedPortLookup(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test in short mode")
}
cases := []struct {
name string
port string
expected string
}{
{"random", "80", "80"},
{"only 80", "80:80", "80"},
{"only 80", "80:80/tcp", "80"},
{"only 8080", "8080:80", "8080"},
{"only 8080", "8080:80/tcp", "8080"},
}
for _, tc := range cases {
container := Container{
Image: "nginx:stable-alpine",
ExposedPorts: []string{tc.port},
}
err := container.Start()
require.NoError(t, err)
if tc.name == "random" {
require.NotEqual(t, tc.expected, container.Ports["80"])
} else {
require.Equal(t, tc.expected, container.Ports["80"])
}
err = container.Terminate()
require.NoError(t, err)
}
}
func TestBadImageName(t *testing.T) { func TestBadImageName(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")