1package statsd
2
3import (
4	"testing"
5
6	"github.com/stretchr/testify/assert"
7)
8
9func TestBufferGauge(t *testing.T) {
10	buffer := newStatsdBuffer(1024, 1)
11	err := buffer.writeGauge("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
12	assert.Nil(t, err)
13	assert.Equal(t, `namespace.metric:1|g|#tag:tag`, string(buffer.bytes()))
14}
15
16func TestBufferCount(t *testing.T) {
17	buffer := newStatsdBuffer(1024, 1)
18	err := buffer.writeCount("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
19	assert.Nil(t, err)
20	assert.Equal(t, `namespace.metric:1|c|#tag:tag`, string(buffer.bytes()))
21}
22
23func TestBufferHistogram(t *testing.T) {
24	buffer := newStatsdBuffer(1024, 1)
25	err := buffer.writeHistogram("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
26	assert.Nil(t, err)
27	assert.Equal(t, `namespace.metric:1|h|#tag:tag`, string(buffer.bytes()))
28}
29
30func TestBufferDistribution(t *testing.T) {
31	buffer := newStatsdBuffer(1024, 1)
32	err := buffer.writeDistribution("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
33	assert.Nil(t, err)
34	assert.Equal(t, `namespace.metric:1|d|#tag:tag`, string(buffer.bytes()))
35}
36func TestBufferSet(t *testing.T) {
37	buffer := newStatsdBuffer(1024, 1)
38	err := buffer.writeSet("namespace.", []string{"tag:tag"}, "metric", "value", []string{}, 1)
39	assert.Nil(t, err)
40	assert.Equal(t, `namespace.metric:value|s|#tag:tag`, string(buffer.bytes()))
41}
42
43func TestBufferTiming(t *testing.T) {
44	buffer := newStatsdBuffer(1024, 1)
45	err := buffer.writeTiming("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
46	assert.Nil(t, err)
47	assert.Equal(t, `namespace.metric:1.000000|ms|#tag:tag`, string(buffer.bytes()))
48}
49
50func TestBufferEvent(t *testing.T) {
51	buffer := newStatsdBuffer(1024, 1)
52	err := buffer.writeEvent(Event{Title: "title", Text: "text"}, []string{"tag:tag"})
53	assert.Nil(t, err)
54	assert.Equal(t, `_e{5,4}:title|text|#tag:tag`, string(buffer.bytes()))
55}
56
57func TestBufferServiceCheck(t *testing.T) {
58	buffer := newStatsdBuffer(1024, 1)
59	err := buffer.writeServiceCheck(ServiceCheck{Name: "name", Status: Ok}, []string{"tag:tag"})
60	assert.Nil(t, err)
61	assert.Equal(t, `_sc|name|0|#tag:tag`, string(buffer.bytes()))
62}
63
64func TestBufferFullItems(t *testing.T) {
65	buffer := newStatsdBuffer(1024, 1)
66	err := buffer.writeGauge("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
67	assert.Nil(t, err)
68	err = buffer.writeGauge("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
69	assert.Equal(t, errBufferFull, err)
70}
71
72func TestBufferFullSize(t *testing.T) {
73	buffer := newStatsdBuffer(29, 10)
74	err := buffer.writeGauge("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
75	assert.Nil(t, err)
76	assert.Len(t, buffer.bytes(), 29)
77	err = buffer.writeGauge("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
78	assert.Equal(t, errBufferFull, err)
79}
80
81func TestBufferSeparator(t *testing.T) {
82	buffer := newStatsdBuffer(1024, 10)
83	err := buffer.writeGauge("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
84	assert.Nil(t, err)
85	err = buffer.writeGauge("namespace.", []string{"tag:tag"}, "metric", 1, []string{}, 1)
86	assert.Nil(t, err)
87	assert.Equal(t, "namespace.metric:1|g|#tag:tag\nnamespace.metric:1|g|#tag:tag", string(buffer.bytes()))
88}
89
90func TestBufferAggregated(t *testing.T) {
91	buffer := newStatsdBuffer(1024, 1)
92	pos, err := buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{1}, "", 12)
93	assert.Nil(t, err)
94	assert.Equal(t, 1, pos)
95	assert.Equal(t, `namespace.metric:1|h|#tag:tag`, string(buffer.bytes()))
96
97	buffer = newStatsdBuffer(1024, 1)
98	pos, err = buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{1, 2, 3, 4}, "", 12)
99	assert.Nil(t, err)
100	assert.Equal(t, 4, pos)
101	assert.Equal(t, `namespace.metric:1:2:3:4|h|#tag:tag`, string(buffer.bytes()))
102
103	// max element already used
104	buffer = newStatsdBuffer(1024, 1)
105	buffer.elementCount = 1
106	pos, err = buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{1, 2, 3, 4}, "", 12)
107	assert.Equal(t, errBufferFull, err)
108
109	// not enought size to start serializing
110	buffer = newStatsdBuffer(29, 1)
111	pos, err = buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{1, 2, 3, 4}, "", 12)
112	assert.Equal(t, errBufferFull, err)
113
114	// space for only 1 number
115	buffer = newStatsdBuffer(30, 1)
116	pos, err = buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{1, 2, 3, 4}, "", 12)
117	assert.Equal(t, errPartialWrite, err)
118	assert.Equal(t, 1, pos)
119	assert.Equal(t, `namespace.metric:1|h|#tag:tag`, string(buffer.bytes()))
120
121	// first value too big
122	buffer = newStatsdBuffer(30, 1)
123	pos, err = buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{12, 2, 3, 4}, "", 12)
124	assert.Equal(t, errBufferFull, err)
125	assert.Equal(t, 0, pos)
126	assert.Equal(t, "", string(buffer.bytes())) // checking that the buffer was reset
127
128	// not enough space left
129	buffer = newStatsdBuffer(40, 1)
130	buffer.buffer = append(buffer.buffer, []byte("abcdefghij")...)
131	pos, err = buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{12, 2, 3, 4}, "", 12)
132	assert.Equal(t, errBufferFull, err)
133	assert.Equal(t, 0, pos)
134	assert.Equal(t, "abcdefghij", string(buffer.bytes())) // checking that the buffer was reset
135
136	// space for only 2 number
137	buffer = newStatsdBuffer(32, 1)
138	pos, err = buffer.writeAggregated([]byte("h"), "namespace.", []string{"tag:tag"}, "metric", []float64{1, 2, 3, 4}, "", 12)
139	assert.Equal(t, errPartialWrite, err)
140	assert.Equal(t, 2, pos)
141	assert.Equal(t, `namespace.metric:1:2|h|#tag:tag`, string(buffer.bytes()))
142}
143