blob: f224278da5db521e7f45d5cd0fb3289afa96f0be [file] [log] [blame]
/*
* Copyright 2022-present Open Networking Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package application
import (
"context"
"encoding/json"
"net"
"reflect"
"sync"
"testing"
"voltha-go-controller/internal/pkg/controller"
cntlr "voltha-go-controller/internal/pkg/controller"
"voltha-go-controller/internal/pkg/of"
"voltha-go-controller/internal/pkg/util"
"voltha-go-controller/internal/test/mocks"
"github.com/golang/mock/gomock"
"github.com/google/gopacket/layers"
"github.com/opencord/voltha-lib-go/v7/pkg/db/kvstore"
"github.com/stretchr/testify/assert"
"go.uber.org/atomic"
)
const deviceName = "SDX6320031"
func TestVoltPortVnet_JSONMarshal(t *testing.T) {
tests := []struct {
name string
want []byte
wantErr bool
}{
{
name: "VoltPortVnet_JSONMarshal",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
_, err := vpv.JSONMarshal()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.JSONMarshal() error = %v, wantErr %v", err, tt.wantErr)
return
}
})
}
}
func TestVoltPortVnet_IsServiceActivated(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
want bool
}{
{
name: "VoltPortVnet_IsServiceActivated",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
voltServ := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
ForceDelete: true,
},
}
vpv.services.Store(test_device, voltServ)
if got := vpv.IsServiceActivated(tt.args.cntx); got != tt.want {
t.Errorf("VoltPortVnet.IsServiceActivated() = %v, want %v", got, tt.want)
}
})
}
}
func TestVoltVnet_JSONMarshal(t *testing.T) {
tests := []struct {
name string
want []byte
wantErr bool
}{
{
name: "VoltVnet_JSONMarshal",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vv := &VoltVnet{}
_, err := vv.JSONMarshal()
if (err != nil) != tt.wantErr {
t.Errorf("VoltVnet.JSONMarshal() error = %v, wantErr %v", err, tt.wantErr)
return
}
})
}
}
func TestVoltVnet_TriggerAssociatedFlowDelete(t *testing.T) {
type args struct {
cntx context.Context
device string
}
tests := []struct {
name string
args args
want bool
}{
{
name: "VoltVnet_TriggerAssociatedFlowDelete",
args: args{
cntx: context.Background(),
device: test_device,
},
want: true,
},
{
name: "cookieList_empty",
args: args{
cntx: context.Background(),
device: test_device,
},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vv := &VoltVnet{}
switch tt.name {
case "VoltVnet_TriggerAssociatedFlowDelete":
cookie := map[string]bool{}
cookie["1234"] = true
pendingDeleteFlow := map[string]map[string]bool{}
pendingDeleteFlow[test_device] = cookie
vv.PendingDeleteFlow = pendingDeleteFlow
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutVnet(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
if got := vv.TriggerAssociatedFlowDelete(tt.args.cntx, tt.args.device); got != tt.want {
t.Errorf("VoltVnet.TriggerAssociatedFlowDelete() = %v, want %v", got, tt.want)
}
case "cookieList_empty":
if got := vv.TriggerAssociatedFlowDelete(tt.args.cntx, tt.args.device); got != tt.want {
t.Errorf("VoltVnet.TriggerAssociatedFlowDelete() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestVoltApplication_GetMatchingMcastService(t *testing.T) {
type args struct {
port string
device string
cvlan of.VlanType
}
tests := []struct {
name string
args args
want *VoltService
}{
{
name: "VoltApplication_GetMatchingMcastService",
args: args{
port: "test_port",
device: test_device,
cvlan: of.VlanAny,
},
},
{
name: "dIntf_error",
args: args{
port: "test_port",
device: test_device,
cvlan: of.VlanAny,
},
},
{
name: "port == d.NniPort",
args: args{
port: "test_port",
device: test_device,
cvlan: of.VlanAny,
},
},
{
name: "vnets_error",
args: args{
port: "",
device: test_device,
cvlan: of.VlanAny,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{}
switch tt.name {
case "VoltApplication_GetMatchingMcastService":
va.DevicesDisc.Store(test_device, voltDevice)
va.VnetsByPort.Store("test_port", voltPortVnet1)
if got := va.GetMatchingMcastService(tt.args.port, tt.args.device, tt.args.cvlan); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetMatchingMcastService() = %v, want %v", got, tt.want)
}
case "dIntf_error":
if got := va.GetMatchingMcastService(tt.args.port, tt.args.device, tt.args.cvlan); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetMatchingMcastService() = %v, want %v", got, tt.want)
}
case "port == d.NniPort":
va.DevicesDisc.Store(test_device, voltDevice)
voltDevice.NniPort = "test_port"
if got := va.GetMatchingMcastService(tt.args.port, tt.args.device, tt.args.cvlan); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetMatchingMcastService() = %v, want %v", got, tt.want)
}
case "vnets_error":
va.DevicesDisc.Store(test_device, voltDevice)
va.VnetsByPort.Store("test_port1", voltPortVnet1)
if got := va.GetMatchingMcastService(tt.args.port, tt.args.device, tt.args.cvlan); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetMatchingMcastService() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestVoltPortVnet_IgmpFlowInstallFailure(t *testing.T) {
type args struct {
cookie string
errorCode uint32
errReason string
}
tests := []struct {
name string
args args
}{
{
name: "VoltPortVnet_IgmpFlowInstallFailure",
args: args{
cookie: "test_cookie",
errorCode: uint32(1),
errReason: "errReason",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
switch tt.name {
case "VoltPortVnet_IgmpFlowInstallFailure":
voltService.IgmpEnabled = true
vpv.services.Store("test_cookie", voltService)
vpv.IgmpFlowInstallFailure(tt.args.cookie, tt.args.errorCode, tt.args.errReason)
}
})
}
}
func TestVoltVnet_FlowRemoveFailure(t *testing.T) {
type args struct {
cntx context.Context
cookie string
device string
errorCode uint32
errReason string
}
tests := []struct {
name string
args args
}{
{
name: "VoltVnet_FlowRemoveFailure",
args: args{
cntx: context.Background(),
cookie: "1234",
device: test_device,
},
},
{
name: "mismatch_cookie",
args: args{
cntx: context.Background(),
cookie: "1234",
device: test_device,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vv := &VoltVnet{}
switch tt.name {
case "VoltVnet_FlowRemoveFailure":
cookie := map[string]bool{}
cookie["1234"] = true
pendingDeleteFlow := map[string]map[string]bool{}
pendingDeleteFlow[test_device] = cookie
vv.PendingDeleteFlow = pendingDeleteFlow
vv.DeleteInProgress = true
vv.Name = "test_name"
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().DelVnet(tt.args.cntx, "test_name").Return(nil).Times(1)
vv.FlowRemoveFailure(tt.args.cntx, tt.args.cookie, tt.args.device, tt.args.errorCode, tt.args.errReason)
case "mismatch_cookie":
cookie := map[string]bool{}
cookie["12345"] = true
pendingDeleteFlow := map[string]map[string]bool{}
pendingDeleteFlow[test_device] = cookie
vv.PendingDeleteFlow = pendingDeleteFlow
vv.DeleteInProgress = true
vv.Name = "test_name"
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().DelVnet(tt.args.cntx, "test_name").Return(nil).Times(1)
vv.FlowRemoveFailure(tt.args.cntx, tt.args.cookie, tt.args.device, tt.args.errorCode, tt.args.errReason)
}
})
}
}
func TestVoltVnet_FlowRemoveSuccess(t *testing.T) {
type args struct {
cntx context.Context
cookie string
device string
}
tests := []struct {
name string
args args
}{
{
name: "VoltVnet_FlowRemoveSuccess",
args: args{
cntx: context.Background(),
cookie: "1234",
device: test_device,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vv := &VoltVnet{}
cookie := map[string]bool{}
cookie["1234"] = true
pendingDeleteFlow := map[string]map[string]bool{}
pendingDeleteFlow[test_device] = cookie
vv.PendingDeleteFlow = pendingDeleteFlow
ga := GetApplication()
voltDevice.ConfiguredVlanForDeviceFlows = util.NewConcurrentMap()
ga.DevicesDisc.Store(test_device, voltDevice)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutVnet(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
vv.FlowRemoveSuccess(tt.args.cntx, tt.args.cookie, tt.args.device)
})
}
}
func TestVoltPortVnet_FlowRemoveFailure(t *testing.T) {
type args struct {
cntx context.Context
cookie string
device string
errorCode uint32
errReason string
}
tests := []struct {
name string
args args
}{
{
name: "VoltPortVnet_FlowRemoveFailure",
args: args{
cntx: context.Background(),
cookie: "1234",
device: test_device,
},
},
{
name: "DeleteInProgress_false",
args: args{
cntx: context.Background(),
cookie: "1234",
device: test_device,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
switch tt.name {
case "VoltPortVnet_FlowRemoveFailure":
vpv.services.Store("1234", voltService)
vpv.DeleteInProgress = true
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().DelVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
vpv.FlowRemoveFailure(tt.args.cntx, tt.args.cookie, tt.args.device, tt.args.errorCode, tt.args.errReason)
case "DeleteInProgress_false":
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
vpv.FlowRemoveFailure(tt.args.cntx, tt.args.cookie, tt.args.device, tt.args.errorCode, tt.args.errReason)
}
})
}
}
func TestVoltPortVnet_PushFlows(t *testing.T) {
type args struct {
cntx context.Context
device *VoltDevice
flow *of.VoltFlow
}
vsf := make(map[uint64]*of.VoltSubFlow)
vsf[uint64(1)] = &of.VoltSubFlow{
Cookie: uint64(1234),
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "VoltPortVnet_PushFlows",
args: args{
cntx: context.Background(),
device: voltDevice,
flow: &of.VoltFlow{
PortName: "test_port",
SubFlows: vsf,
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
_ = cntlr.NewController(context.Background(), mocks.NewMockApp(gomock.NewController(t)))
err := vpv.PushFlows(tt.args.cntx, tt.args.device, tt.args.flow)
assert.NotNil(t, err)
})
}
}
func TestVoltPortVnet_isVlanMatching(t *testing.T) {
type args struct {
cvlan of.VlanType
svlan of.VlanType
}
tests := []struct {
name string
args args
want bool
}{
{
name: "VoltPortVnet_isVlanMatching",
args: args{
cvlan: of.VlanAny,
svlan: of.VlanAny,
},
want: true,
},
{
name: "vpv.VlanControl_nil",
args: args{
cvlan: of.VlanAny,
svlan: of.VlanAny,
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
switch tt.name {
case "VoltPortVnet_isVlanMatching":
vpv.VlanControl = ONUCVlanOLTSVlan
vpv.SVlan = of.VlanAny
vpv.CVlan = of.VlanAny
if got := vpv.isVlanMatching(tt.args.cvlan, tt.args.svlan); got != tt.want {
t.Errorf("VoltPortVnet.isVlanMatching() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestProcessIcmpv6McGroup(t *testing.T) {
type args struct {
device string
delete bool
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "TestProcessIcmpv6McGroup",
args: args{
device: test_device,
delete: false,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := ProcessIcmpv6McGroup(tt.args.device, tt.args.delete)
assert.NotNil(t, err)
})
}
}
func TestVoltVnet_setPbitRemarking(t *testing.T) {
tests := []struct {
name string
want uint32
}{
{
name: "VoltVnet_setPbitRemarking",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vv := &VoltVnet{}
a := make(map[of.PbitType]of.PbitType)
a[of.PbitMatchAll] = of.PbitMatchAll
vv.CtrlPktPbitRemark = a
if got := vv.setPbitRemarking(); got != tt.want {
t.Errorf("VoltVnet.setPbitRemarking() = %v, want %v", got, tt.want)
}
})
}
}
func TestBuildDSArpFlow(t *testing.T) {
type args struct {
inport uint32
vnet *VoltVnet
}
tests := []struct {
name string
args args
want *of.VoltFlow
}{
{
name: "BuildDSArpFlow",
args: args{
inport: uint32(1),
vnet: &VoltVnet{
Version: "test_version",
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "BuildDSArpFlow":
got := BuildDSArpFlow(tt.args.inport, tt.args.vnet)
assert.NotNil(t, got)
}
})
}
}
func TestBuildICMPv6Flow(t *testing.T) {
type args struct {
inport uint32
vnet *VoltVnet
}
tests := []struct {
name string
args args
want *of.VoltFlow
}{
{
name: "BuildICMPv6Flow",
args: args{
inport: uint32(1),
vnet: &VoltVnet{
Version: "test_version",
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := BuildICMPv6Flow(tt.args.inport, tt.args.vnet)
assert.NotNil(t, got)
})
}
}
func TestVoltApplication_DeleteDevFlowForVlanFromDevice(t *testing.T) {
type args struct {
cntx context.Context
vnet *VoltVnet
deviceSerialNum string
}
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777472",
Ports: sync.Map{},
FlowDelEventMap: util.NewConcurrentMap(),
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
}
voltVnet = &VoltVnet{
Version: "v3",
VnetConfig: VnetConfig{
Name: "2310-4096-4096",
VnetType: "Encapsulation",
},
VnetOper: VnetOper{
PendingDeviceToDelete: "SDX6320031",
DeleteInProgress: true,
PendingDeleteFlow: make(map[string]map[string]bool),
},
}
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
tests := []struct {
name string
args args
}{
{
name: "device.SerialNum != deviceSerialNum",
args: args{
cntx: context.Background(),
vnet: voltVnet,
},
},
{
name: "DeleteDevFlowForVlanFromDevice",
args: args{
cntx: context.Background(),
deviceSerialNum: "SDX6320031",
vnet: voltVnet,
},
},
{
name: "DeleteDevFlowForVlanFromDevice_PortStateDown",
args: args{
cntx: context.Background(),
deviceSerialNum: "SDX6320031",
vnet: voltVnet,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
DevicesDisc: sync.Map{},
}
switch tt.name {
case "device.SerialNum != deviceSerialNum":
va.DevicesDisc.Store(test_device, voltDevice)
va.DeleteDevFlowForVlanFromDevice(tt.args.cntx, tt.args.vnet, tt.args.deviceSerialNum)
case "DeleteDevFlowForVlanFromDevice":
va.DevicesDisc.Store("SDX6320031", voltDev)
va.VnetsByName.Store("2310-4096-4096", voltVnet)
voltDev.ConfiguredVlanForDeviceFlows.Set("0-0-0", util.NewConcurrentMap())
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
State: cntlr.PortStateUp,
}
device := &cntlr.Device{
ID: "SDX6320031",
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
va.DeleteDevFlowForVlanFromDevice(tt.args.cntx, tt.args.vnet, tt.args.deviceSerialNum)
case "DeleteDevFlowForVlanFromDevice_PortStateDown":
voltDev.Name = ""
va.DevicesDisc.Store("SDX6320031", voltDev)
va.VnetsByName.Store("2310-4096-4096", voltVnet)
voltDev.ConfiguredVlanForDeviceFlows.Set("0-0-0", util.NewConcurrentMap())
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
State: cntlr.PortStateUp,
}
device := &cntlr.Device{
ID: "SDX6320031",
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
va.DeleteDevFlowForVlanFromDevice(tt.args.cntx, tt.args.vnet, tt.args.deviceSerialNum)
}
})
}
}
func TestVoltApplication_RestoreVnetsFromDb(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_RestoreVnetsFromDb",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vnetsToDelete := map[string]bool{}
vnetsToDelete["test_name"] = true
va := &VoltApplication{
VnetsBySvlan: util.NewConcurrentMap(),
VnetsToDelete: vnetsToDelete,
}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
vnets := map[string]*kvstore.KVPair{}
voltVnet.SVlan = of.VlanAny
b, err := json.Marshal(voltVnet)
if err != nil {
panic(err)
}
vnets["test_device_id"] = &kvstore.KVPair{
Key: "test_device_id",
Value: b,
}
dbintf.EXPECT().PutVnet(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
dbintf.EXPECT().GetVnets(tt.args.cntx).Return(vnets, nil)
va.RestoreVnetsFromDb(tt.args.cntx)
})
}
}
func TestVoltApplication_DeleteDevFlowForDevice(t *testing.T) {
type args struct {
cntx context.Context
device *VoltDevice
}
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777472",
FlowDelEventMap: util.NewConcurrentMap(),
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
icmpv6GroupAdded: true,
}
voltVnet = &VoltVnet{
Version: "v3",
VnetConfig: VnetConfig{
Name: "2310-4096-4096",
VnetType: "Encapsulation",
},
VnetOper: VnetOper{
PendingDeviceToDelete: "SDX6320031",
DeleteInProgress: true,
PendingDeleteFlow: make(map[string]map[string]bool),
},
}
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
tests := []struct {
name string
args args
}{
{
name: "DeleteDevFlowForDevice",
args: args{
cntx: context.Background(),
device: voltDev,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{}
switch tt.name {
case "DeleteDevFlowForDevice":
va.DevicesDisc.Store("SDX6320031", voltDev)
va.VnetsByName.Store("2310-4096-4096", voltVnet)
voltDev.ConfiguredVlanForDeviceFlows.Set("0-0-0", util.NewConcurrentMap())
va.PortsDisc.Store("16777472", voltPort)
voltApp := GetApplication()
voltApp.DevicesDisc.Store("SDX6320031", voltDev)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
State: cntlr.PortStateUp,
}
device := &cntlr.Device{
ID: "SDX6320031",
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
va.DeleteDevFlowForDevice(tt.args.cntx, tt.args.device)
}
})
}
}
func TestVoltApplication_DelVnetFromPort(t *testing.T) {
macAdd, _ := net.ParseMAC("ff:ff:ff:ff:ff:ff")
vpv_test := []*VoltPortVnet{
{
Device: test_device,
Port: "test_port",
MacAddr: macAdd,
VnetName: "test_vnet_name",
},
}
type args struct {
cntx context.Context
port string
vpv *VoltPortVnet
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_DelVnetFromPort",
args: args{
cntx: context.Background(),
port: "test_port",
vpv: &VoltPortVnet{
Device: test_device,
Port: "test_port",
MacAddr: macAdd,
VnetName: "test_vnet_name",
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{}
va.VnetsByPort.Store("test_port", vpv_test)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
dbintf.EXPECT().DelVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
va.VnetsByName.Store("test_vnet_name", &VoltVnet{
Version: "test_version",
})
va.DelVnetFromPort(tt.args.cntx, tt.args.port, tt.args.vpv)
})
}
}
func TestVoltApplication_PushDevFlowForVlan(t *testing.T) {
type args struct {
cntx context.Context
vnet *VoltVnet
}
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777472",
FlowDelEventMap: util.NewConcurrentMap(),
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
icmpv6GroupAdded: true,
VlanPortStatus: sync.Map{},
}
voltVnet := &VoltVnet{
Version: "v3",
VnetConfig: VnetConfig{
Name: "2310-4096-4096",
VnetType: "Encapsulation",
DevicesList: []string{"SDX6320031"},
SVlan: 0,
},
VnetOper: VnetOper{
PendingDeviceToDelete: "SDX6320031",
DeleteInProgress: true,
PendingDeleteFlow: make(map[string]map[string]bool),
},
}
voltPort := &VoltPort{
Name: "16777216",
Device: "SDX6320031",
ID: 16777216,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_PushDevFlowForVlan",
args: args{
cntx: context.Background(),
vnet: &VoltVnet{
Version: "test_version",
VnetConfig: VnetConfig{
DevicesList: []string{"test_serialNum"},
SVlan: of.VlanAny,
},
},
},
},
// {
// name: "PushDevFlowForVlan",
// args: args{
// cntx: context.Background(),
// vnet: voltVnet,
// },
// },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{}
switch tt.name {
case "VoltApplication_PushDevFlowForVlan":
voltDevice.SerialNum = "test_serialNum"
voltDevice.VlanPortStatus.Store(uint16(of.VlanAny), true)
voltDevice.Name = test_device
va.DevicesDisc.Store(test_device, voltDevice)
va.PortsDisc.Store("16777216", voltPort)
ga := GetApplication()
ga.DevicesDisc.Store(test_device, voltDevice)
_ = cntlr.NewController(context.Background(), mocks.NewMockApp(gomock.NewController(t)))
va.PushDevFlowForVlan(tt.args.cntx, tt.args.vnet)
case "PushDevFlowForVlan":
va.DevicesDisc.Store("SDX6320031", voltDev)
voltDevice.VlanPortStatus.Store(uint16(0), true)
va.VnetsByName.Store("2310-4096-4096", voltVnet)
voltDev.ConfiguredVlanForDeviceFlows.Set("0-0-0", util.NewConcurrentMap())
va.PortsDisc.Store("16777472", voltPort)
voltApp := GetApplication()
voltApp.DevicesDisc.Store("SDX6320031", voltDev)
_ = cntlr.NewController(context.Background(), mocks.NewMockApp(gomock.NewController(t)))
va.PushDevFlowForVlan(tt.args.cntx, tt.args.vnet)
}
})
}
}
func TestVoltApplication_PushDevFlowForDevice(t *testing.T) {
type args struct {
cntx context.Context
device *VoltDevice
}
tests := []struct {
name string
args args
}{
{
name: "device.ConfiguredVlanForDeviceFlows is ok",
args: args{
cntx: context.Background(),
device: &VoltDevice{
Name: test_device,
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
},
},
},
{
name: "device.VlanPortStatus is false",
args: args{
cntx: context.Background(),
device: &VoltDevice{
Name: test_device,
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
NniPort: "test_nni_port",
},
},
},
{
name: "device.VlanPortStatus is true",
args: args{
cntx: context.Background(),
device: &VoltDevice{
Name: test_device,
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
NniPort: "test_nni_port",
VlanPortStatus: sync.Map{},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{}
switch tt.name {
case "device.ConfiguredVlanForDeviceFlows is ok":
va.VnetsByName.Store("test_vnet_name", &VoltVnet{
Version: "test_version",
})
tt.args.device.ConfiguredVlanForDeviceFlows.Set("0-0-0", util.NewConcurrentMap())
va.PushDevFlowForDevice(tt.args.cntx, tt.args.device)
case "device.VlanPortStatus is false":
va.VnetsByName.Store("test_vnet_name", &VoltVnet{
Version: "test_version",
})
va.PortsDisc.Store("test_nni_port", &VoltPort{
Name: "test_name",
})
va.PushDevFlowForDevice(tt.args.cntx, tt.args.device)
case "device.VlanPortStatus is true":
va.VnetsByName.Store("test_vnet_name", &VoltVnet{
Version: "test_version",
VnetConfig: VnetConfig{
SVlan: of.VlanAny,
},
})
va.PortsDisc.Store("test_nni_port", &VoltPort{
Name: "test_name",
})
tt.args.device.VlanPortStatus.Store(uint16(of.VlanAny), true)
va.PushDevFlowForDevice(tt.args.cntx, tt.args.device)
}
})
}
}
func TestNewVoltPortVnet(t *testing.T) {
type args struct {
vnet *VoltVnet
}
usDhcpPbit := []of.PbitType{}
usDhcpPbit = append(usDhcpPbit, PbitMatchNone)
tests := []struct {
name string
args args
want *VoltPortVnet
}{
{
name: "NewVoltPortVnet",
args: args{
vnet: &VoltVnet{
VnetConfig: VnetConfig{
UsDhcpPbit: usDhcpPbit,
},
},
},
want: &VoltPortVnet{},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := NewVoltPortVnet(tt.args.vnet)
assert.NotNil(t, got)
})
}
}
func TestVoltPortVnet_GetCircuitID(t *testing.T) {
vpv := &VoltPortVnet{}
got := vpv.GetCircuitID()
assert.Nil(t, got)
got1 := vpv.GetRemoteID()
assert.Nil(t, got1)
got3 := vpv.GetDhcpState()
assert.NotNil(t, got3)
got4 := vpv.GetPppoeIaState()
assert.NotNil(t, got4)
got5 := vpv.GetDhcpv6State()
assert.NotNil(t, got5)
}
func TestVoltPortVnet_GetNniVlans(t *testing.T) {
tests := []struct {
name string
want uint16
want1 uint16
}{
{
name: "GetNniVlans",
want: uint16(of.VlanAny),
want1: uint16(of.VlanAny),
},
{
name: "GetNniVlans_OLTSVlan",
want: uint16(of.VlanAny),
want1: uint16(of.VlanNone),
},
{
name: "GetNniVlans_Default",
want: uint16(of.VlanNone),
want1: uint16(of.VlanNone),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
VlanControl: ONUCVlanOLTSVlan,
SVlan: of.VlanAny,
CVlan: of.VlanAny,
}
switch tt.name {
case "GetNniVlans":
got, got1 := vpv.GetNniVlans()
if got != tt.want {
t.Errorf("VoltPortVnet.GetNniVlans() got = %v, want %v", got, tt.want)
}
if got1 != tt.want1 {
t.Errorf("VoltPortVnet.GetNniVlans() got1 = %v, want %v", got1, tt.want1)
}
case "GetNniVlans_OLTSVlan":
vpv.VlanControl = OLTSVlan
got, got1 := vpv.GetNniVlans()
if got != tt.want {
t.Errorf("VoltPortVnet.GetNniVlans() got = %v, want %v", got, tt.want)
}
if got1 != tt.want1 {
t.Errorf("VoltPortVnet.GetNniVlans() got1 = %v, want %v", got1, tt.want1)
}
case "GetNniVlans_Default":
vpv.VlanControl = opt82
got, got1 := vpv.GetNniVlans()
if got != tt.want {
t.Errorf("VoltPortVnet.GetNniVlans() got = %v, want %v", got, tt.want)
}
if got1 != tt.want1 {
t.Errorf("VoltPortVnet.GetNniVlans() got1 = %v, want %v", got1, tt.want1)
}
}
})
}
}
func TestVoltPortVnet_GetService(t *testing.T) {
type args struct {
name string
}
voltServ := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: "SDX6320031",
},
VoltServiceCfg: VoltServiceCfg{
IsActivated: true,
},
}
tests := []struct {
name string
args args
want *VoltService
want1 bool
}{
{
name: "GetService",
args: args{
name: "SDX6320031-1_SDX6320031-1-4096-2310-4096-65",
},
want: voltServ,
want1: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
vpv.services.Store("SDX6320031-1_SDX6320031-1-4096-2310-4096-65", voltServ)
got, got1 := vpv.GetService(tt.args.name)
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltPortVnet.GetService() got = %v, want %v", got, tt.want)
}
if got1 != tt.want1 {
t.Errorf("VoltPortVnet.GetService() got1 = %v, want %v", got1, tt.want1)
}
})
}
}
func TestVoltPortVnet_ProcessDhcpSuccess(t *testing.T) {
type args struct {
cntx context.Context
res *layers.DHCPv4
}
tests := []struct {
name string
args args
}{
{
name: "ProcessDhcpSuccess",
args: args{
cntx: context.Background(),
res: &layers.DHCPv4{},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
servicesCount: atomic.NewUint64(0),
}
vpv.ProcessDhcpSuccess(tt.args.cntx, tt.args.res)
})
}
}
func TestVoltPortVnet_ProcessDhcpResult(t *testing.T) {
type args struct {
cntx context.Context
res *layers.DHCPv4
}
tests := []struct {
name string
args args
}{
{
name: "ProcessDhcpResult",
args: args{
cntx: context.Background(),
res: &layers.DHCPv4{},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
vpv.ProcessDhcpResult(tt.args.cntx, tt.args.res)
})
}
}
func TestVoltVnet_associatePortToVnet(t *testing.T) {
type args struct {
port string
}
tests := []struct {
name string
args args
}{
{
name: "ProcessDhcpResult",
args: args{
port: "SDX6320031-1",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vv := &VoltVnet{}
vv.associatePortToVnet(tt.args.port)
})
}
}
func TestVoltPortVnet_ProcessDhcpv6Result(t *testing.T) {
type args struct {
cntx context.Context
ipv6Addr net.IP
leaseTime uint32
}
tests := []struct {
name string
args args
}{
{
name: "ProcessDhcpResult",
args: args{
cntx: context.Background(),
ipv6Addr: AllSystemsMulticastGroupIP,
leaseTime: uint32(128),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
vpv.ProcessDhcpv6Result(tt.args.cntx, tt.args.ipv6Addr, tt.args.leaseTime)
})
}
}
func TestAddSvcUsMeterToDevice(t *testing.T) {
type args struct {
cntx context.Context
key interface{}
value interface{}
flag bool
}
vpv := &VoltApplication{}
voltServ := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
ForceDelete: true,
},
}
vpv.ServiceByName.Store(test_device, voltServ)
tests := []struct {
name string
args args
want bool
}{
{
name: "ProcessDhcpResult",
args: args{
cntx: context.Background(),
key: test_device,
value: voltServ,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := AddSvcUsMeterToDevice(tt.args.cntx, tt.args.key, tt.args.value, tt.args.flag); got != tt.want {
t.Errorf("AddSvcUsMeterToDevice() = %v, want %v", got, tt.want)
}
})
}
}
func TestClearFlagsInService(t *testing.T) {
type args struct {
cntx context.Context
key interface{}
value interface{}
flag bool
}
vpv := &VoltPortVnet{}
voltServ := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: "SDX6320031",
},
VoltServiceCfg: VoltServiceCfg{
IsActivated: true,
},
}
vpv.services.Store("SDX6320031-1_SDX6320031-1-4096-2310-4096-65", voltServ)
tests := []struct {
name string
args args
want bool
}{
{
name: "ClearFlagsInService",
args: args{
cntx: context.Background(),
key: test_device,
value: voltServ,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
got := ClearFlagsInService(tt.args.cntx, tt.args.key, tt.args.value, tt.args.flag)
assert.NotNil(t, got)
})
}
}
func TestVoltPortVnet_DelDhcpFlows(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "DelDhcpFlows",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
vpv.DelDhcpFlows(tt.args.cntx)
})
}
}
func TestVoltPortVnet_PushFlowsForPortVnet(t *testing.T) {
type args struct {
cntx context.Context
d *VoltDevice
}
va := GetApplication()
voltDev := &VoltDevice{
Name: "49686e2d-618f-4e8e-bca0-442ab850a63a",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
FlowAddEventMap: util.NewConcurrentMap(),
Ports: sync.Map{},
}
va.DevicesDisc.Store("SDX6320031", voltDev)
voltPort := &VoltPort{
Name: "49686e2d-618f-4e8e-bca0-442ab850a63a",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
Type: VoltPortTypeNni,
}
voltDev.Ports.Store("16777472", voltPort)
tests := []struct {
name string
args args
}{
{
name: "PushFlowsForPortVnet",
args: args{
cntx: context.Background(),
d: voltDev,
},
},
{
name: "PushFlowsForPortVnet_PortDown",
args: args{
cntx: context.Background(),
d: voltDev,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{}
switch tt.name {
case "PushFlowsForPortVnet_PortDown":
vpv.PushFlowsForPortVnet(tt.args.cntx, tt.args.d)
case "PushFlowsForPortVnet":
vpv.Port = "16777472"
vpv.PushFlowsForPortVnet(tt.args.cntx, tt.args.d)
}
})
}
}
func TestVoltPortVnet_setLearntMAC(t *testing.T) {
type args struct {
cntx context.Context
key interface{}
value interface{}
flag bool
}
voltServ := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
ForceDelete: true,
},
}
tests := []struct {
name string
args args
want bool
}{
{
name: "setLearntMAC",
args: args{
cntx: context.Background(),
key: test_device,
value: voltServ,
},
want: true,
},
{
name: "updateIPv4AndProvisionFlows",
args: args{
cntx: context.Background(),
key: test_device,
value: voltServ,
},
want: true,
},
{
name: "updateIPv6AndProvisionFlows",
args: args{
cntx: context.Background(),
key: test_device,
value: voltServ,
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
MacAddr: net.HardwareAddr(pendingPoolTimer),
Ipv4Addr: AllSystemsMulticastGroupIP,
Ipv6Addr: AllSystemsMulticastGroupIP,
}
vpv.services.Store(test_device, voltServ)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
switch tt.name {
case "setLearntMAC":
if got := vpv.setLearntMAC(tt.args.cntx, tt.args.key, tt.args.value, tt.args.flag); got != tt.want {
t.Errorf("VoltPortVnet.setLearntMAC() = %v, want %v", got, tt.want)
}
case "updateIPv4AndProvisionFlows":
if got := vpv.updateIPv4AndProvisionFlows(tt.args.cntx, tt.args.key, tt.args.value, tt.args.flag); got != tt.want {
t.Errorf("VoltPortVnet.updateIPv4AndProvisionFlows() = %v, want %v", got, tt.want)
}
case "updateIPv6AndProvisionFlows":
if got := vpv.updateIPv6AndProvisionFlows(tt.args.cntx, tt.args.key, tt.args.value, tt.args.flag); got != tt.want {
t.Errorf("VoltPortVnet.updateIPv6AndProvisionFlows() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestAddMeterToDevice(t *testing.T) {
type args struct {
cntx context.Context
key interface{}
value interface{}
flag bool
}
voltServ := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
ForceDelete: true,
},
}
tests := []struct {
name string
args args
want bool
}{
{
name: "TestAddMeterToDevice",
args: args{
cntx: context.Background(),
key: test_device,
value: voltServ,
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := AddMeterToDevice(tt.args.cntx, tt.args.key, tt.args.value, tt.args.flag); got != tt.want {
t.Errorf("AddMeterToDevice() = %v, want %v", got, tt.want)
}
})
}
}
func TestVoltPortVnet_AddUsArpFlows(t *testing.T) {
type args struct {
cntx context.Context
}
va := GetApplication()
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
FlowAddEventMap: util.NewConcurrentMap(),
Ports: sync.Map{},
}
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "AddUsArpFlows",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
{
name: "AddUsArpFlows_DeviceNotFound",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
{
name: "AddUsArpFlows_DeviceStateDOWN",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
Device: deviceName,
MacLearning: MacLearningNone,
MacAddr: BroadcastMAC,
Port: "16777472",
}
va.DevicesDisc.Store(deviceName, voltDev)
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
}
device := &cntlr.Device{
ID: deviceName,
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
switch tt.name {
case "AddUsArpFlows":
if err := vpv.AddUsArpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsArpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddUsArpFlows_DeviceNotFound":
vpv.Device = ""
if err := vpv.AddUsArpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsArpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddUsArpFlows_DeviceStateDOWN":
vpv.Device = deviceName
voltDev.State = cntlr.DeviceStateDOWN
if err := vpv.AddUsArpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsArpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
}
})
}
}
func TestVoltPortVnet_AddDsDhcpFlows(t *testing.T) {
type args struct {
cntx context.Context
}
va := GetApplication()
voltDev := &VoltDevice{
Name: "49686e2d-618f-4e8e-bca0-442ab850a63a",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
FlowAddEventMap: util.NewConcurrentMap(),
}
va.DevicesDisc.Store("SDX6320031", voltDev)
voltPort := &VoltPort{
Name: "49686e2d-618f-4e8e-bca0-442ab850a63a",
Device: "SDX6320031",
ID: 16777472,
State: PortStateDown,
ChannelPerSubAlarmRaised: false,
Type: VoltPortTypeNni,
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "AddDsDhcpFlows",
args: args{
cntx: context.Background(),
},
},
{
name: "AddDsDhcpFlows_DeviceNotFound",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
{
name: "AddDsDhcpFlows_StateDown",
args: args{
cntx: context.Background(),
},
},
{
name: "AddDsDhcpFlows_GlobalDhcpFlowAdded",
args: args{
cntx: context.Background(),
},
},
{
name: "AddDsDhcpFlows_PositiveSenario",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
Device: "SDX6320031",
}
switch tt.name {
case "AddDsDhcpFlows":
if err := vpv.AddDsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddDsDhcpFlows_DeviceNotFound":
vpv.Device = ""
if err := vpv.AddDsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddDsDhcpFlows_StateDown":
voltDev.State = cntlr.DeviceStateDOWN
if err := vpv.AddDsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddDsDhcpFlows_GlobalDhcpFlowAdded":
vpv.Device = deviceName
voltDev.State = cntlr.DeviceStateUP
voltDev.GlobalDhcpFlowAdded = true
if err := vpv.AddDsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddDsDhcpFlows_PositiveSenario":
vpv.Device = deviceName
voltDev.State = cntlr.DeviceStateUP
voltDev.GlobalDhcpFlowAdded = false
voltDev.NniPort = "16777472"
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
device := &cntlr.Device{
ID: "SDX6320031",
}
dev := map[string]*cntlr.Device{}
dev["SDX6320031"] = device
vc.Devices = dev
if err := vpv.AddDsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
}
})
}
}
func TestVoltPortVnet_AddUsDhcpFlows(t *testing.T) {
type args struct {
cntx context.Context
}
va := GetApplication()
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777472",
FlowAddEventMap: util.NewConcurrentMap(),
}
va.DevicesDisc.Store("SDX6320031", voltDev)
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateDown,
ChannelPerSubAlarmRaised: false,
Type: VoltPortTypeNni,
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "AddUsDhcpFlows_PositiveSenario",
args: args{
cntx: context.Background(),
},
},
{
name: "AddUsDhcpFlows_StateDown",
args: args{
cntx: context.Background(),
},
},
{
name: "AddUsDhcpFlows_DeviceNotFound",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
{
name: "AddUsDhcpFlows_GlobalDhcpFlowAdded",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
Device: "SDX6320031",
VnetType: DpuMgmtTraffic,
Port: "16777472",
}
switch tt.name {
case "AddUsDhcpFlows_PositiveSenario":
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
device := &cntlr.Device{
ID: "SDX6320031",
}
dev := map[string]*cntlr.Device{}
dev["SDX6320031"] = device
vc.Devices = dev
if err := vpv.AddUsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddUsDhcpFlows_DeviceNotFound":
vpv.Device = ""
if err := vpv.AddUsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddUsDhcpFlows_StateDown":
voltDev.State = cntlr.DeviceStateDOWN
if err := vpv.AddUsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddUsDhcpFlows_GlobalDhcpFlowAdded":
vpv.Device = "SDX6320031"
voltDev.State = cntlr.DeviceStateUP
vpv.Port = ""
if err := vpv.AddUsDhcpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddDsDhcpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
}
})
}
}
func TestVoltPortVnet_AddUsPppoeFlows(t *testing.T) {
type args struct {
cntx context.Context
}
va := GetApplication()
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777472",
FlowAddEventMap: util.NewConcurrentMap(),
}
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
va.DevicesDisc.Store("SDX6320031", voltDev)
va.PortsDisc.Store("16777472", voltPort)
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "AddUsPppoeFlows",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
{
name: "AddDsPppoeFlows",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
{
name: "AddUsPppoeFlows_StateDown",
args: args{
cntx: context.Background(),
},
},
{
name: "AddDsPppoeFlows_StateDown",
args: args{
cntx: context.Background(),
},
},
{
name: "AddUsPppoeFlows_DeviceNotFound",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
{
name: "AddDsPppoeFlows_DeviceNotFound",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
Device: "SDX6320031",
MacLearning: MacLearningNone,
MacAddr: net.HardwareAddr(pendingPoolTimer),
}
switch tt.name {
case "AddUsPppoeFlows":
if err := vpv.AddUsPppoeFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsPppoeFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddDsPppoeFlows":
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
}
device := &cntlr.Device{
ID: "SDX6320031",
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
if err := vpv.AddDsPppoeFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsPppoeFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddUsPppoeFlows_StateDown":
voltDev.State = cntlr.DeviceStateDOWN
if err := vpv.AddUsPppoeFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsPppoeFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddDsPppoeFlows_StateDown":
voltDev.State = cntlr.DeviceStateDOWN
if err := vpv.AddDsPppoeFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsPppoeFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddUsPppoeFlows_DeviceNotFound":
vpv.Device = ""
if err := vpv.AddUsPppoeFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsPppoeFlows() error = %v, wantErr %v", err, tt.wantErr)
}
case "AddDsPppoeFlows_DeviceNotFound":
vpv.Device = ""
if err := vpv.AddDsPppoeFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddUsPppoeFlows() error = %v, wantErr %v", err, tt.wantErr)
}
}
})
}
}
func TestVoltPortVnet_AddIgmpFlows(t *testing.T) {
type args struct {
cntx context.Context
}
var voltPortTest = &VoltPort{
Name: "test_name",
State: PortStateUp,
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "AddIgmpFlows",
args: args{
cntx: context.Background(),
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
MvlanProfileName: "mvlan_profile",
}
va := GetApplication()
va.PortsDisc.Store("test_port", voltPortTest)
if err := vpv.AddIgmpFlows(tt.args.cntx); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.AddIgmpFlows() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func TestVoltPortVnet_BuildUsDhcp6Flows(t *testing.T) {
voltPort := &VoltPort{
Name: "16777216",
Device: "SDX6320031",
ID: 16777216,
State: PortStateDown,
ChannelPerSubAlarmRaised: false,
Type: VoltPortTypeNni,
}
voltService := &VoltService{
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
VnetID: "test_vnet_id",
Port: "16777216",
SVlan: of.VlanAny,
CVlan: of.VlanAny,
UniVlan: of.VlanAny,
},
}
voltDev := &VoltDevice{
Name: "49686e2d-618f-4e8e-bca0-442ab850a63a",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777216",
Ports: sync.Map{},
}
tests := []struct {
name string
want *of.VoltFlow
wantErr bool
}{
{
name: "BuildUsDhcp6Flows",
want: &of.VoltFlow{},
},
{
name: "BuildDsDhcp6Flows",
want: &of.VoltFlow{},
},
{
name: "BuildDsDhcp6Flows_DeviceNotFound",
want: &of.VoltFlow{},
wantErr: true,
},
{
name: "BuildUsDhcp6Flows_portnotfound",
want: &of.VoltFlow{},
wantErr: true,
},
{
name: "BuildDsDhcp6Flows_portnotfound",
want: &of.VoltFlow{},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
Port: "16777216",
services: sync.Map{},
AllowTransparent: true,
Device: "SDX6320031",
}
va := GetApplication()
va.PortsDisc.Store("16777216", voltPort)
vpv.services.Store("SDX6320031-1_SDX6320031-1-4096-2310-4096-65", voltService)
switch tt.name {
case "BuildUsDhcp6Flows":
got, err := vpv.BuildUsDhcp6Flows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildUsDhcp6Flows() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.NotNil(t, got)
case "BuildDsDhcp6Flows":
va.DevicesDisc.Store("SDX6320031", voltDev)
got, err := vpv.BuildDsDhcp6Flows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildDsDhcp6Flows() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.NotNil(t, got)
case "BuildDsDhcp6Flows_DeviceNotFound":
vpv.Device = ""
got, err := vpv.BuildDsDhcp6Flows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildDsDhcp6Flows() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.Nil(t, got)
case "BuildUsDhcp6Flows_portnotfound":
vpv.Port = ""
got, err := vpv.BuildUsDhcp6Flows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildUsDhcp6Flows_portnotfound() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.Nil(t, got)
case "BuildDsDhcp6Flows_portnotfound":
voltDev.NniPort = "abc"
got, err := vpv.BuildDsDhcp6Flows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildDsDhcp6Flows_portnotfound() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.Nil(t, got)
}
})
}
}
func TestVoltPortVnet_setUsMatchVlan(t *testing.T) {
type args struct {
flow *of.VoltSubFlow
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "setUsMatchVlan",
args: args{
flow: &of.VoltSubFlow{},
},
},
{
name: "OLTCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{},
},
},
{
name: "ONUCVlan",
args: args{
flow: &of.VoltSubFlow{},
},
},
{
name: "OLTSVlan",
args: args{
flow: &of.VoltSubFlow{},
},
},
{
name: "Default",
args: args{
flow: &of.VoltSubFlow{},
},
wantErr: true,
},
{
name: "setDsMatchVlan_OLTCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{},
},
},
{
name: "setDsMatchVlan_Default",
args: args{
flow: &of.VoltSubFlow{},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
VlanControl: ONUCVlanOLTSVlan,
}
switch tt.name {
case "setUsMatchVlan":
if err := vpv.setUsMatchVlan(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.setUsMatchVlan() error = %v, wantErr %v", err, tt.wantErr)
}
case "OLTCVlanOLTSVlan":
vpv.VlanControl = OLTCVlanOLTSVlan
if err := vpv.setUsMatchVlan(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.setUsMatchVlan() error = %v, wantErr %v", err, tt.wantErr)
}
case "ONUCVlan":
vpv.VlanControl = ONUCVlan
if err := vpv.setUsMatchVlan(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.setUsMatchVlan() error = %v, wantErr %v", err, tt.wantErr)
}
case "OLTSVlan":
vpv.VlanControl = OLTSVlan
if err := vpv.setUsMatchVlan(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.setUsMatchVlan() error = %v, wantErr %v", err, tt.wantErr)
}
case "Default":
vpv.VlanControl = opt82
if err := vpv.setUsMatchVlan(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.setUsMatchVlan() error = %v, wantErr %v", err, tt.wantErr)
}
case "setDsMatchVlan_OLTCVlanOLTSVlan":
vpv.VlanControl = OLTCVlanOLTSVlan
vpv.setDsMatchVlan(tt.args.flow)
case "setDsMatchVlan_Default":
vpv.VlanControl = opt82
vpv.setDsMatchVlan(tt.args.flow)
}
})
}
}
func TestVoltPortVnet_BuildIgmpFlows(t *testing.T) {
va := GetApplication()
devicesList := make(map[string]OperInProgress)
devicesList["SDX6320030"] = opt82
mvp := &MvlanProfile{
Name: "mvlan_test",
DevicesList: devicesList,
}
va.MvlanProfilesByName.Store("mvlan_test", mvp)
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
va.PortsDisc.Store("16777472", voltPort)
tests := []struct {
name string
want *of.VoltFlow
wantErr bool
}{
{
name: "BuildIgmpFlows",
want: &of.VoltFlow{},
},
{
name: "BuildIgmpFlows_McastService_False",
want: &of.VoltFlow{},
},
{
name: "BuildIgmpFlows_PortNotFound",
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
Port: "16777472",
MvlanProfileName: "mvlan_test",
MacLearning: MacLearningNone,
MacAddr: util.Uint32ToByte(uint32(23)),
McastService: true,
AllowTransparent: true,
}
switch tt.name {
case "BuildIgmpFlows":
got, err := vpv.BuildIgmpFlows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildIgmpFlows() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.NotNil(t, got)
case "BuildIgmpFlows_McastService_False":
vpv.McastService = false
vpv.services.Store("16777472", &VoltService{})
got, err := vpv.BuildIgmpFlows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildIgmpFlows() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.NotNil(t, got)
case "BuildIgmpFlows_PortNotFound":
vpv.Port = ""
got, err := vpv.BuildIgmpFlows()
if (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.BuildIgmpFlows() error = %v, wantErr %v", err, tt.wantErr)
return
}
assert.Nil(t, got)
}
})
}
}
func TestVoltPortVnet_SetMacAddr(t *testing.T) {
type args struct {
cntx context.Context
addr net.HardwareAddr
}
addr, _ := net.ParseMAC("00:00:11:00:00:00")
macAddr, _ := net.ParseMAC("00:00:00:00:00:11")
tests := []struct {
name string
args args
}{
{
name: "SetMacAddr",
args: args{
cntx: context.Background(),
addr: addr,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
MacAddr: macAddr,
MacLearning: MaxLenDhcpv6DUID,
FlowsApplied: true,
}
switch tt.name {
case "SetMacAddr":
vpv.SetMacAddr(tt.args.cntx, tt.args.addr)
}
})
}
}
func TestVoltPortVnet_AddTrapFlows(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "AddTrapFlows",
args: args{
cntx: context.Background(),
},
},
{
name: "AddTrapFlows_ArpRelay",
args: args{
cntx: context.Background(),
},
},
{
name: "AddTrapFlows_PppoeIa",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
DhcpRelay: true,
DeleteInProgress: true,
}
switch tt.name {
case "AddTrapFlows":
vpv.AddTrapFlows(tt.args.cntx)
case "AddTrapFlows_ArpRelay":
vpv.DhcpRelay = false
vpv.ArpRelay = true
vpv.AddTrapFlows(tt.args.cntx)
case "AddTrapFlows_PppoeIa":
vpv.DhcpRelay = false
vpv.ArpRelay = false
vpv.PppoeIa = true
vpv.AddTrapFlows(tt.args.cntx)
}
})
}
}
func TestVoltPortVnet_DelTrapFlows(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "DelTrapFlows",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
FlowsApplied: true,
DhcpRelay: true,
DeleteInProgress: true,
}
switch tt.name {
case "DelTrapFlows":
vpv.DelTrapFlows(tt.args.cntx)
}
})
}
}
func TestVoltPortVnet_delDsDhcp4Flows(t *testing.T) {
type args struct {
cntx context.Context
device *VoltDevice
}
voltDev := &VoltDevice{
Name: "49686e2d-618f-4e8e-bca0-442ab850a63a",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777472",
Ports: sync.Map{},
FlowDelEventMap: util.NewConcurrentMap(),
}
va := GetApplication()
devicesList := make(map[string]OperInProgress)
devicesList["SDX6320031"] = opt82
mvp := &MvlanProfile{
Name: "mvlan_test",
DevicesList: devicesList,
}
va.MvlanProfilesByName.Store("mvlan_test", mvp)
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
va.DevicesDisc.Store("SDX6320031", voltDev)
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
controller.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
}
device := &cntlr.Device{
ID: deviceName,
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "delDsDhcp4Flows",
args: args{
cntx: context.Background(),
device: voltDev,
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vpv := &VoltPortVnet{
Device: "SDX6320031",
Port: "16777472",
MvlanProfileName: "mvlan_test",
MacLearning: MacLearningNone,
MacAddr: util.Uint32ToByte(uint32(23)),
McastService: true,
AllowTransparent: true,
PendingDeleteFlow: make(map[string]bool),
}
if err := vpv.delDsDhcp4Flows(tt.args.cntx, tt.args.device); (err != nil) != tt.wantErr {
t.Errorf("VoltPortVnet.delDsDhcp4Flows() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
func TestVoltApplication_DeleteDevFlowForVlan(t *testing.T) {
type args struct {
cntx context.Context
vnet *VoltVnet
}
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
State: cntlr.DeviceStateUP,
NniPort: "16777472",
Ports: sync.Map{},
FlowDelEventMap: util.NewConcurrentMap(),
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
}
voltVnet := &VoltVnet{
Version: "v3",
VnetConfig: VnetConfig{
Name: "2310-4096-4096",
VnetType: "Encapsulation",
},
VnetOper: VnetOper{
PendingDeviceToDelete: "SDX6320031",
DeleteInProgress: true,
PendingDeleteFlow: make(map[string]map[string]bool),
},
}
voltPort := &VoltPort{
Name: "16777472",
Device: "SDX6320031",
ID: 16777472,
State: PortStateUp,
ChannelPerSubAlarmRaised: false,
}
tests := []struct {
name string
args args
}{
{
name: "DeleteDevFlowForVlan",
args: args{
cntx: context.Background(),
vnet: voltVnet,
},
},
{
name: "DeleteDevFlowForVlan_PortStateDown",
args: args{
cntx: context.Background(),
vnet: voltVnet,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{}
switch tt.name {
case "DeleteDevFlowForVlan":
va.DevicesDisc.Store("SDX6320031", voltDev)
va.VnetsByName.Store("2310-4096-4096", voltVnet)
voltDev.ConfiguredVlanForDeviceFlows.Set("0-0-0", util.NewConcurrentMap())
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
State: cntlr.PortStateUp,
}
device := &cntlr.Device{
ID: "SDX6320031",
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
va.DeleteDevFlowForVlan(tt.args.cntx, tt.args.vnet)
case "DeleteDevFlowForVlan_PortStateDown":
voltDev.Name = ""
va.DevicesDisc.Store("SDX6320031", voltDev)
va.VnetsByName.Store("2310-4096-4096", voltVnet)
voltDev.ConfiguredVlanForDeviceFlows.Set("0-0-0", util.NewConcurrentMap())
va.PortsDisc.Store("16777472", voltPort)
appMock := mocks.NewMockApp(gomock.NewController(t))
cntlr.NewController(ctx, appMock)
vc := cntlr.GetController()
dev := map[string]*cntlr.Device{}
portsByName := map[string]*cntlr.DevicePort{}
portsByName["16777472"] = &cntlr.DevicePort{
Name: "16777472",
ID: 256,
State: cntlr.PortStateUp,
}
device := &cntlr.Device{
ID: "SDX6320031",
PortsByName: portsByName,
}
dev["SDX6320031"] = device
vc.Devices = dev
va.DeleteDevFlowForVlan(tt.args.cntx, tt.args.vnet)
}
})
}
}