package expvarom
import (
"expvar"
"io"
"net/http/httptest"
"testing"
"github.com/google/go-cmp/cmp"
)
var (
testI1 = NewInt("testI1", "int test var")
testI2 = expvar.NewInt("testI2")
testF = NewFloat("testF", "float test var")
testMI = NewMap("testMI", "label", "int map test var")
testMF = NewMap("testMF", "label", "float map test var")
testMXI = expvar.NewMap("testMXI")
testMXF = expvar.NewMap("testMXF")
//lint:ignore U1000 Intentionally unused, should not be exported.
testMEmpty = expvar.NewMap("testMEmpty") //nolint
testMOther = expvar.NewMap("testMOther")
testS = expvar.NewString("testS")
// Naming test cases.
testN1 = expvar.NewInt("name/1z")
testN2 = NewInt("name$2", "name with $")
testN3 = expvar.NewInt("3name")
testN4 = expvar.NewInt("nAme_4Z")
testN5 = expvar.NewInt("ñame_5")
)
const expected string = `_ame_5 5
i3name 3
nAme_4Z 4
name_1z 1
# HELP name_2 name with $
name_2 2
# HELP testF float test var
testF 3.43434
# HELP testI1 int test var
testI1 1
testI2 2
# HELP testMF float map test var
testMF{label="key2.0"} 6.6
testMF{label="key2.1"} 6.61
testMF{label="key2.2-ñaca"} 6.62
testMF{label="key2.3-a\\b"} 6.63
testMF{label="key2.4- "} 6.64
testMF{label="key2.5-a\nb"} 6.65
testMF{label="key2.6-a\"b"} 6.66
testMF{label="key2.7-\\u00f1aca-A\\t\\xff\\xfe\\xfdB"} 6.67
# HELP testMI int map test var
testMI{label="key1"} 5
testMXF{key="key4"} 8e-08
testMXI{key="key3"} 7
# Generated by expvarom
# EXPERIMENTAL - Format is not fully standard yet
# Ignored variables: ["cmdline" "memstats" "testS"]
# EOF
`
func TestHandler(t *testing.T) {
testI1.Add(1)
testI2.Add(2)
testF.Add(3.43434)
testMI.Add("key1", 5)
// Test some strange keys in this map to check they're escaped properly.
testMF.AddFloat("key2.0", 6.60)
testMF.AddFloat("key2.1", 6.61)
testMF.AddFloat("key2.2-ñaca", 6.62)
testMF.AddFloat(`key2.3-a\b`, 6.63)
testMF.AddFloat("key2.4-\t", 6.64)
testMF.AddFloat("key2.5-a\nb", 6.65)
testMF.AddFloat(`key2.6-a"b`, 6.66)
testMF.AddFloat("key2.7-ñaca-A\t\xff\xfe\xfdB", 6.67) // Invalid utf8.
testMXI.Add("key3", 7)
testMXF.AddFloat("key4", 8e-8)
testS.Set("lalala")
testN1.Add(1)
testN2.Add(2)
testN3.Add(3)
testN4.Add(4)
testN5.Add(5)
// Map with an unsupported type.
testMOther.Set("keyX", &expvar.String{})
req := httptest.NewRequest("get", "/metrics", nil)
w := httptest.NewRecorder()
MetricsHandler(w, req)
resp := w.Result()
body, _ := io.ReadAll(resp.Body)
if diff := cmp.Diff(expected, string(body)); diff != "" {
t.Errorf("MetricsHandler() mismatch (-want +got):\n%s", diff)
}
}
func TestMapLabelAccident(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Errorf("NewMap did not panic as expected")
}
}()
NewMap("name", "label with spaces", "description")
}