| /* |
| * 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) |
| } |
| }) |
| } |
| } |