136 lines
3.3 KiB
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)
|
||
|
}
|