telegraf/plugins/inputs/dpdk/dpdk_connector_test.go

183 lines
5.4 KiB
Go

// +build linux
package dpdk
import (
"encoding/json"
"fmt"
"testing"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf/plugins/inputs/dpdk/mocks"
)
func Test_readMaxOutputLen(t *testing.T) {
t.Run("should return error if timeout occurred", func(t *testing.T) {
conn := &mocks.Conn{}
conn.On("Read", mock.Anything).Return(0, fmt.Errorf("timeout"))
conn.On("SetDeadline", mock.Anything).Return(nil)
connector := dpdkConnector{connection: conn}
_, err := connector.readMaxOutputLen()
require.Error(t, err)
require.Contains(t, err.Error(), "timeout")
})
t.Run("should pass and set maxOutputLen if provided with valid InitMessage", func(t *testing.T) {
maxOutputLen := uint32(4567)
initMessage := initMessage{
Version: "DPDK test version",
Pid: 1234,
MaxOutputLen: maxOutputLen,
}
message, err := json.Marshal(initMessage)
require.NoError(t, err)
conn := &mocks.Conn{}
conn.On("Read", mock.Anything).Run(func(arg mock.Arguments) {
elem := arg.Get(0).([]byte)
copy(elem, message)
}).Return(len(message), nil)
conn.On("SetDeadline", mock.Anything).Return(nil)
connector := dpdkConnector{connection: conn}
_, err = connector.readMaxOutputLen()
require.NoError(t, err)
require.Equal(t, maxOutputLen, connector.maxOutputLen)
})
t.Run("should fail if received invalid json", func(t *testing.T) {
message := `{notAJson}`
conn := &mocks.Conn{}
conn.On("Read", mock.Anything).Run(func(arg mock.Arguments) {
elem := arg.Get(0).([]byte)
copy(elem, message)
}).Return(len(message), nil)
conn.On("SetDeadline", mock.Anything).Return(nil)
connector := dpdkConnector{connection: conn}
_, err := connector.readMaxOutputLen()
require.Error(t, err)
require.Contains(t, err.Error(), "looking for beginning of object key string")
})
t.Run("should fail if received maxOutputLen equals to 0", func(t *testing.T) {
message, err := json.Marshal(initMessage{
Version: "test",
Pid: 1,
MaxOutputLen: 0,
})
require.NoError(t, err)
conn := &mocks.Conn{}
conn.On("Read", mock.Anything).Run(func(arg mock.Arguments) {
elem := arg.Get(0).([]byte)
copy(elem, message)
}).Return(len(message), nil)
conn.On("SetDeadline", mock.Anything).Return(nil)
connector := dpdkConnector{connection: conn}
_, err = connector.readMaxOutputLen()
require.Error(t, err)
require.Contains(t, err.Error(), "failed to read maxOutputLen information")
})
}
func Test_connect(t *testing.T) {
t.Run("should pass if PathToSocket points to socket", func(t *testing.T) {
pathToSocket, socket := createSocketForTest(t)
defer socket.Close()
dpdk := dpdk{
SocketPath: pathToSocket,
connector: newDpdkConnector(pathToSocket, 0),
}
go simulateSocketResponse(socket, t)
_, err := dpdk.connector.connect()
require.NoError(t, err)
})
}
func Test_getCommandResponse(t *testing.T) {
command := "/"
response := "myResponseString"
t.Run("should return proper buffer size and value if no error occurred", func(t *testing.T) {
mockConn, dpdk, _ := prepareEnvironment()
defer mockConn.AssertExpectations(t)
simulateResponse(mockConn, response, nil)
buf, err := dpdk.connector.getCommandResponse(command)
require.NoError(t, err)
require.Equal(t, len(response), len(buf))
require.Equal(t, response, string(buf))
})
t.Run("should return error if failed to get connection handler", func(t *testing.T) {
_, dpdk, _ := prepareEnvironment()
dpdk.connector.connection = nil
buf, err := dpdk.connector.getCommandResponse(command)
require.Error(t, err)
require.Contains(t, err.Error(), "failed to get connection to execute / command")
require.Equal(t, 0, len(buf))
})
t.Run("should return error if failed to set timeout duration", func(t *testing.T) {
mockConn, dpdk, _ := prepareEnvironment()
defer mockConn.AssertExpectations(t)
mockConn.On("SetDeadline", mock.Anything).Return(fmt.Errorf("deadline error"))
buf, err := dpdk.connector.getCommandResponse(command)
require.Error(t, err)
require.Contains(t, err.Error(), "deadline error")
require.Equal(t, 0, len(buf))
})
t.Run("should return error if timeout occurred during Write operation", func(t *testing.T) {
mockConn, dpdk, _ := prepareEnvironment()
defer mockConn.AssertExpectations(t)
mockConn.On("Write", mock.Anything).Return(0, fmt.Errorf("write timeout"))
mockConn.On("SetDeadline", mock.Anything).Return(nil)
mockConn.On("Close").Return(nil)
buf, err := dpdk.connector.getCommandResponse(command)
require.Error(t, err)
require.Contains(t, err.Error(), "write timeout")
require.Equal(t, 0, len(buf))
})
t.Run("should return error if timeout occurred during Read operation", func(t *testing.T) {
mockConn, dpdk, _ := prepareEnvironment()
defer mockConn.AssertExpectations(t)
simulateResponse(mockConn, "", fmt.Errorf("read timeout"))
buf, err := dpdk.connector.getCommandResponse(command)
require.Error(t, err)
require.Contains(t, err.Error(), "read timeout")
require.Equal(t, 0, len(buf))
})
t.Run("should return error if got empty response", func(t *testing.T) {
mockConn, dpdk, _ := prepareEnvironment()
defer mockConn.AssertExpectations(t)
simulateResponse(mockConn, "", nil)
buf, err := dpdk.connector.getCommandResponse(command)
require.Error(t, err)
require.Equal(t, 0, len(buf))
require.Contains(t, err.Error(), "got empty response during execution of")
})
}