blob: 746666ab6a280e489fbce724bf7ce0914fe2f42e [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"
"errors"
"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"
)
var test_device = "test_device"
var voltPort = &VoltPort{
Name: "test_name",
Device: test_device,
}
var voltDevice = &VoltDevice{
Name: "test_name",
State: controller.DeviceStateUP,
FlowAddEventMap: util.NewConcurrentMap(),
FlowDelEventMap: util.NewConcurrentMap(),
SerialNum: "test_serial_number",
ConfiguredVlanForDeviceFlows: util.NewConcurrentMap(),
NniPort: "16777216",
}
var voltMeter = &VoltMeter{
Name: "test_volt_meter",
Version: "test_version",
AssociatedServices: 3,
}
var voltVnet = &VoltVnet{
Version: "test_version",
VnetConfig: VnetConfig{
Name: "test_name",
},
}
var voltPortVnet1 = []*VoltPortVnet{
{
Device: "4096-4096-4096",
SVlan: of.VlanAny,
CVlan: of.VlanAny,
UniVlan: of.VlanAny,
IgmpEnabled: true,
servicesCount: &atomic.Uint64{},
},
}
var voltDevice1 = &VoltDevice{
State: cntlr.DeviceStateDOWN,
}
var voltDevice2 = &VoltDevice{
Name: "test_name",
State: controller.DeviceStateUP,
FlowAddEventMap: util.NewConcurrentMap(),
FlowDelEventMap: util.NewConcurrentMap(),
SerialNum: "test_serial_number",
MigratingServices: util.NewConcurrentMap(),
}
var voltService2 = &VoltService{
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
VnetID: "test_vnet_id",
Port: "test_port",
SVlan: of.VlanAny,
CVlan: of.VlanAny,
UniVlan: of.VlanAny,
},
}
var GetDeviceFromPort_error = "GetDeviceFromPort_error"
func TestVoltApplication_RestoreSvcsFromDb(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_RestoreSvcsFromDb",
args: args{
cntx: context.Background(),
},
},
{
name: "invalid_value_type",
args: args{
cntx: context.Background(),
},
},
{
name: "unmarshal_error",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
voltService4 := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: "SDX6320031",
ForceDelete: true,
DeleteInProgress: true,
},
VoltServiceCfg: VoltServiceCfg{
Name: "test_service_name",
},
}
va := &VoltApplication{
ServicesToDelete: sync.Map{},
}
va.ServicesToDelete.Store(voltService4.VoltServiceCfg.Name, true)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
switch tt.name {
case "VoltApplication_RestoreSvcsFromDb":
b, err := json.Marshal(voltService4)
if err != nil {
panic(err)
}
kvPair := map[string]*kvstore.KVPair{}
kvPair["key"] = &kvstore.KVPair{
Key: "test_key",
Value: b,
Version: 1,
}
dbintf.EXPECT().GetServices(tt.args.cntx).Return(kvPair, nil).Times(1)
va.RestoreSvcsFromDb(tt.args.cntx)
case "invalid_value_type":
kvPair := map[string]*kvstore.KVPair{}
kvPair["key"] = &kvstore.KVPair{
Key: "test_key",
Value: invalid_value,
Version: 1,
}
dbintf.EXPECT().GetServices(tt.args.cntx).Return(kvPair, nil).Times(1)
va.RestoreSvcsFromDb(tt.args.cntx)
case "unmarshal_error":
b, err := json.Marshal("test")
if err != nil {
panic(err)
}
kvPair := map[string]*kvstore.KVPair{}
kvPair["key"] = &kvstore.KVPair{
Key: "test_key",
Value: b,
Version: 1,
}
dbintf.EXPECT().GetServices(tt.args.cntx).Return(kvPair, nil).Times(1)
va.RestoreSvcsFromDb(tt.args.cntx)
}
})
}
}
func TestVoltService_FlowRemoveFailure(t *testing.T) {
type args struct {
cntx context.Context
cookie string
errorCode uint32
errReason string
}
tests := []struct {
name string
args args
}{
{
name: "VoltService_FlowRemoveFailure",
args: args{
cntx: context.Background(),
cookie: "test_cookie",
errorCode: 200,
errReason: "test_reason",
},
},
{
name: "cookie_not_found",
args: args{
cntx: context.Background(),
cookie: "test_cookie",
errorCode: 200,
errReason: "test_reason",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "VoltService_FlowRemoveFailure":
associatedFlows := map[string]bool{}
associatedFlows["test_cookie"] = true
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
AssociatedFlows: associatedFlows,
},
VoltServiceCfg: VoltServiceCfg{},
}
vs.FlowRemoveFailure(tt.args.cntx, tt.args.cookie, tt.args.errorCode, tt.args.errReason)
case "cookie_not_found":
associatedFlows := map[string]bool{}
associatedFlows["cookie"] = true
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
AssociatedFlows: associatedFlows,
},
VoltServiceCfg: VoltServiceCfg{},
}
vs.FlowRemoveFailure(tt.args.cntx, tt.args.cookie, tt.args.errorCode, tt.args.errReason)
}
})
}
}
func TestVoltApplication_GetServiceNameFromCookie(t *testing.T) {
type args struct {
cookie uint64
portName string
pbit uint8
device string
tableMetadata uint64
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_GetServiceNameFromCookie",
args: args{
cookie: uint64(1),
portName: "test_port_name",
device: "SDX6320031",
pbit: 2,
tableMetadata: uint64(2),
},
},
}
voltDev := &VoltDevice{
Name: "SDX6320031",
SerialNum: "SDX6320031",
NniDhcpTrapVid: 123,
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ga := GetApplication()
ga.DevicesDisc.Store("SDX6320031", voltDev)
voltPortVnets := make([]*VoltPortVnet, 0)
voltPortVnet := &VoltPortVnet{
Device: test_device,
VlanControl: ONUCVlanOLTSVlan,
}
voltPortVnets = append(voltPortVnets, voltPortVnet)
ga.VnetsByPort.Store("test_port_name", voltPortVnets)
got := ga.GetServiceNameFromCookie(tt.args.cookie, tt.args.portName, tt.args.pbit, tt.args.device, tt.args.tableMetadata)
assert.Nil(t, got)
})
}
}
func TestVoltService_SvcUpInd(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "VoltService_SvcUpInd",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
PendingFlows: make(map[string]bool),
},
VoltServiceCfg: VoltServiceCfg{
SVlanTpid: layers.EthernetTypeDot1Q,
MacAddr: layers.EthernetBroadcast,
},
}
vs.Port = test_device
vs.Device = "device"
ga := GetApplication()
_ = cntlr.NewController(context.Background(), mocks.NewMockApp(gomock.NewController(t)))
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
ga.PortsDisc.Store(test_device, voltPort)
ga.DevicesDisc.Store(test_device, voltDevice)
vs.SvcUpInd(tt.args.cntx)
})
}
}
func TestVoltService_SvcDownInd(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "VoltService_SvcDownInd",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
UsHSIAFlowsApplied: true,
DsHSIAFlowsApplied: true,
},
VoltServiceCfg: VoltServiceCfg{
SVlanTpid: layers.EthernetTypeQinQ,
MacAddr: layers.EthernetBroadcast,
},
}
vs.Port = test_device
vs.Device = "device"
ga := GetApplication()
_ = cntlr.NewController(context.Background(), mocks.NewMockApp(gomock.NewController(t)))
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
ga.PortsDisc.Store(test_device, voltPort)
ga.DevicesDisc.Store(test_device, voltDevice)
vs.SvcDownInd(tt.args.cntx)
})
}
}
func TestVoltApplication_AddService(t *testing.T) {
type args struct {
cntx context.Context
cfg VoltServiceCfg
oper *VoltServiceOper
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_AddService",
args: args{
cntx: context.Background(),
cfg: VoltServiceCfg{
Name: "test_name",
Port: "test_port",
DsMeterProfile: "4096-4096-4096",
UsMeterProfile: "4096-4096-4096",
SVlan: of.VlanAny,
CVlan: of.VlanAny,
UniVlan: of.VlanAny,
MacLearning: Learn,
IsActivated: true,
},
oper: &VoltServiceOper{
Device: "4096-4096-4096",
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
MeterMgr: MeterMgr{
Meters: sync.Map{},
},
VnetsByPort: sync.Map{},
VnetsByTag: sync.Map{},
}
va.MeterMgr.Meters.Store("4096-4096-4096", voltMeter)
va.VnetsByTag.Store("4096-4096-4096", voltVnet)
voltPortVnet1[0].SVlan = of.VlanAny
voltPortVnet1[0].CVlan = of.VlanAny
voltPortVnet1[0].UniVlan = of.VlanAny
voltPortVnet1[0].servicesCount = atomic.NewUint64(uint64(56))
voltPortVnet1[0].MacAddr = layers.EthernetBroadcast
voltPortVnet1[0].Port = "test_port"
va.VnetsByPort.Store("test_port", voltPortVnet1)
ga := GetApplication()
voltPort1 := &VoltPort{
Name: "test_name",
Device: test_device,
}
deviceConfig := &DeviceConfig{
SerialNumber: "test_serial_number",
}
ga.PortsDisc.Store("test_port", voltPort1)
ga.DevicesDisc.Store(test_device, voltDevice)
ga.DevicesConfig.Store("test_serial_number", deviceConfig)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
dbintf.EXPECT().PutVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
err := va.AddService(tt.args.cntx, tt.args.cfg, tt.args.oper)
assert.Nil(t, err)
})
}
}
func TestVoltApplication_DelService(t *testing.T) {
type args struct {
cntx context.Context
name string
forceDelete bool
newSvc *VoltServiceCfg
serviceMigration bool
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_DelService",
args: args{
cntx: context.Background(),
name: "test_name",
forceDelete: true,
newSvc: &VoltServiceCfg{
Name: "vs_cfg_name",
Port: "test_port",
},
serviceMigration: true,
},
},
{
name: "GetMeterByID_not_nil",
args: args{
cntx: context.Background(),
name: "test_name",
forceDelete: true,
newSvc: &VoltServiceCfg{
Name: "vs_cfg_name",
Port: "test_port",
},
serviceMigration: true,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
ServiceByName: sync.Map{},
VnetsByPort: sync.Map{},
}
voltService3 := &VoltService{
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
Port: "4096-4096-4096",
SVlan: of.VlanAny,
CVlan: of.VlanAny,
UniVlan: of.VlanAny,
},
}
switch tt.name {
case "VoltApplication_DelService":
va.ServiceByName.Store(tt.args.name, voltService3)
va.VnetsByPort.Store("4096-4096-4096", voltPortVnet1)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().DelService(gomock.Any(), gomock.Any()).AnyTimes()
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
va.DelService(tt.args.cntx, tt.args.name, tt.args.forceDelete, tt.args.newSvc, tt.args.serviceMigration)
case "GetMeterByID_not_nil":
va.ServiceByName.Store(tt.args.name, voltService3)
va.VnetsByPort.Store("4096-4096-4096", voltPortVnet1)
voltService3.AggDsMeterID = uint32(1)
voltService3.DsMeterID = uint32(1)
voltService3.UsMeterID = uint32(2)
va.MeterMgr.MetersByID.Store(voltService3.AggDsMeterID, voltMeter)
va.MeterMgr.MetersByID.Store(voltService3.DsMeterID, voltMeter)
va.MeterMgr.MetersByID.Store(voltService3.UsMeterID, voltMeter)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().DelService(gomock.Any(), gomock.Any()).AnyTimes()
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
va.DelService(tt.args.cntx, tt.args.name, tt.args.forceDelete, tt.args.newSvc, tt.args.serviceMigration)
}
})
}
}
func TestVoltService_FlowInstallSuccess(t *testing.T) {
type args struct {
cntx context.Context
cookie string
bwAvailInfo of.BwAvailDetails
flowEventMap *util.ConcurrentMap
}
tests := []struct {
name string
args args
}{
{
name: "VoltService_FlowInstallSuccess",
args: args{
cntx: context.Background(),
cookie: "test_cookie",
bwAvailInfo: of.BwAvailDetails{
PrevBw: "test_prev_BW",
PresentBw: "test_present_BW",
},
flowEventMap: util.NewConcurrentMap(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pendingFlows := map[string]bool{}
pendingFlows["test_cookie"] = true
associatedFlows := map[string]bool{}
associatedFlows["test_cookie"] = true
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
PendingFlows: pendingFlows,
AssociatedFlows: associatedFlows,
DsHSIAFlowsApplied: true,
},
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
},
}
ga := GetApplication()
ga.PortsDisc.Store("test_port", voltPort)
ga.DevicesDisc.Store(test_device, voltDevice)
vs.FlowInstallSuccess(tt.args.cntx, tt.args.cookie, tt.args.bwAvailInfo)
})
}
}
func TestVoltService_AddMeterToDevice(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "VoltService_AddMeterToDevice",
args: args{
cntx: context.Background(),
},
},
{
name: GetDeviceFromPort_error,
args: args{
cntx: context.Background(),
},
},
{
name: "DeviceState_down",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "VoltService_AddMeterToDevice":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
DeleteInProgress: true,
},
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
},
}
ga := GetApplication()
ga.PortsDisc.Store("test_port", voltPort)
ga.DevicesDisc.Store(test_device, voltDevice)
err := vs.AddMeterToDevice(tt.args.cntx)
assert.Nil(t, err)
case GetDeviceFromPort_error:
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
DeleteInProgress: true,
},
VoltServiceCfg: VoltServiceCfg{
Port: "",
},
}
err := vs.AddMeterToDevice(tt.args.cntx)
assert.NotNil(t, err)
case "DeviceState_down":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
DeleteInProgress: true,
},
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
},
}
ga := GetApplication()
ga.PortsDisc.Store("test_port", voltPort)
ga.DevicesDisc.Store(test_device, voltDevice1)
err := vs.AddMeterToDevice(tt.args.cntx)
assert.Nil(t, err)
}
})
}
}
func TestVoltService_AddUsHsiaFlows(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "DeleteInProgress_true",
args: args{
cntx: context.Background(),
},
},
{
name: "GetDeviceFromPort_error",
args: args{
cntx: context.Background(),
},
},
{
name: "DeviceState_down",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "DeleteInProgress_true":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
DeleteInProgress: true,
},
}
err := vs.AddUsHsiaFlows(tt.args.cntx)
assert.Nil(t, err)
case "GetDeviceFromPort_error":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
DeleteInProgress: false,
},
}
err := vs.AddUsHsiaFlows(tt.args.cntx)
assert.NotNil(t, err)
case "DeviceState_down":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
DeleteInProgress: false,
},
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
},
}
ga := GetApplication()
ga.PortsDisc.Store("test_port", voltPort)
ga.DevicesDisc.Store(test_device, voltDevice1)
err := vs.AddUsHsiaFlows(tt.args.cntx)
assert.Nil(t, err)
}
})
}
}
func TestVoltService_AddHsiaFlows(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "AddUsHsiaFlows_error",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
VlanControl: 5,
},
}
ga := GetApplication()
ga.PortsDisc.Store("test_port", voltPort)
ga.DevicesDisc.Store(test_device, voltDevice)
vs.AddHsiaFlows(tt.args.cntx)
})
}
}
func TestVoltService_ForceWriteToDb(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "PutService_error",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "PutService_error":
vs := &VoltService{}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("error")).AnyTimes()
vs.ForceWriteToDb(tt.args.cntx)
}
})
}
}
func TestVoltService_isDataRateAttrPresent(t *testing.T) {
tests := []struct {
name string
want bool
}{
{
name: "VoltService_isDataRateAttrPresent",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
if got := vs.isDataRateAttrPresent(); got != tt.want {
t.Errorf("VoltService.isDataRateAttrPresent() = %v, want %v", got, tt.want)
}
})
}
}
func TestVoltService_GetServicePbit(t *testing.T) {
tests := []struct {
name string
want int
}{
{
name: "VoltService_GetServicePbit",
want: -1,
},
{
name: "!IsPbitExist",
want: 8,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "VoltService_GetServicePbit":
vs := &VoltService{
VoltServiceCfg: VoltServiceCfg{
Pbits: []of.PbitType{of.PbitMatchAll},
},
}
if got := vs.GetServicePbit(); got != tt.want {
t.Errorf("VoltService.GetServicePbit() = %v, want %v", got, tt.want)
}
case "!IsPbitExist":
vs := &VoltService{}
if got := vs.GetServicePbit(); got != tt.want {
t.Errorf("VoltService.GetServicePbit() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestVoltApplication_DeactivateService(t *testing.T) {
type args struct {
cntx context.Context
deviceID string
portNo string
sVlan of.VlanType
cVlan of.VlanType
tpID uint16
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "VoltApplication_DeactivateService",
args: args{
cntx: context.Background(),
deviceID: "test_device_id",
portNo: "test_port",
sVlan: of.VlanNone,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
{
name: "VoltPortVnet_nil",
args: args{
cntx: context.Background(),
deviceID: "test_device_id",
portNo: "test_port",
sVlan: of.VlanNone,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
{
name: "sVlan != of.VlanNone",
args: args{
cntx: context.Background(),
deviceID: "test_device_id",
portNo: "test_port",
sVlan: of.VlanAny,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
{
name: GetDeviceFromPort_error,
args: args{
cntx: context.Background(),
deviceID: "test_device_id",
portNo: "test_port",
sVlan: of.VlanNone,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
ServiceByName: sync.Map{},
VnetsByPort: sync.Map{},
DevicesDisc: sync.Map{},
PortsDisc: sync.Map{},
}
voltServiceTest := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
},
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
Name: "test_name",
IsActivated: true,
CVlan: of.VlanAny,
SVlan: of.VlanAny,
UniVlan: of.VlanAny,
},
}
switch tt.name {
case "VoltApplication_DeactivateService":
va.ServiceByName.Store("test_name", voltServiceTest)
va.PortsDisc.Store("test_port", voltPort)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
va.DevicesDisc.Store(test_device, voltDevice)
voltDevice.Ports.Store("test_port", voltPort)
va.VnetsByPort.Store("test_port", voltPortVnet1)
voltPortVnet1[0].servicesCount.Store(uint64(1))
dbintf.EXPECT().PutVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
if err := va.DeactivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID); (err != nil) != tt.wantErr {
t.Errorf("VoltApplication.DeactivateService() error = %v, wantErr %v", err, tt.wantErr)
}
case "VoltPortVnet_nil":
va.ServiceByName.Store("test_name", voltServiceTest)
va.PortsDisc.Store("test_port", voltPort)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
va.DevicesDisc.Store(test_device, voltDevice)
voltDevice.Ports.Store("test_port", voltPort)
if err := va.DeactivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID); (err != nil) != tt.wantErr {
t.Errorf("VoltApplication.DeactivateService() error = %v, wantErr %v", err, tt.wantErr)
}
case "sVlan != of.VlanNone":
va.ServiceByName.Store("test_name", voltServiceTest)
err := va.DeactivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID)
assert.Nil(t, err)
case GetDeviceFromPort_error:
va.ServiceByName.Store("test_name", voltServiceTest)
if err := va.DeactivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID); (err != nil) != tt.wantErr {
t.Errorf("VoltApplication.DeactivateService() error = %v, wantErr %v", err, tt.wantErr)
}
}
})
}
}
func TestVoltApplication_ActivateService(t *testing.T) {
type args struct {
cntx context.Context
deviceID string
portNo string
sVlan of.VlanType
cVlan of.VlanType
tpID uint16
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "VoltApplication_ActivateService",
args: args{
cntx: context.Background(),
deviceID: DeviceAny,
portNo: "test_port",
sVlan: of.VlanNone,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
{
name: "VoltPortVnet_nil",
args: args{
cntx: context.Background(),
deviceID: "test_name",
portNo: "test_port",
sVlan: of.VlanNone,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
{
name: GetDeviceFromPort_error,
args: args{
cntx: context.Background(),
deviceID: "test_name",
portNo: "test_port",
sVlan: of.VlanNone,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
{
name: "deviceID != device.Name",
args: args{
cntx: context.Background(),
deviceID: "test_name1",
portNo: "test_port",
sVlan: of.VlanNone,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
{
name: "sVlan != of.VlanNone && sVlan != vs.SVlan",
args: args{
cntx: context.Background(),
deviceID: "test_name",
portNo: "test_port",
sVlan: 1,
cVlan: of.VlanAny,
tpID: AnyVlan,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
DevicesDisc: sync.Map{},
}
var voltPortTest = &VoltPort{
Name: "test_name",
State: PortStateUp,
}
voltServiceTest := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
},
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
Name: "test_name",
IsActivated: false,
CVlan: of.VlanAny,
SVlan: of.VlanAny,
UniVlan: of.VlanAny,
},
}
switch tt.name {
case "VoltApplication_ActivateService":
voltPortTest.Device = test_device
va.PortsDisc.Store("test_port", voltPortTest)
va.DevicesDisc.Store(test_device, voltDevice)
va.ServiceByName.Store("test_name", voltServiceTest)
va.VnetsByPort.Store("test_port", voltPortVnet1)
voltDevice.Ports.Store("test_port", voltPortTest)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
if err := va.ActivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID); (err != nil) != tt.wantErr {
t.Errorf("VoltApplication.ActivateService() error = %v, wantErr %v", err, tt.wantErr)
}
case "VoltPortVnet_nil":
voltPortTest.Device = test_device
va.ServiceByName.Store("test_name", voltServiceTest)
va.PortsDisc.Store("test_port", voltPortTest)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
va.DevicesDisc.Store(test_device, voltDevice)
voltDevice.Ports.Store("test_port", voltPortTest)
if err := va.ActivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID); (err != nil) != tt.wantErr {
t.Errorf("VoltApplication.ActivateService() error = %v, wantErr %v", err, tt.wantErr)
}
case "deviceID != device.Name":
var voltPortTest1 = &VoltPort{
Name: "test_name",
State: PortStateUp,
Device: test_device,
}
var voltDevice_test = &VoltDevice{
Name: "",
State: controller.DeviceStateUP,
FlowAddEventMap: util.NewConcurrentMap(),
FlowDelEventMap: util.NewConcurrentMap(),
SerialNum: "test_serial_number",
}
va.PortsDisc.Store("test_port", voltPortTest1)
va.DevicesDisc.Store(test_device, voltDevice_test)
err := va.ActivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID)
assert.NotNil(t, err)
case "sVlan != of.VlanNone && sVlan != vs.SVlan":
voltPortTest.Device = test_device
va.PortsDisc.Store("test_port", voltPortTest)
va.DevicesDisc.Store(test_device, voltDevice)
va.ServiceByName.Store("test_name", voltServiceTest)
err := va.ActivateService(tt.args.cntx, tt.args.deviceID, tt.args.portNo, tt.args.sVlan, tt.args.cVlan, tt.args.tpID)
assert.Nil(t, err)
}
})
}
}
func TestVoltApplication_GetProgrammedSubscribers(t *testing.T) {
type args struct {
cntx context.Context
deviceID string
portNo string
}
tests := []struct {
name string
args args
want []*VoltService
wantErr bool
}{
{
name: "VoltApplication_GetProgrammedSubscribers",
args: args{
cntx: context.Background(),
deviceID: test_device,
portNo: "test_port",
},
},
{
name: "portNo_nil",
args: args{
cntx: context.Background(),
deviceID: test_device,
},
},
{
name: "deviceID_nil",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
vendorID: "test_vendor",
}
voltServiceTest := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
},
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
Port: "test_port",
Name: "test_name",
IsActivated: false,
CVlan: of.VlanAny,
SVlan: of.VlanAny,
UniVlan: of.VlanAny,
},
}
switch tt.name {
case "VoltApplication_GetProgrammedSubscribers":
va.ServiceByName.Store("test_name", voltServiceTest)
got, err := va.GetProgrammedSubscribers(tt.args.cntx, tt.args.deviceID, tt.args.portNo)
assert.NotNil(t, got)
assert.Nil(t, err)
case "portNo_nil":
va.ServiceByName.Store("test_name", voltServiceTest)
got, err := va.GetProgrammedSubscribers(tt.args.cntx, tt.args.deviceID, tt.args.portNo)
assert.NotNil(t, got)
assert.Nil(t, err)
case "deviceID_nil":
va.ServiceByName.Store("test_name", voltServiceTest)
got, err := va.GetProgrammedSubscribers(tt.args.cntx, tt.args.deviceID, tt.args.portNo)
assert.NotNil(t, got)
assert.Nil(t, err)
}
})
}
}
func TestVoltService_JSONMarshal(t *testing.T) {
tests := []struct {
name string
}{
{
name: "VoltService_JSONMarshal",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
},
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
Name: "test_name",
},
}
got, err := vs.JSONMarshal()
assert.NotNil(t, got)
assert.Nil(t, err)
})
}
}
func TestVoltService_triggerServiceInProgressInd(t *testing.T) {
tests := []struct {
name string
}{
{
name: "VoltService_triggerServiceInProgressInd",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
Version: "test_version",
}
vs.triggerServiceInProgressInd()
})
}
}
func TestVoltService_TriggerAssociatedFlowDelete(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
want bool
}{
{
name: "VoltService_TriggerAssociatedFlowDelete",
args: args{
cntx: context.Background(),
},
want: true,
},
{
name: "cookieList_nil",
args: args{
cntx: context.Background(),
},
want: false,
},
}
associatedFlows := map[string]bool{}
associatedFlows["5765317"] = true
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "VoltService_TriggerAssociatedFlowDelete":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
UsHSIAFlowsApplied: true,
DsHSIAFlowsApplied: true,
AssociatedFlows: associatedFlows,
Device: test_device,
},
}
ga := GetApplication()
ga.DevicesDisc.Store(test_device, voltDevice)
if got := vs.TriggerAssociatedFlowDelete(tt.args.cntx); got != tt.want {
t.Errorf("VoltService.TriggerAssociatedFlowDelete() = %v, want %v", got, tt.want)
}
case "cookieList_nil":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
UsHSIAFlowsApplied: true,
DsHSIAFlowsApplied: true,
Device: test_device,
},
}
ga := GetApplication()
ga.DevicesDisc.Store(test_device, voltDevice)
if got := vs.TriggerAssociatedFlowDelete(tt.args.cntx); got != tt.want {
t.Errorf("VoltService.TriggerAssociatedFlowDelete() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestVoltApplication_DeepEqualServicecfg(t *testing.T) {
type args struct {
evs *VoltServiceCfg
nvs *VoltServiceCfg
}
a := map[int]int{}
a[0] = 0
tests := []struct {
name string
args args
want bool
}{
{
name: "VoltApplication_DeepEqualServicecfg",
args: args{
evs: &VoltServiceCfg{
Port: "test_port",
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: true,
},
{
name: "nvs.Name != evs.Name",
args: args{
evs: &VoltServiceCfg{
Name: "test_name",
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.UniVlan != evs.UniVlan",
args: args{
evs: &VoltServiceCfg{
UniVlan: of.VlanAny,
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.CVlan != evs.CVlan",
args: args{
evs: &VoltServiceCfg{
CVlan: of.VlanAny,
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.SVlan != evs.SVlan",
args: args{
evs: &VoltServiceCfg{
SVlan: of.VlanAny,
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.SVlanTpid != 0",
args: args{
evs: &VoltServiceCfg{
SVlanTpid: layers.EthernetTypeARP,
},
nvs: &VoltServiceCfg{
SVlanTpid: layers.EthernetTypeCiscoDiscovery,
},
},
want: false,
},
{
name: "nvs.Pbits != evs.Pbits",
args: args{
evs: &VoltServiceCfg{
Pbits: []of.PbitType{
PbitMatchAll,
},
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.DsRemarkPbitsMap != evs.DsRemarkPbitsMap",
args: args{
evs: &VoltServiceCfg{
DsRemarkPbitsMap: a,
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.TechProfileID != evs.TechProfileID",
args: args{
evs: &VoltServiceCfg{
TechProfileID: uint16(1),
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.CircuitID != evs.CircuitID",
args: args{
evs: &VoltServiceCfg{
CircuitID: "test_circuit_id",
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.RemoteID != evs.RemoteID",
args: args{
evs: &VoltServiceCfg{
RemoteID: []byte{1},
},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.Port != evs.Port",
args: args{
evs: &VoltServiceCfg{},
nvs: &VoltServiceCfg{
Port: "test_port",
},
},
want: false,
},
{
name: "nvs.PonPort != evs.PonPort",
args: args{
evs: &VoltServiceCfg{},
nvs: &VoltServiceCfg{
PonPort: uint32(1),
},
},
want: false,
},
{
name: "evs.MacLearning == MacLearningNone",
args: args{
evs: &VoltServiceCfg{
MacAddr: layers.EthernetBroadcast,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.IgmpEnabled != evs.IgmpEnabled",
args: args{
evs: &VoltServiceCfg{
IgmpEnabled: true,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.McastService != evs.McastService",
args: args{
evs: &VoltServiceCfg{
McastService: true,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.ONTEtherTypeClassification != evs.ONTEtherTypeClassification",
args: args{
evs: &VoltServiceCfg{
ONTEtherTypeClassification: 1,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.UsMeterProfile != evs.UsMeterProfile",
args: args{
evs: &VoltServiceCfg{
UsMeterProfile: "UsMeterProfile",
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.DsMeterProfile != evs.DsMeterProfile",
args: args{
evs: &VoltServiceCfg{
DsMeterProfile: "DsMeterProfile",
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.AggDsMeterProfile != evs.AggDsMeterProfile",
args: args{
evs: &VoltServiceCfg{
AggDsMeterProfile: "AggDsMeterProfile",
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.VnetID != evs.VnetID",
args: args{
evs: &VoltServiceCfg{
VnetID: "VnetID",
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.MvlanProfileName != evs.MvlanProfileName",
args: args{
evs: &VoltServiceCfg{
MvlanProfileName: "MvlanProfileName",
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.RemoteIDType != evs.RemoteIDType",
args: args{
evs: &VoltServiceCfg{
RemoteIDType: "RemoteIDType",
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.SchedID != evs.SchedID",
args: args{
evs: &VoltServiceCfg{
SchedID: 1,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.AllowTransparent != evs.AllowTransparent",
args: args{
evs: &VoltServiceCfg{
AllowTransparent: true,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.EnableMulticastKPI != evs.EnableMulticastKPI",
args: args{
evs: &VoltServiceCfg{
EnableMulticastKPI: true,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.DataRateAttr != evs.DataRateAttr",
args: args{
evs: &VoltServiceCfg{
DataRateAttr: "DataRateAttr",
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.MinDataRateUs != evs.MinDataRateUs",
args: args{
evs: &VoltServiceCfg{
MinDataRateUs: uint32(1),
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.MinDataRateDs != evs.MinDataRateDs",
args: args{
evs: &VoltServiceCfg{
MinDataRateDs: uint32(1),
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.MaxDataRateUs != evs.MaxDataRateUs",
args: args{
evs: &VoltServiceCfg{
MaxDataRateUs: uint32(1),
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.MaxDataRateDs != evs.MaxDataRateDs",
args: args{
evs: &VoltServiceCfg{
MaxDataRateDs: uint32(1),
},
nvs: &VoltServiceCfg{},
},
want: false,
},
{
name: "nvs.IsOption82Enabled != evs.IsOption82Enabled",
args: args{
evs: &VoltServiceCfg{
IsOption82Enabled: true,
},
nvs: &VoltServiceCfg{},
},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
vendorID: "test_vendor_id",
}
switch tt.name {
case "VoltApplication_DeepEqualServicecfg", "nvs.Name != evs.Name", "nvs.UniVlan != evs.UniVlan",
"nvs.CVlan != evs.CVlan", "nvs.SVlan != evs.SVlan", "nvs.SVlanTpid != 0", "nvs.Pbits != evs.Pbits",
"nvs.DsRemarkPbitsMap != evs.DsRemarkPbitsMap", "nvs.TechProfileID != evs.TechProfileID",
"nvs.CircuitID != evs.CircuitID", "nvs.RemoteID != evs.RemoteID", "nvs.Port != evs.Port",
"evs.MacLearning == MacLearningNone", "nvs.PonPort != evs.PonPort", "nvs.IgmpEnabled != evs.IgmpEnabled",
"nvs.McastService != evs.McastService", "nvs.ONTEtherTypeClassification != evs.ONTEtherTypeClassification",
"nvs.UsMeterProfile != evs.UsMeterProfile",
"nvs.DsMeterProfile != evs.DsMeterProfile", "nvs.AggDsMeterProfile != evs.AggDsMeterProfile",
"nvs.VnetID != evs.VnetID", "nvs.MvlanProfileName != evs.MvlanProfileName",
"nvs.RemoteIDType != evs.RemoteIDType", "nvs.SchedID != evs.SchedID",
"nvs.AllowTransparent != evs.AllowTransparent",
"nvs.EnableMulticastKPI != evs.EnableMulticastKPI", "nvs.DataRateAttr != evs.DataRateAttr",
"nvs.MinDataRateUs != evs.MinDataRateUs", "nvs.MinDataRateDs != evs.MinDataRateDs",
"nvs.MaxDataRateUs != evs.MaxDataRateUs", "nvs.MaxDataRateDs != evs.MaxDataRateDs",
"nvs.IsOption82Enabled != evs.IsOption82Enabled":
if got := va.DeepEqualServicecfg(tt.args.evs, tt.args.nvs); got != tt.want {
t.Errorf("VoltApplication.DeepEqualServicecfg() = %v, want %v", got, tt.want)
}
}
})
}
}
func Test_forceUpdateAllServices(t *testing.T) {
type args struct {
cntx context.Context
msr *MigrateServicesRequest
}
servicesList := map[string]bool{}
servicesList[test_device] = true
tests := []struct {
name string
args args
}{
{
name: "forceUpdateAllServices",
args: args{
cntx: context.Background(),
msr: &MigrateServicesRequest{
ID: "test_id",
ServicesList: servicesList,
DeviceID: test_device,
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ga := GetApplication()
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().DelMigrateServicesReq(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
ga.ServiceByName.Store(test_device, voltService2)
voltService2.VoltServiceOper.Metadata = &MigrateServiceMetadata{
NewVnetID: "test_new_vnet_id",
RequestID: "test_request_id",
}
newConcurrentMap := util.NewConcurrentMap()
ga.DevicesDisc.Store(test_device, voltDevice2)
voltDevice2.MigratingServices.Set("test_vnet_id", newConcurrentMap)
migrateServicesRequest := &MigrateServicesRequest{
ID: "test_id",
ServicesList: servicesList,
}
newConcurrentMap.Set("test_request_id", migrateServicesRequest)
dbintf.EXPECT().PutMigrateServicesReq(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
forceUpdateAllServices(tt.args.cntx, tt.args.msr)
})
}
}
func TestVoltService_updateVnetProfile(t *testing.T) {
type args struct {
cntx context.Context
deviceID string
}
tests := []struct {
name string
args args
}{
{
name: "DeleteInProgress_true",
args: args{
cntx: context.Background(),
deviceID: test_device,
},
},
{
name: "metadata_nil",
args: args{
cntx: context.Background(),
deviceID: test_device,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
switch tt.name {
case "DeleteInProgress_true":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
DeleteInProgress: true,
},
}
vs.updateVnetProfile(tt.args.cntx, tt.args.deviceID)
case "metadata_nil":
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
Metadata: &MigrateServiceMetadata{},
},
}
vs.updateVnetProfile(tt.args.cntx, tt.args.deviceID)
}
})
}
}
func TestMigrateServicesRequest_serviceMigrated(t *testing.T) {
type args struct {
cntx context.Context
serviceName string
}
tests := []struct {
name string
args args
}{
{
name: "ServicesList_nil",
args: args{
cntx: context.Background(),
serviceName: "test_service_name",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
msr := &MigrateServicesRequest{
ServicesList: map[string]bool{},
}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().DelMigrateServicesReq(gomock.All(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
msr.serviceMigrated(tt.args.cntx, tt.args.serviceName)
})
}
}
func TestVoltApplication_TriggerPendingMigrateServicesReq(t *testing.T) {
type args struct {
cntx context.Context
device string
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_TriggerPendingMigrateServicesReq",
args: args{
cntx: context.Background(),
device: test_device,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
ServiceByName: sync.Map{},
}
migrateServicesRequest := &MigrateServicesRequest{
ID: "test_id",
OldVnetID: "test_vnet_id",
DeviceID: test_device,
}
b, err := json.Marshal(migrateServicesRequest)
if err != nil {
panic(err)
}
kvpair := map[string]*kvstore.KVPair{}
kvpair["test_device_id"] = &kvstore.KVPair{
Key: "test_device_id",
Value: b,
}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
ga := GetApplication()
ga.DevicesDisc.Store(test_device, voltDevice2)
newConcurrentMap := util.NewConcurrentMap()
voltDevice2.MigratingServices.Set("test_vnet_id", newConcurrentMap)
dbintf.EXPECT().GetAllMigrateServicesReq(gomock.Any(), gomock.Any()).Return(kvpair, nil).AnyTimes()
va.TriggerPendingMigrateServicesReq(tt.args.cntx, tt.args.device)
})
}
}
func TestVoltApplication_FetchAndProcessAllMigrateServicesReq(t *testing.T) {
type args struct {
cntx context.Context
device string
msrAction func(context.Context, *MigrateServicesRequest)
}
tests := []struct {
name string
args args
}{
{
name: "invalid_value_type",
args: args{
cntx: context.Background(),
device: test_device,
msrAction: func(ctx context.Context, msr *MigrateServicesRequest) {},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
DevicesDisc: sync.Map{},
}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
kvpair := map[string]*kvstore.KVPair{}
kvpair["test_device_id"] = &kvstore.KVPair{
Key: "test_device_id",
Value: invalid_value,
}
dbintf.EXPECT().GetAllMigrateServicesReq(gomock.Any(), gomock.Any()).Return(kvpair, nil).AnyTimes()
va.FetchAndProcessAllMigrateServicesReq(tt.args.cntx, tt.args.device, tt.args.msrAction)
})
}
}
func TestVoltApplication_createMigrateServicesFromString(t *testing.T) {
type args struct {
b []byte
}
tests := []struct {
name string
args args
}{
{
name: "Unmarshal_error",
args: args{
b: []byte{},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
vendorID: test_device,
}
got := va.createMigrateServicesFromString(tt.args.b)
assert.NotNil(t, got)
})
}
}
func TestVoltApplication_getMigrateServicesRequest(t *testing.T) {
type args struct {
deviceID string
oldVnetID string
requestID string
}
tests := []struct {
name string
args args
want *MigrateServicesRequest
}{
{
name: "GetDevice_nil",
args: args{
deviceID: test_device,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
vendorID: "vendorID",
}
if got := va.getMigrateServicesRequest(tt.args.deviceID, tt.args.oldVnetID, tt.args.requestID); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.getMigrateServicesRequest() = %v, want %v", got, tt.want)
}
})
}
}
func TestVoltDevice_AddMigratingServices(t *testing.T) {
type args struct {
msr *MigrateServicesRequest
}
tests := []struct {
name string
args args
}{
{
name: "MigratingServices_Get_nil",
args: args{
msr: &MigrateServicesRequest{
ID: "test_id",
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
d := &VoltDevice{
MigratingServices: util.NewConcurrentMap(),
}
d.AddMigratingServices(tt.args.msr)
})
}
}
func TestMigrateServicesRequest_ProcessMigrateServicesProfRequest(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "ServicesList_true",
args: args{
cntx: context.Background(),
},
},
{
name: "ServicesList_false",
args: args{
cntx: context.Background(),
},
},
{
name: "GetVnetByPort_nil",
args: args{
cntx: context.Background(),
},
},
{
name: "UsHSIAFlowsApplied_true",
args: args{
cntx: context.Background(),
},
},
{
name: "ServiceByName_nil",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
switch tt.name {
case "ServicesList_true":
servicesList := map[string]bool{}
servicesList[test_device] = true
msr := &MigrateServicesRequest{
ServicesList: servicesList,
}
dbintf.EXPECT().DelMigrateServicesReq(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
msr.ProcessMigrateServicesProfRequest(tt.args.cntx)
case "ServicesList_false":
servicesList := map[string]bool{}
servicesList[test_device] = false
msr := &MigrateServicesRequest{
ServicesList: servicesList,
}
ga := GetApplication()
ga.ServiceByName.Store(test_device, voltService2)
ga.VnetsByPort.Store("test_port", voltPortVnet1)
msr.ProcessMigrateServicesProfRequest(tt.args.cntx)
case "GetVnetByPort_nil":
servicesList := map[string]bool{}
servicesList[test_device] = false
msr := &MigrateServicesRequest{
ServicesList: servicesList,
}
ga := GetApplication()
var voltService1 = &VoltService{
Version: "test_version",
VoltServiceCfg: VoltServiceCfg{
VnetID: "test_vnet_id",
SVlan: of.VlanAny,
CVlan: of.VlanAny,
UniVlan: of.VlanAny,
},
}
ga.ServiceByName.Store(test_device, voltService1)
ga.VnetsByPort.Store("test_port1", nil)
msr.ProcessMigrateServicesProfRequest(tt.args.cntx)
case "UsHSIAFlowsApplied_true":
servicesList := map[string]bool{}
servicesList[test_device] = false
msr := &MigrateServicesRequest{
ServicesList: servicesList,
}
ga := GetApplication()
voltService2.UsHSIAFlowsApplied = true
ga.ServiceByName.Store(test_device, voltService2)
ga.VnetsByPort.Store("test_port", voltPortVnet1)
dbintf.EXPECT().PutVpv(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
msr.ProcessMigrateServicesProfRequest(tt.args.cntx)
case "ServiceByName_nil":
servicesList := map[string]bool{}
servicesList[""] = false
msr := &MigrateServicesRequest{
ServicesList: servicesList,
}
msr.ProcessMigrateServicesProfRequest(tt.args.cntx)
}
})
}
}
func TestVoltApplication_MigrateServices(t *testing.T) {
type args struct {
cntx context.Context
serialNum string
reqID string
oldVnetID string
newVnetID string
serviceList []string
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "VoltApplication_MigrateServices",
args: args{
cntx: context.Background(),
serialNum: "test_serial_number",
reqID: "test_reqid",
oldVnetID: "test_old_vnet_id",
newVnetID: "test_new_vnet_id",
serviceList: []string{"test_service_list_1", "test_service_list_2"},
},
},
{
name: "Old Vnet Id not found",
args: args{
cntx: context.Background(),
serialNum: "test_serial_number",
reqID: "test_reqid",
oldVnetID: "",
newVnetID: "test_new_vnet_id",
serviceList: []string{"test_service_list_1", "test_service_list_2"},
},
},
{
name: "New Vnet Id not found",
args: args{
cntx: context.Background(),
serialNum: "test_serial_number",
reqID: "test_reqid",
oldVnetID: "test_old_vnet_id",
newVnetID: "",
serviceList: []string{"test_service_list_1", "test_service_list_2"},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
VnetsByName: sync.Map{},
}
voltVnet2 := &VoltVnet{
Version: "v3",
VnetConfig: VnetConfig{
Name: "2310-4096-4096",
VnetType: "Encapsulation",
SVlan: 2310,
CVlan: 4096,
UniVlan: 4096,
SVlanTpid: 33024,
},
VnetOper: VnetOper{
PendingDeviceToDelete: "SDX63200313",
},
}
switch tt.name {
case "VoltApplication_MigrateServices":
va.VnetsByName.Store("test_old_vnet_id", voltVnet2)
va.VnetsByName.Store("test_new_vnet_id", voltVnet2)
va.DevicesDisc.Store(test_device, voltDevice2)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutMigrateServicesReq(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
if err := va.MigrateServices(tt.args.cntx, tt.args.serialNum, tt.args.reqID, tt.args.oldVnetID, tt.args.newVnetID, tt.args.serviceList); (err != nil) != tt.wantErr {
t.Errorf("VoltApplication.MigrateServices() error = %v, wantErr %v", err, tt.wantErr)
}
case "Old Vnet Id not found":
va.VnetsByName.Store("test_old_vnet_id", voltVnet2)
err := va.MigrateServices(tt.args.cntx, tt.args.serialNum, tt.args.reqID, tt.args.oldVnetID, tt.args.newVnetID, tt.args.serviceList)
assert.NotNil(t, err)
case "New Vnet Id not found":
va.VnetsByName.Store("test_old_vnet_id", voltVnet2)
va.VnetsByName.Store("test_new_vnet_id", voltVnet2)
err := va.MigrateServices(tt.args.cntx, tt.args.serialNum, tt.args.reqID, tt.args.oldVnetID, tt.args.newVnetID, tt.args.serviceList)
assert.NotNil(t, err)
}
})
}
}
func TestMigrateServicesRequest_WriteToDB(t *testing.T) {
type args struct {
cntx context.Context
}
tests := []struct {
name string
args args
}{
{
name: "PutMigrateServicesReq_error",
args: args{
cntx: context.Background(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
msr := &MigrateServicesRequest{
ID: test_device,
}
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutMigrateServicesReq(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("error")).Times(1)
msr.WriteToDB(tt.args.cntx)
})
}
}
func TestVoltService_MatchesVlans(t *testing.T) {
type args struct {
vlans []of.VlanType
}
tests := []struct {
name string
args args
want bool
}{
{
name: "vlans_nil",
args: args{
vlans: []of.VlanType{},
},
want: false,
},
{
name: "MatchesVlans",
args: args{
vlans: []of.VlanType{
of.VlanAny,
},
},
want: true,
},
{
name: "vlans[0] != vs.CVlan",
args: args{
vlans: []of.VlanType{
of.VlanNone,
},
},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceCfg: VoltServiceCfg{CVlan: of.VlanAny},
}
switch tt.name {
case "vlans_nil", "MatchesVlans", "vlans[0] != vs.CVlan":
if got := vs.MatchesVlans(tt.args.vlans); got != tt.want {
t.Errorf("VoltService.MatchesVlans() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestVoltService_MatchesPbits(t *testing.T) {
type args struct {
pbits []of.PbitType
}
tests := []struct {
name string
args args
want bool
}{
{
name: "VoltService_MatchesPbits",
args: args{
pbits: []of.PbitType{
of.PbitMatchAll,
},
},
want: true,
},
{
name: "PbitType_nil",
args: args{
pbits: []of.PbitType{},
},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceCfg: VoltServiceCfg{
Pbits: []of.PbitType{
of.PbitMatchAll,
},
},
}
switch tt.name {
case "VoltService_MatchesPbits", "PbitType_nil":
if got := vs.MatchesPbits(tt.args.pbits); got != tt.want {
t.Errorf("VoltService.MatchesPbits() = %v, want %v", got, tt.want)
}
}
})
}
}
func TestVoltApplication_DelServiceWithPrefix(t *testing.T) {
type args struct {
cntx context.Context
prefix string
}
tests := []struct {
name string
args args
}{
{
name: "VoltApplication_DelServiceWithPrefix",
args: args{
cntx: context.Background(),
prefix: test_device,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{
VnetsBySvlan: util.NewConcurrentMap(),
}
va.ServiceByName.Store(test_device, voltService)
va.VnetsByName.Store("0-0-0", voltVnet)
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutVnet(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
cuncurrentMap := &util.ConcurrentMap{
Count: atomic.NewUint64(0),
}
va.VnetsBySvlan.Set(of.VlanAny, cuncurrentMap)
dbintf.EXPECT().DelVnet(gomock.Any(), gomock.Any()).Return(nil).Times(1)
err := va.DelServiceWithPrefix(tt.args.cntx, tt.args.prefix)
assert.Nil(t, err)
})
}
}
func TestVoltService_FlowInstallFailure(t *testing.T) {
type args struct {
cntx context.Context
cookie string
errorCode uint32
errReason string
}
tests := []struct {
name string
args args
}{
{
name: "VoltService_FlowInstallFailure",
args: args{
cntx: context.Background(),
cookie: "test_cookie",
errorCode: uint32(1),
errReason: "err_reason",
},
},
{
name: "PendingFlows[cookie]_false",
args: args{
cntx: context.Background(),
cookie: "test_cookie",
errorCode: uint32(1),
errReason: "err_reason",
},
},
}
pendingFlows := map[string]bool{}
pendingFlows["test_cookie"] = true
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceOper: VoltServiceOper{},
VoltServiceCfg: VoltServiceCfg{},
}
switch tt.name {
case "VoltService_FlowInstallFailure":
vs.PendingFlows = pendingFlows
vs.FlowInstallFailure(tt.args.cntx, tt.args.cookie, tt.args.errorCode, tt.args.errReason)
case "PendingFlows[cookie]_false":
vs.FlowInstallFailure(tt.args.cntx, tt.args.cookie, tt.args.errorCode, tt.args.errReason)
}
})
}
}
func TestVoltService_FlowRemoveSuccess(t *testing.T) {
type args struct {
cntx context.Context
cookie string
flowEventMap *util.ConcurrentMap
}
tests := []struct {
name string
args args
}{
{
name: "GetDevice != nil",
args: args{
cntx: context.Background(),
cookie: "test_cookie",
flowEventMap: util.NewConcurrentMap(),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceOper: VoltServiceOper{
Device: test_device,
},
VoltServiceCfg: VoltServiceCfg{},
}
ga := GetApplication()
ga.DevicesDisc.Store(test_device, voltDevice2)
voltDevice2.State = controller.DeviceStateUP
dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
db = dbintf
dbintf.EXPECT().PutService(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
vs.FlowRemoveSuccess(tt.args.cntx, tt.args.cookie)
})
}
}
func TestVoltService_setDSMatchActionVlanT0(t *testing.T) {
type args struct {
flow *of.VoltSubFlow
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "VlanControl: ONUCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: OLTCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: ONUCVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: OLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: OLTSVlan && UniVlan != of.VlanAny",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "invalid VlanControl",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceCfg: VoltServiceCfg{
SVlan: of.VlanAny,
UniVlan: of.VlanAny,
VlanControl: ONUCVlanOLTSVlan,
},
}
switch tt.name {
case "VlanControl: ONUCVlanOLTSVlan":
vs.VlanControl = ONUCVlanOLTSVlan
if err := vs.setDSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: OLTCVlanOLTSVlan":
vs.VlanControl = OLTCVlanOLTSVlan
if err := vs.setDSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: ONUCVlan":
vs.VlanControl = ONUCVlan
if err := vs.setDSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: OLTSVlan":
vs.VlanControl = OLTSVlan
vs.UniVlan = vs.CVlan
if err := vs.setDSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: OLTSVlan && UniVlan != of.VlanAny":
vs.VlanControl = OLTSVlan
if err := vs.setDSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "invalid VlanControl":
vs.VlanControl = 5
err := vs.setDSMatchActionVlanT0(tt.args.flow)
assert.NotNil(t, err)
}
})
}
}
func TestVoltService_setUSMatchActionVlanT1(t *testing.T) {
type args struct {
flow *of.VoltSubFlow
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "VlanControl: ONUCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: OLTCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: ONUCVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: OLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: OLTSVlan vs.UniVlan != of.VlanAny && vs.UniVlan != of.VlanNone",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: OLTSVlan vs.UniVlan == of.VlanNone",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "VlanControl: default",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{
VoltServiceCfg: VoltServiceCfg{
SVlan: of.VlanAny,
UniVlan: of.VlanAny,
VlanControl: ONUCVlanOLTSVlan,
},
}
switch tt.name {
case "VlanControl: ONUCVlanOLTSVlan":
vs.VlanControl = ONUCVlanOLTSVlan
if err := vs.setUSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: OLTCVlanOLTSVlan":
vs.VlanControl = OLTCVlanOLTSVlan
if err := vs.setUSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: ONUCVlan":
vs.VlanControl = ONUCVlan
if err := vs.setUSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: OLTSVlan":
vs.VlanControl = OLTSVlan
if err := vs.setUSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: OLTSVlan vs.UniVlan != of.VlanAny && vs.UniVlan != of.VlanNone":
vs.VlanControl = OLTSVlan
vs.UniVlan = vs.CVlan
if err := vs.setUSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: OLTSVlan vs.UniVlan == of.VlanNone":
vs.VlanControl = OLTSVlan
vs.UniVlan = of.VlanNone
if err := vs.setUSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "VlanControl: default":
vs.VlanControl = 6
err := vs.setUSMatchActionVlanT1(tt.args.flow)
assert.NotNil(t, err)
}
})
}
}
func TestVoltService_setUSMatchActionVlanT0(t *testing.T) {
type args struct {
flow *of.VoltSubFlow
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "vs.VlanControl: ONUCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: ONUCVlanOLTSVlan vs.UniVlan == of.VlanNone",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: OLTCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: ONUCVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: ONUCVlan vs.UniVlan == of.VlanNone",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: OLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
switch tt.name {
case "vs.VlanControl: ONUCVlanOLTSVlan":
vs.VlanControl = ONUCVlanOLTSVlan
if err := vs.setUSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setUSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: ONUCVlanOLTSVlan vs.UniVlan == of.VlanNone":
vs.VlanControl = ONUCVlanOLTSVlan
vs.UniVlan = of.VlanNone
if err := vs.setUSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setUSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: OLTCVlanOLTSVlan":
vs.VlanControl = OLTCVlanOLTSVlan
if err := vs.setUSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setUSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: ONUCVlan":
vs.VlanControl = ONUCVlan
if err := vs.setUSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setUSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: ONUCVlan vs.UniVlan == of.VlanNone":
vs.VlanControl = ONUCVlan
vs.UniVlan = of.VlanNone
if err := vs.setUSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setUSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: OLTSVlan":
vs.VlanControl = OLTSVlan
if err := vs.setUSMatchActionVlanT0(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setUSMatchActionVlanT0() error = %v, wantErr %v", err, tt.wantErr)
}
}
})
}
}
func TestVoltService_setDSMatchActionVlanT1(t *testing.T) {
type args struct {
flow *of.VoltSubFlow
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "vs.VlanControl: ONUCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: ONUCVlanOLTSVlan vs.UniVlan == of.VlanNone",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: OLTCVlanOLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: ONUCVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: ONUCVlan vs.UniVlan == of.VlanNone",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: OLTSVlan",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
{
name: "vs.VlanControl: default",
args: args{
flow: &of.VoltSubFlow{
ErrorReason: "test_error_reason",
Cookie: uint64(1),
OldCookie: uint64(2),
TableID: uint32(3),
Priority: uint32(4),
State: uint8(5),
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
switch tt.name {
case "vs.VlanControl: ONUCVlanOLTSVlan":
vs.VlanControl = ONUCVlanOLTSVlan
if err := vs.setDSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT1() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: ONUCVlanOLTSVlan vs.UniVlan == of.VlanNone":
vs.VlanControl = ONUCVlanOLTSVlan
vs.UniVlan = of.VlanNone
if err := vs.setDSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT1() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: OLTCVlanOLTSVlan":
vs.VlanControl = OLTCVlanOLTSVlan
if err := vs.setDSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT1() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: ONUCVlan":
vs.VlanControl = ONUCVlan
if err := vs.setDSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT1() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: ONUCVlan vs.UniVlan == of.VlanNone":
vs.VlanControl = ONUCVlan
vs.UniVlan = of.VlanNone
if err := vs.setDSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT1() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: OLTSVlan":
vs.VlanControl = OLTSVlan
if err := vs.setDSMatchActionVlanT1(tt.args.flow); (err != nil) != tt.wantErr {
t.Errorf("VoltService.setDSMatchActionVlanT1() error = %v, wantErr %v", err, tt.wantErr)
}
case "vs.VlanControl: default":
vs.VlanControl = 6
err := vs.setDSMatchActionVlanT1(tt.args.flow)
assert.NotNil(t, err)
}
})
}
}
func TestVoltService_SetIpv6Addr(t *testing.T) {
type args struct {
addr net.IP
}
tests := []struct {
name string
args args
}{
{
name: "SetIpv6Addr",
args: args{
addr: AllSystemsMulticastGroupIP,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
vs.SetIpv6Addr(tt.args.addr)
})
}
}
func TestVoltService_SetIpv4Addr(t *testing.T) {
type args struct {
addr net.IP
}
tests := []struct {
name string
args args
}{
{
name: "VoltService_SetIpv4Addr",
args: args{
addr: AllSystemsMulticastGroupIP,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
vs.SetIpv4Addr(tt.args.addr)
})
}
}
func TestVoltService_SetMacAddr(t *testing.T) {
type args struct {
addr net.HardwareAddr
}
tests := []struct {
name string
args args
}{
{
name: "VoltService_SetMacAddr",
args: args{
addr: BroadcastMAC,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
vs.SetMacAddr(tt.args.addr)
})
}
}
func TestVoltService_GetCircuitID(t *testing.T) {
tests := []struct {
name string
want []byte
}{
{
name: "VoltService_GetCircuitID",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
_ = vs.GetCircuitID()
})
}
}
func TestVoltService_GetRemoteID(t *testing.T) {
tests := []struct {
name string
want []byte
}{
{
name: "VoltService_GetRemoteID",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
_ = vs.GetRemoteID()
})
}
}
func TestVoltService_IPAssigned(t *testing.T) {
tests := []struct {
name string
want bool
}{
{
name: "VoltService_IPAssigned",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
vs := &VoltService{}
_ = vs.IPAssigned()
})
}
}
func TestVoltApplication_GetFlowProvisionStatus(t *testing.T) {
type args struct {
portNo string
}
voltServ := &VoltService{
VoltServiceCfg: VoltServiceCfg{
Port: "SDX6320031-1",
IsActivated: true,
},
VoltServiceOper: VoltServiceOper{
Device: "SDX6320031",
DsHSIAFlowsApplied: true,
UsHSIAFlowsApplied: true,
},
}
tests := []struct {
name string
args args
want FlowProvisionStatus
}{
{
name: "ALL_FLOWS_PROVISIONED",
args: args{
portNo: "SDX6320031-1",
},
want: FlowProvisionStatus{
FlowProvisionStatus: "ALL_FLOWS_PROVISIONED",
},
},
{
name: "SUBSCRIBER_DISABLED_IN_CONTROLLER",
args: args{
portNo: "SDX6320031-1",
},
want: FlowProvisionStatus{
FlowProvisionStatus: "DISABLED_IN_CONTROLLER",
},
},
{
name: "FLOWS_PROVISIONED_PARTIALLY",
args: args{
portNo: "SDX6320031-1",
},
want: FlowProvisionStatus{
FlowProvisionStatus: "FLOWS_PROVISIONED_PARTIALLY",
},
},
{
name: "NO_FLOWS_PROVISIONED",
args: args{
portNo: "SDX6320031-1",
},
want: FlowProvisionStatus{
FlowProvisionStatus: "NO_FLOWS_PROVISIONED",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
va := &VoltApplication{}
switch tt.name {
case "ALL_FLOWS_PROVISIONED":
va.ServiceByName.Store("SCOM00001c75-1_SCOM00001c75-1-4096-2310-4096-65", voltServ)
if got := va.GetFlowProvisionStatus(tt.args.portNo); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetFlowProvisionStatus() = %v, want %v", got, tt.want)
}
case "SUBSCRIBER_DISABLED_IN_CONTROLLER":
voltServ1 := &VoltService{
VoltServiceCfg: VoltServiceCfg{
Port: "SDX6320031-1",
IsActivated: false,
},
}
va.ServiceByName.Store("SCOM00001c75-1_SCOM00001c75-1-4096-2310-4096-65", voltServ1)
if got := va.GetFlowProvisionStatus(tt.args.portNo); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetFlowProvisionStatus() = %v, want %v", got, tt.want)
}
case "FLOWS_PROVISIONED_PARTIALLY":
pendingFlows := map[string]bool{}
pendingFlows["test"] = true
voltServ.PendingFlows = pendingFlows
va.ServiceByName.Store("SCOM00001c75-1_SCOM00001c75-1-4096-2310-4096-65", voltServ)
if got := va.GetFlowProvisionStatus(tt.args.portNo); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetFlowProvisionStatus() = %v, want %v", got, tt.want)
}
case "NO_FLOWS_PROVISIONED":
voltServ.UsHSIAFlowsApplied = false
voltServ.DsHSIAFlowsApplied = false
va.ServiceByName.Store("SCOM00001c75-1_SCOM00001c75-1-4096-2310-4096-65", voltServ)
if got := va.GetFlowProvisionStatus(tt.args.portNo); !reflect.DeepEqual(got, tt.want) {
t.Errorf("VoltApplication.GetFlowProvisionStatus() = %v, want %v", got, tt.want)
}
}
})
}
}