github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/metrics/sinks/statsd/statsd_client_test.go (about) 1 // Copyright 2016 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package statsd 16 17 import ( 18 "net" 19 "strings" 20 "testing" 21 "time" 22 23 "github.com/stretchr/testify/assert" 24 ) 25 26 const ( 27 validHost = "127.0.0.1:48125" 28 validNumMetricsPerMsg = 3 29 bufferSize = 1024 30 ) 31 32 var msgs = [...]string{ 33 "test message 0", 34 "test message 1", 35 "test message 2", 36 "test message 3", 37 "test message 4", 38 "test message 5", 39 "test message 6", 40 "test message 7", 41 } 42 43 func TestInvalidHostname(t *testing.T) { 44 client, err := NewStatsdClient("badhostname:8125", validNumMetricsPerMsg) 45 assert.NoError(t, err) 46 assert.NotNil(t, client) 47 err = client.open() 48 assert.Error(t, err, "An error to lookup an invalid host was expected") 49 } 50 51 func TestInvalidPortNumber(t *testing.T) { 52 client, err := NewStatsdClient("localhost", validNumMetricsPerMsg) 53 assert.NoError(t, err) 54 assert.NotNil(t, client) 55 err = client.open() 56 assert.Error(t, err, "Error expected - missing port number") 57 58 client, err = NewStatsdClient("localhost:-8125", validNumMetricsPerMsg) 59 assert.NoError(t, err) 60 assert.NotNil(t, client) 61 err = client.open() 62 assert.Error(t, err, "Error expected - port number cannot be negative") 63 } 64 65 func TestInvalidNumMetricsPerMsg(t *testing.T) { 66 _, err := NewStatsdClient(validHost, 0) 67 assert.Error(t, err, "Error expected - number of metrics per message cannot be 0") 68 69 _, err = NewStatsdClient(validHost, -1) 70 assert.Error(t, err, "Error expected - number of metrics per message cannot be negative") 71 } 72 73 func TestClose(t *testing.T) { 74 client, err := NewStatsdClient(validHost, validNumMetricsPerMsg) 75 assert.NoError(t, err) 76 assert.NotNil(t, client) 77 err = client.close() 78 assert.NoError(t, err, "Unexpected error - close() should be a NOOP if it is called before open()") 79 80 err = client.open() 81 assert.NoError(t, err) 82 err = client.close() 83 assert.NoError(t, err) 84 err = client.close() 85 assert.NoError(t, err, "Unexpected error - close() should be a NOOP if it is called after another close()") 86 } 87 88 func initClientServer(t *testing.T, messages []string, numMetricsPerMsg int) (client statsdClient, serverConn *net.UDPConn) { 89 client, err := NewStatsdClient(validHost, numMetricsPerMsg) 90 assert.NoError(t, err) 91 assert.NotNil(t, client) 92 93 err = client.open() 94 assert.NoError(t, err) 95 96 addr, err := net.ResolveUDPAddr("udp", validHost) 97 assert.NoError(t, err) 98 assert.NotNil(t, addr) 99 100 conn, err := net.ListenUDP("udp", addr) 101 assert.NoError(t, err) 102 assert.NotNil(t, conn) 103 104 conn.SetReadDeadline(time.Now().Add(10 * time.Second)) 105 106 err = client.send(messages) 107 assert.NoError(t, err) 108 109 return client, conn 110 } 111 112 func TestSendOneMsg(t *testing.T) { 113 114 numMetricsPerMsg := 10 115 start := 0 116 end := 5 117 client, conn := initClientServer(t, msgs[start:end], numMetricsPerMsg) 118 119 expectedMsg := strings.Join(msgs[start:end], "\n") + "\n" 120 121 buf := make([]byte, 1024) 122 n, _, err := conn.ReadFromUDP(buf) 123 assert.NoError(t, err) 124 assert.Equal(t, expectedMsg, string(buf[0:n])) 125 126 err = client.close() 127 assert.NoError(t, err) 128 conn.Close() 129 } 130 131 func TestSendMultipleMsgsEqualBatches(t *testing.T) { 132 133 buf := make([]byte, bufferSize) 134 numMetricsPerMsg := 4 135 start := 0 136 end := 8 137 client, conn := initClientServer(t, msgs[start:end], numMetricsPerMsg) 138 139 expectedMsg := strings.Join(msgs[0:4], "\n") + "\n" 140 n, _, err := conn.ReadFromUDP(buf) 141 assert.NoError(t, err) 142 assert.Equal(t, expectedMsg, string(buf[0:n])) 143 144 expectedMsg = strings.Join(msgs[4:8], "\n") + "\n" 145 n, _, err = conn.ReadFromUDP(buf) 146 assert.NoError(t, err) 147 assert.Equal(t, expectedMsg, string(buf[0:n])) 148 149 err = client.close() 150 assert.NoError(t, err) 151 conn.Close() 152 } 153 154 func TestSendMultipleMsgsUnequalBatches(t *testing.T) { 155 156 buf := make([]byte, bufferSize) 157 numMetricsPerMsg := 3 158 start := 0 159 end := 8 160 client, conn := initClientServer(t, msgs[start:end], numMetricsPerMsg) 161 162 expectedMsg := strings.Join(msgs[0:3], "\n") + "\n" 163 n, _, err := conn.ReadFromUDP(buf) 164 assert.NoError(t, err) 165 assert.Equal(t, expectedMsg, string(buf[0:n])) 166 167 expectedMsg = strings.Join(msgs[3:6], "\n") + "\n" 168 n, _, err = conn.ReadFromUDP(buf) 169 assert.NoError(t, err) 170 assert.Equal(t, expectedMsg, string(buf[0:n])) 171 172 expectedMsg = strings.Join(msgs[6:8], "\n") + "\n" 173 n, _, err = conn.ReadFromUDP(buf) 174 assert.NoError(t, err) 175 assert.Equal(t, expectedMsg, string(buf[0:n])) 176 177 err = client.close() 178 assert.NoError(t, err) 179 conn.Close() 180 }