1package metrics
2
3import (
4	"bytes"
5	"io/ioutil"
6	"regexp"
7	"strings"
8	"testing"
9	"time"
10)
11
12func TestSeen(t *testing.T) {
13	buf := new(bytes.Buffer)
14
15	d := NewStatsD(buf, 0)
16	d.Seen("gorets", 2)
17	d.Seen("gorets", 40)
18	d.Seen("gorets", 800)
19	d.Seen("gorets", 1600)
20
21	time.Sleep(30 * time.Millisecond)
22	want := "gorets:2|cgorets:40|cgorets:800|cgorets:1600|c"
23	if got := buf.String(); got != want {
24		t.Errorf("Got %q, want %q", got, want)
25	}
26}
27
28func TestTook(t *testing.T) {
29	start := time.Now()
30	buf := new(bytes.Buffer)
31
32	d := NewStatsD(buf, 0)
33	d.Took("nglork", start)
34	d.Took("nglork", start)
35
36	time.Sleep(30 * time.Millisecond)
37	want := regexp.MustCompile(`^glork:[0-9]+|msglork:[0-9]+|ms$`)
38	if got := buf.String(); !want.MatchString(got) {
39		t.Errorf("Got %q, want match %q", got, want)
40	}
41}
42
43func TestKeyPrefix(t *testing.T) {
44	start := time.Now()
45	buf := new(bytes.Buffer)
46
47	d := NewStatsD(buf, 0)
48	d.KeyPrefix("group.")
49	d.Seen("count", 99)
50	d.Took("time", start)
51
52	time.Sleep(30 * time.Millisecond)
53	want := regexp.MustCompile(`^group\.count:99|cgroup\.time:[0-9]+|ms$`)
54	if got := buf.String(); !want.MatchString(got) {
55		t.Errorf("Got %q, want match %q", got, want)
56	}
57}
58
59func TestBatch(t *testing.T) {
60	buf := new(bytes.Buffer)
61
62	message := "counter:5|c"
63	messagesInPacket := StatsDPackMax / (len(message) + 1)
64	packet := message + strings.Repeat("\n"+message, messagesInPacket-1)
65
66	d := NewStatsD(buf, 50*time.Millisecond)
67	for i := 0; i < 2*messagesInPacket; i++ {
68		d.Seen("counter", 5)
69	}
70
71	time.Sleep(100 * time.Millisecond)
72	if got, want := buf.String(), strings.Repeat(packet, 2); got != want {
73		t.Errorf("Got:\n%q\nWant:\n%q", got, want)
74	}
75}
76
77func BenchmarkSeen(b *testing.B) {
78	d := NewStatsD(ioutil.Discard, time.Millisecond)
79
80	b.ReportAllocs()
81	for i := 0; i < b.N; i++ {
82		d.Seen("bench.key", i)
83	}
84}
85
86func BenchmarkTook(b *testing.B) {
87	start := time.Now()
88	d := NewStatsD(ioutil.Discard, time.Millisecond)
89
90	b.ReportAllocs()
91	for i := 0; i < b.N; i++ {
92		d.Took("bench.key", start)
93	}
94}
95