telegraf/plugins/inputs/nginx_upstream_check/nginx_upstream_check_test.go

136 lines
3.3 KiB
Go

package nginx_upstream_check
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/require"
)
const sampleStatusResponse = `
{
"servers": {
"total": 2,
"generation": 1,
"server": [
{
"index": 0,
"upstream": "upstream-1",
"name": "127.0.0.1:8081",
"status": "up",
"rise": 1000,
"fall": 0,
"type": "http",
"port": 0
},
{
"index": 1,
"upstream": "upstream-2",
"name": "127.0.0.1:8082",
"status": "down",
"rise": 0,
"fall": 2000,
"type": "tcp",
"port": 8080
}
]
}
}
`
func TestNginxUpstreamCheckData(test *testing.T) {
testServer := httptest.NewServer(http.HandlerFunc(func(responseWriter http.ResponseWriter, request *http.Request) {
var response string
if request.URL.Path == "/status" {
response = sampleStatusResponse
responseWriter.Header()["Content-Type"] = []string{"application/json"}
} else {
panic("Cannot handle request")
}
fmt.Fprintln(responseWriter, response)
}))
defer testServer.Close()
check := NewNginxUpstreamCheck()
check.URL = fmt.Sprintf("%s/status", testServer.URL)
var accumulator testutil.Accumulator
checkError := check.Gather(&accumulator)
require.NoError(test, checkError)
accumulator.AssertContainsTaggedFields(
test,
"nginx_upstream_check",
map[string]interface{}{
"status": string("up"),
"status_code": uint8(1),
"rise": uint64(1000),
"fall": uint64(0),
},
map[string]string{
"upstream": string("upstream-1"),
"type": string("http"),
"name": string("127.0.0.1:8081"),
"port": string("0"),
"url": fmt.Sprintf("%s/status", testServer.URL),
})
accumulator.AssertContainsTaggedFields(
test,
"nginx_upstream_check",
map[string]interface{}{
"status": string("down"),
"status_code": uint8(2),
"rise": uint64(0),
"fall": uint64(2000),
},
map[string]string{
"upstream": string("upstream-2"),
"type": string("tcp"),
"name": string("127.0.0.1:8082"),
"port": string("8080"),
"url": fmt.Sprintf("%s/status", testServer.URL),
})
}
func TestNginxUpstreamCheckRequest(test *testing.T) {
testServer := httptest.NewServer(http.HandlerFunc(func(responseWriter http.ResponseWriter, request *http.Request) {
var response string
if request.URL.Path == "/status" {
response = sampleStatusResponse
responseWriter.Header()["Content-Type"] = []string{"application/json"}
} else {
panic("Cannot handle request")
}
fmt.Fprintln(responseWriter, response)
require.Equal(test, request.Method, "POST")
require.Equal(test, request.Header.Get("X-Test"), "test-value")
require.Equal(test, request.Header.Get("Authorization"), "Basic dXNlcjpwYXNzd29yZA==")
require.Equal(test, request.Host, "status.local")
}))
defer testServer.Close()
check := NewNginxUpstreamCheck()
check.URL = fmt.Sprintf("%s/status", testServer.URL)
check.Headers["X-test"] = "test-value"
check.HostHeader = "status.local"
check.Username = "user"
check.Password = "password"
check.Method = "POST"
var accumulator testutil.Accumulator
checkError := check.Gather(&accumulator)
require.NoError(test, checkError)
}