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