// +build !freebsd freebsd,cgo

package nats

import (
	"fmt"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/influxdata/telegraf/testutil"
	"github.com/stretchr/testify/require"
)

var sampleVarz = `
{
  "server_id": "n2afhLHLl64Gcaj7S7jaNa",
  "version": "1.0.0",
  "go": "go1.8",
  "host": "0.0.0.0",
  "auth_required": false,
  "ssl_required": false,
  "tls_required": false,
  "tls_verify": false,
  "addr": "0.0.0.0",
  "max_connections": 65536,
  "ping_interval": 120000000000,
  "ping_max": 2,
  "http_host": "0.0.0.0",
  "http_port": 1337,
  "https_port": 0,
  "auth_timeout": 1,
  "max_control_line": 1024,
  "cluster": {
    "addr": "0.0.0.0",
    "cluster_port": 0,
    "auth_timeout": 1
  },
  "tls_timeout": 0.5,
  "port": 4222,
  "max_payload": 1048576,
  "start": "1861-04-12T10:15:26.841483489-05:00",
  "now": "2011-10-05T15:24:23.722084098-07:00",
  "uptime": "150y5md237h8m57s",
  "mem": 15581184,
  "cores": 48,
  "cpu": 9,
  "connections": 5,
  "total_connections": 109,
  "routes": 1,
  "remotes": 2,
  "in_msgs": 74148556,
  "out_msgs": 68863261,
  "in_bytes": 946267004717,
  "out_bytes": 948110960598,
  "slow_consumers": 2,
  "subscriptions": 4,
  "http_req_stats": {
    "/": 1,
    "/connz": 100847,
    "/routez": 0,
    "/subsz": 1,
    "/varz": 205785
  },
  "config_load_time": "2017-07-24T10:15:26.841483489-05:00"
}
`

func TestMetricsCorrect(t *testing.T) {
	var acc testutil.Accumulator

	srv := newTestNatsServer()
	defer srv.Close()

	n := &Nats{Server: srv.URL}
	err := n.Gather(&acc)
	require.NoError(t, err)

	fields := map[string]interface{}{
		"in_msgs":           int64(74148556),
		"out_msgs":          int64(68863261),
		"in_bytes":          int64(946267004717),
		"out_bytes":         int64(948110960598),
		"uptime":            int64(4748742536880600609),
		"cores":             48,
		"cpu":               float64(9),
		"mem":               int64(15581184),
		"connections":       int(5),
		"total_connections": uint64(109),
		"subscriptions":     uint32(4),
		"slow_consumers":    int64(2),
		"routes":            int(1),
		"remotes":           int(2),
	}
	tags := map[string]string{
		"server": srv.URL,
	}
	acc.AssertContainsTaggedFields(t, "nats", fields, tags)
}

func newTestNatsServer() *httptest.Server {
	return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		var rsp string

		switch r.URL.Path {
		case "/varz":
			rsp = sampleVarz
		default:
			panic("Cannot handle request")
		}

		fmt.Fprintln(w, rsp)
	}))
}
