diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..cefa9ac44 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +prepare: + go get -d -v -t ./... + docker-compose up -d --no-recreate + +test: prepare + go test -short ./... + +update: + go get -u -v -d -t ./... + +.PHONY: test diff --git a/README.md b/README.md index c59ded712..3294cc34b 100644 --- a/README.md +++ b/README.md @@ -179,3 +179,16 @@ func init() { } ``` +## Testing + +As Telegraf collects metrics from several third-party services it becomes a difficult task to mock each service as +some of them have complicated protocols which would take some time to replicate. + +To overcome this situation we've decided to use docker containers to provide a fast and reproducible environment +to test those services which require it. For other situations (i.e: https://github.com/influxdb/telegraf/blob/master/plugins/redis/redis_test.go ) a simple mock will suffice. + +To execute Telegraf tests follow this simple steps: + +- Install docker compose following [these](https://docs.docker.com/compose/install/) instructions +- execute `make test` + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..f2c1b2b54 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +mysql: + image: mysql + ports: + - "3306:3306" + environment: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + +memcached: + image: memcached + ports: + - "11211:11211" + +postgres: + image: postgres + ports: + - "5432:5432" diff --git a/plugins/kafka_consumer/kafka_consumer_integration_test.go b/plugins/kafka_consumer/kafka_consumer_integration_test.go index 1541cb127..2a82a2374 100644 --- a/plugins/kafka_consumer/kafka_consumer_integration_test.go +++ b/plugins/kafka_consumer/kafka_consumer_integration_test.go @@ -14,6 +14,9 @@ import ( ) func TestReadsMetricsFromKafka(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } var zkPeers, brokerPeers []string if len(os.Getenv("ZOOKEEPER_PEERS")) == 0 { diff --git a/plugins/memcached/memcached_test.go b/plugins/memcached/memcached_test.go index 08e696fb7..522fc7bc7 100644 --- a/plugins/memcached/memcached_test.go +++ b/plugins/memcached/memcached_test.go @@ -10,7 +10,7 @@ import ( func TestMemcachedGeneratesMetrics(t *testing.T) { m := &Memcached{ - Servers: []string{"localhost"}, + Servers: []string{testutil.GetLocalHost()}, } var acc testutil.Accumulator diff --git a/plugins/mysql/mysql_test.go b/plugins/mysql/mysql_test.go index 76cb28b0d..e29e2e12e 100644 --- a/plugins/mysql/mysql_test.go +++ b/plugins/mysql/mysql_test.go @@ -1,6 +1,7 @@ package mysql import ( + "fmt" "strings" "testing" @@ -11,7 +12,7 @@ import ( func TestMysqlGeneratesMetrics(t *testing.T) { m := &Mysql{ - Servers: []string{""}, + Servers: []string{fmt.Sprintf("root@tcp(%s:3306)/", testutil.GetLocalHost())}, } var acc testutil.Accumulator @@ -53,7 +54,9 @@ func TestMysqlGeneratesMetrics(t *testing.T) { } func TestMysqlDefaultsToLocal(t *testing.T) { - m := &Mysql{} + m := &Mysql{ + Servers: []string{fmt.Sprintf("root@tcp(%s:3306)/", testutil.GetLocalHost())}, + } var acc testutil.Accumulator diff --git a/plugins/postgresql/postgresql_test.go b/plugins/postgresql/postgresql_test.go index 91776d619..f9fb2b98e 100644 --- a/plugins/postgresql/postgresql_test.go +++ b/plugins/postgresql/postgresql_test.go @@ -1,6 +1,7 @@ package postgresql import ( + "fmt" "testing" "github.com/influxdb/telegraf/testutil" @@ -12,7 +13,7 @@ func TestPostgresqlGeneratesMetrics(t *testing.T) { p := &Postgresql{ Servers: []*Server{ { - Address: "sslmode=disable", + Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()), Databases: []string{"postgres"}, }, }, @@ -57,7 +58,7 @@ func TestPostgresqlTagsMetricsWithDatabaseName(t *testing.T) { p := &Postgresql{ Servers: []*Server{ { - Address: "sslmode=disable", + Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()), Databases: []string{"postgres"}, }, }, @@ -78,7 +79,7 @@ func TestPostgresqlDefaultsToAllDatabases(t *testing.T) { p := &Postgresql{ Servers: []*Server{ { - Address: "sslmode=disable", + Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()), }, }, } diff --git a/plugins/redis/redis_test.go b/plugins/redis/redis_test.go index 94c52f01b..3e9915393 100644 --- a/plugins/redis/redis_test.go +++ b/plugins/redis/redis_test.go @@ -83,7 +83,7 @@ func TestRedisGeneratesMetrics(t *testing.T) { } for _, c := range checkInt { - assert.NoError(t, acc.ValidateValue(c.name, c.value)) + assert.True(t, acc.CheckValue(c.name, c.value)) } checkFloat := []struct { @@ -98,7 +98,7 @@ func TestRedisGeneratesMetrics(t *testing.T) { } for _, c := range checkFloat { - assert.NoError(t, acc.ValidateValue(c.name, c.value)) + assert.True(t, acc.CheckValue(c.name, c.value)) } } @@ -174,7 +174,7 @@ func TestRedisCanPullStatsFromMultipleServers(t *testing.T) { } for _, c := range checkInt { - assert.NoError(t, acc.ValidateValue(c.name, c.value)) + assert.True(t, acc.CheckValue(c.name, c.value)) } checkFloat := []struct { @@ -189,7 +189,7 @@ func TestRedisCanPullStatsFromMultipleServers(t *testing.T) { } for _, c := range checkFloat { - assert.NoError(t, acc.ValidateValue(c.name, c.value)) + assert.True(t, acc.CheckValue(c.name, c.value)) } } diff --git a/testutil/testutil.go b/testutil/testutil.go new file mode 100644 index 000000000..71c3ce0c2 --- /dev/null +++ b/testutil/testutil.go @@ -0,0 +1,12 @@ +package testutil + +import "os" + +var localhost = "localhost" + +func GetLocalHost() string { + if dockerHostVar := os.Getenv("DOCKER_HOST"); dockerHostVar != "" { + return dockerHostVar + } + return localhost +} diff --git a/testutil/testutil_test.go b/testutil/testutil_test.go new file mode 100644 index 000000000..39f548c0f --- /dev/null +++ b/testutil/testutil_test.go @@ -0,0 +1,26 @@ +package testutil + +import ( + "os" + "testing" +) + +func TestDockerHost(t *testing.T) { + + os.Unsetenv("DOCKER_HOST") + + host := GetLocalHost() + + if host != localhost { + t.Fatalf("Host should be localhost when DOCKER_HOST is not set. Current value [%s]", host) + } + + os.Setenv("DOCKER_HOST", "1.1.1.1") + + host = GetLocalHost() + + if host != "1.1.1.1" { + t.Fatalf("Host should take DOCKER_HOST value when set. Current value is [%s] and DOCKER_HOST is [%s]", host, os.Getenv("DOCKER_HOST")) + } + +}