This commit is contained in:
Simon Fraser 2015-08-03 11:09:57 +01:00
commit 8b5947f31c
10 changed files with 95 additions and 10 deletions

11
Makefile Normal file
View File

@ -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

View File

@ -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`

16
docker-compose.yml Normal file
View File

@ -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"

View File

@ -14,6 +14,9 @@ import (
) )
func TestReadsMetricsFromKafka(t *testing.T) { func TestReadsMetricsFromKafka(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test in short mode")
}
var zkPeers, brokerPeers []string var zkPeers, brokerPeers []string
if len(os.Getenv("ZOOKEEPER_PEERS")) == 0 { if len(os.Getenv("ZOOKEEPER_PEERS")) == 0 {

View File

@ -10,7 +10,7 @@ import (
func TestMemcachedGeneratesMetrics(t *testing.T) { func TestMemcachedGeneratesMetrics(t *testing.T) {
m := &Memcached{ m := &Memcached{
Servers: []string{"localhost"}, Servers: []string{testutil.GetLocalHost()},
} }
var acc testutil.Accumulator var acc testutil.Accumulator

View File

@ -1,6 +1,7 @@
package mysql package mysql
import ( import (
"fmt"
"strings" "strings"
"testing" "testing"
@ -11,7 +12,7 @@ import (
func TestMysqlGeneratesMetrics(t *testing.T) { func TestMysqlGeneratesMetrics(t *testing.T) {
m := &Mysql{ m := &Mysql{
Servers: []string{""}, Servers: []string{fmt.Sprintf("root@tcp(%s:3306)/", testutil.GetLocalHost())},
} }
var acc testutil.Accumulator var acc testutil.Accumulator
@ -53,7 +54,9 @@ func TestMysqlGeneratesMetrics(t *testing.T) {
} }
func TestMysqlDefaultsToLocal(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 var acc testutil.Accumulator

View File

@ -1,6 +1,7 @@
package postgresql package postgresql
import ( import (
"fmt"
"testing" "testing"
"github.com/influxdb/telegraf/testutil" "github.com/influxdb/telegraf/testutil"
@ -12,7 +13,7 @@ func TestPostgresqlGeneratesMetrics(t *testing.T) {
p := &Postgresql{ p := &Postgresql{
Servers: []*Server{ Servers: []*Server{
{ {
Address: "sslmode=disable", Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()),
Databases: []string{"postgres"}, Databases: []string{"postgres"},
}, },
}, },
@ -57,7 +58,7 @@ func TestPostgresqlTagsMetricsWithDatabaseName(t *testing.T) {
p := &Postgresql{ p := &Postgresql{
Servers: []*Server{ Servers: []*Server{
{ {
Address: "sslmode=disable", Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()),
Databases: []string{"postgres"}, Databases: []string{"postgres"},
}, },
}, },
@ -78,7 +79,7 @@ func TestPostgresqlDefaultsToAllDatabases(t *testing.T) {
p := &Postgresql{ p := &Postgresql{
Servers: []*Server{ Servers: []*Server{
{ {
Address: "sslmode=disable", Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()),
}, },
}, },
} }

View File

@ -83,7 +83,7 @@ func TestRedisGeneratesMetrics(t *testing.T) {
} }
for _, c := range checkInt { for _, c := range checkInt {
assert.NoError(t, acc.ValidateValue(c.name, c.value)) assert.True(t, acc.CheckValue(c.name, c.value))
} }
checkFloat := []struct { checkFloat := []struct {
@ -98,7 +98,7 @@ func TestRedisGeneratesMetrics(t *testing.T) {
} }
for _, c := range checkFloat { 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 { for _, c := range checkInt {
assert.NoError(t, acc.ValidateValue(c.name, c.value)) assert.True(t, acc.CheckValue(c.name, c.value))
} }
checkFloat := []struct { checkFloat := []struct {
@ -189,7 +189,7 @@ func TestRedisCanPullStatsFromMultipleServers(t *testing.T) {
} }
for _, c := range checkFloat { for _, c := range checkFloat {
assert.NoError(t, acc.ValidateValue(c.name, c.value)) assert.True(t, acc.CheckValue(c.name, c.value))
} }
} }

12
testutil/testutil.go Normal file
View File

@ -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
}

26
testutil/testutil_test.go Normal file
View File

@ -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"))
}
}