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  }