blob: 7fd17b0da78279831b9faa32d08dad53f6cb550d [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//go:build !build_with_native_toolchain
// +build !build_with_native_toolchain
package netdevice
import (
"errors"
"testing"
"fidl/fuchsia/hardware/network"
"github.com/google/go-cmp/cmp"
)
func TestMakeSessionConfig(t *testing.T) {
const txBufferHead = 16
const txBufferTail = 8
var baseInfo network.DeviceInfo
baseInfo.SetMaxBufferLength(16 * 1024)
baseInfo.SetMinRxBufferLength(0)
baseInfo.SetRxDepth(16)
baseInfo.SetTxDepth(16)
baseInfo.SetBufferAlignment(1)
baseInfo.SetMinTxBufferHead(txBufferHead)
baseInfo.SetMinTxBufferTail(txBufferTail)
factory := SimpleSessionConfigFactory{}
tests := []struct {
name string
updateInfo func(*network.DeviceInfo)
expectedConfig SessionConfig
}{
{
name: "defaults",
expectedConfig: SessionConfig{
BufferLength: DefaultBufferLength,
BufferStride: DefaultBufferLength,
DescriptorLength: descriptorLength,
TxHeaderLength: baseInfo.MinTxBufferHead,
TxTailLength: baseInfo.MinTxBufferTail,
RxDescriptorCount: baseInfo.TxDepth,
TxDescriptorCount: baseInfo.RxDepth,
Options: network.SessionFlagsPrimary,
},
},
{
name: "respect max buffer length",
updateInfo: func(info *network.DeviceInfo) {
info.SetMaxBufferLength(DefaultBufferLength / 4)
},
expectedConfig: SessionConfig{
BufferLength: DefaultBufferLength / 4,
BufferStride: DefaultBufferLength / 4,
DescriptorLength: descriptorLength,
TxHeaderLength: baseInfo.MinTxBufferHead,
TxTailLength: baseInfo.MinTxBufferTail,
RxDescriptorCount: baseInfo.TxDepth,
TxDescriptorCount: baseInfo.RxDepth,
Options: network.SessionFlagsPrimary,
},
},
{
name: "respect min buffer length",
updateInfo: func(info *network.DeviceInfo) {
info.SetMinRxBufferLength(DefaultBufferLength * 2)
},
expectedConfig: SessionConfig{
BufferLength: DefaultBufferLength * 2,
BufferStride: DefaultBufferLength * 2,
DescriptorLength: descriptorLength,
TxHeaderLength: baseInfo.MinTxBufferHead,
TxTailLength: baseInfo.MinTxBufferTail,
RxDescriptorCount: baseInfo.TxDepth,
TxDescriptorCount: baseInfo.RxDepth,
Options: network.SessionFlagsPrimary,
},
},
{
name: "buffer alignment",
updateInfo: func(info *network.DeviceInfo) {
info.SetBufferAlignment(64)
info.SetMinRxBufferLength(DefaultBufferLength + 112)
},
expectedConfig: SessionConfig{
BufferLength: DefaultBufferLength + 112,
BufferStride: DefaultBufferLength + 128,
DescriptorLength: descriptorLength,
TxHeaderLength: baseInfo.MinTxBufferHead,
TxTailLength: baseInfo.MinTxBufferTail,
RxDescriptorCount: baseInfo.TxDepth,
TxDescriptorCount: baseInfo.RxDepth,
Options: network.SessionFlagsPrimary,
},
},
{
name: "align up",
updateInfo: func(info *network.DeviceInfo) {
info.SetBufferAlignment(8)
info.SetMinRxBufferLength(1500)
info.SetMaxBufferLength(1500)
},
expectedConfig: SessionConfig{
BufferLength: 1500,
BufferStride: 1504,
DescriptorLength: descriptorLength,
TxHeaderLength: baseInfo.MinTxBufferHead,
TxTailLength: baseInfo.MinTxBufferTail,
RxDescriptorCount: baseInfo.TxDepth,
TxDescriptorCount: baseInfo.RxDepth,
Options: network.SessionFlagsPrimary,
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
info := baseInfo
if test.updateInfo != nil {
test.updateInfo(&info)
}
sessionConfig, err := factory.MakeSessionConfig(info)
if err != nil {
t.Fatalf("MakeSessionConfig(%+v): %s", info, err)
}
if diff := cmp.Diff(test.expectedConfig, sessionConfig); diff != "" {
t.Errorf("MakeSessionConfig(%+v): (-want +got)\n%s", info, diff)
}
})
}
}
func TestCheckSessionConfig(t *testing.T) {
config := SessionConfig{
BufferLength: DefaultBufferLength,
TxHeaderLength: 16,
TxTailLength: 8,
}
tests := []struct {
name string
mtu uint32
check func(t *testing.T, portStatus network.PortStatus, err error)
}{
{
name: "success",
mtu: config.BufferLength - uint32(config.TxHeaderLength+config.TxTailLength),
check: func(t *testing.T, portStatus network.PortStatus, err error) {
if err != nil {
t.Fatalf("config.checkValidityForPort(%+v) = %s", portStatus, err)
}
},
},
{
name: "failure",
mtu: config.BufferLength,
check: func(t *testing.T, portStatus network.PortStatus, err error) {
var got *insufficientBufferLengthError
if !errors.As(err, &got) {
t.Fatalf("checkValidityForPort(%+v) = %s, expected %T", portStatus, err, got)
}
if diff := cmp.Diff(got, &insufficientBufferLengthError{
bufferLength: config.BufferLength,
bufferHeader: config.TxHeaderLength,
bufferTail: config.TxTailLength,
mtu: config.BufferLength,
}, cmp.AllowUnexported(*got)); diff != "" {
t.Errorf("checkValidityForPort(%+v) error diff: (-want +got)\n%s", portStatus, diff)
}
},
},
}
for _, testCase := range tests {
t.Run(testCase.name, func(t *testing.T) {
var portStatus network.PortStatus
portStatus.SetMtu(testCase.mtu)
err := config.checkValidityForPort(portStatus)
testCase.check(t, portStatus, err)
})
}
}