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