blob: 4c9a00f3667bbc7ca0c36f3bee6cc000639e7d44 [file] [log] [blame]
kdarapu381c6902019-07-31 18:23:16 +05301/*
Joey Armstronga6af1522023-01-17 16:06:16 -05002 * Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors
kdarapu381c6902019-07-31 18:23:16 +05303
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Scott Bakerdbd960e2020-02-28 08:57:51 -080017//Package core provides the utility for olt devices, flows and statistics
18package core
kdarapu381c6902019-07-31 18:23:16 +053019
20import (
kdarapu891693b2019-09-16 12:33:49 +053021 "context"
kdarapu381c6902019-07-31 18:23:16 +053022 "net"
kdarapu891693b2019-09-16 12:33:49 +053023 "reflect"
Naga Manjunatha8dc9372019-10-31 23:01:18 +053024 "sync"
kdarapu381c6902019-07-31 18:23:16 +053025 "testing"
Naga Manjunath7615e552019-10-11 22:35:47 +053026 "time"
27
khenaidoo106c61a2021-08-11 18:05:46 -040028 conf "github.com/opencord/voltha-lib-go/v7/pkg/config"
29 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
30
31 "github.com/opencord/voltha-lib-go/v7/pkg/db"
32 fu "github.com/opencord/voltha-lib-go/v7/pkg/flows"
Mahir Gunyel85f61c12021-10-06 11:53:45 -070033 plt "github.com/opencord/voltha-lib-go/v7/pkg/platform"
khenaidoo106c61a2021-08-11 18:05:46 -040034 "github.com/opencord/voltha-lib-go/v7/pkg/pmmetrics"
35 ponrmgr "github.com/opencord/voltha-lib-go/v7/pkg/ponresourcemanager"
kesavand494c2082020-08-31 11:16:12 +053036 "github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
Thomas Lee S94109f12020-03-03 16:39:29 +053037 "github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
Scott Bakerdbd960e2020-02-28 08:57:51 -080038 "github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
39 "github.com/opencord/voltha-openolt-adapter/pkg/mocks"
khenaidoodc2116e2021-10-19 17:33:19 -040040 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
khenaidoo106c61a2021-08-11 18:05:46 -040041 of "github.com/opencord/voltha-protos/v5/go/openflow_13"
42 ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
43 oop "github.com/opencord/voltha-protos/v5/go/openolt"
44 "github.com/opencord/voltha-protos/v5/go/voltha"
kesavandb9f54fd2021-11-25 20:08:04 +053045 "github.com/stretchr/testify/assert"
kdarapu381c6902019-07-31 18:23:16 +053046)
47
Girish Gowdra9602eb42020-09-09 15:50:39 -070048const (
Girish Gowdrafb3d6102020-10-16 16:32:36 -070049 NumPonPorts = 16
Girish Gowdra9602eb42020-09-09 15:50:39 -070050 OnuIDStart = 1
51 OnuIDEnd = 32
52 AllocIDStart = 1
53 AllocIDEnd = 10
54 GemIDStart = 1
55 GemIDEnd = 10
56 FlowIDStart = 1
57 FlowIDEnd = 10
58)
59
khenaidoo106c61a2021-08-11 18:05:46 -040060func newMockOnuInterAdapterService() *mocks.MockOnuInterAdapterService {
61 return &mocks.MockOnuInterAdapterService{}
62}
63
64func newMockCoreService() *mocks.MockCoreService {
65 mcp := mocks.MockCoreService{
Kent Hagermanf1db18b2020-07-08 13:38:15 -040066 Devices: make(map[string]*voltha.Device),
67 DevicePorts: make(map[string][]*voltha.Port),
68 }
Naga Manjunath7615e552019-10-11 22:35:47 +053069 var pm []*voltha.PmConfig
kdarapu891693b2019-09-16 12:33:49 +053070 mcp.Devices["olt"] = &voltha.Device{
khenaidoo106c61a2021-08-11 18:05:46 -040071 Id: "olt",
72 Root: true,
73 ParentId: "logical_device",
74 ParentPortNo: 1,
75 AdapterEndpoint: "mock-olt-endpoint",
kdarapu891693b2019-09-16 12:33:49 +053076 ProxyAddress: &voltha.Device_ProxyAddress{
77 DeviceId: "olt",
78 DeviceType: "onu",
79 ChannelId: 1,
80 ChannelGroupId: 1,
81 },
82 ConnectStatus: 1,
Naga Manjunath7615e552019-10-11 22:35:47 +053083 PmConfigs: &voltha.PmConfigs{
84 DefaultFreq: 10,
85 Id: "olt",
86 FreqOverride: false,
87 Grouped: false,
88 Metrics: pm,
89 },
kdarapu891693b2019-09-16 12:33:49 +053090 }
Kent Hagermanf1db18b2020-07-08 13:38:15 -040091 mcp.DevicePorts["olt"] = []*voltha.Port{
92 {PortNo: 1, Label: "pon"},
93 {PortNo: 2, Label: "nni"},
94 }
kdarapu891693b2019-09-16 12:33:49 +053095
Kent Hagermanf1db18b2020-07-08 13:38:15 -040096 mcp.Devices["onu1"] = &voltha.Device{
khenaidoo106c61a2021-08-11 18:05:46 -040097 Id: "1",
98 Root: false,
99 ParentId: "olt",
100 ParentPortNo: 1,
101 AdapterEndpoint: "mock-onu-endpoint",
102 OperStatus: 4,
kdarapu891693b2019-09-16 12:33:49 +0530103 ProxyAddress: &voltha.Device_ProxyAddress{
104 OnuId: 1,
105 ChannelId: 1,
106 ChannelGroupId: 1,
107 },
108 ConnectStatus: 1,
Naga Manjunath7615e552019-10-11 22:35:47 +0530109 PmConfigs: &voltha.PmConfigs{
110 DefaultFreq: 10,
111 Id: "olt",
112 FreqOverride: false,
113 Grouped: false,
114 Metrics: pm,
115 },
kdarapu891693b2019-09-16 12:33:49 +0530116 }
Kent Hagermanf1db18b2020-07-08 13:38:15 -0400117 mcp.DevicePorts["onu1"] = []*voltha.Port{
118 {PortNo: 1, Label: "pon"},
119 {PortNo: 2, Label: "uni"},
120 }
121
kdarapu891693b2019-09-16 12:33:49 +0530122 mcp.Devices["onu2"] = &voltha.Device{
khenaidoo106c61a2021-08-11 18:05:46 -0400123 Id: "2",
124 Root: false,
125 ParentId: "olt",
126 OperStatus: 2,
127 AdapterEndpoint: "mock-onu-endpoint",
128 ParentPortNo: 1,
kdarapu891693b2019-09-16 12:33:49 +0530129
130 ProxyAddress: &voltha.Device_ProxyAddress{
131 OnuId: 2,
132 ChannelId: 1,
133 ChannelGroupId: 1,
134 },
135 ConnectStatus: 1,
Naga Manjunath7615e552019-10-11 22:35:47 +0530136 PmConfigs: &voltha.PmConfigs{
137 DefaultFreq: 10,
138 Id: "olt",
139 FreqOverride: false,
140 Grouped: false,
141 Metrics: pm,
142 },
kdarapu891693b2019-09-16 12:33:49 +0530143 }
Kent Hagermanf1db18b2020-07-08 13:38:15 -0400144 mcp.DevicePorts["onu2"] = []*voltha.Port{
145 {PortNo: 1, Label: "pon"},
146 {PortNo: 2, Label: "uni"},
147 }
kdarapu891693b2019-09-16 12:33:49 +0530148 return &mcp
149}
150func newMockDeviceHandler() *DeviceHandler {
kdarapu381c6902019-07-31 18:23:16 +0530151 device := &voltha.Device{
khenaidoo106c61a2021-08-11 18:05:46 -0400152 Id: "olt",
153 Root: true,
154 ParentId: "logical_device",
155 AdapterEndpoint: "mock-olt-endpoint",
kdarapu891693b2019-09-16 12:33:49 +0530156 ProxyAddress: &voltha.Device_ProxyAddress{
157 DeviceId: "olt",
158 DeviceType: "onu",
159 ChannelId: 1,
160 ChannelGroupId: 1,
161 },
Abhilash Laxmeshwar092e6ca2022-12-08 19:51:27 +0530162 ConnectStatus: 2,
kdarapu381c6902019-07-31 18:23:16 +0530163 }
khenaidoo106c61a2021-08-11 18:05:46 -0400164 mcs := newMockCoreService()
165 cc := mocks.NewMockCoreClient(mcs)
kdarapu891693b2019-09-16 12:33:49 +0530166 ep := &mocks.MockEventProxy{}
Matteo Scandolodfa7a972020-11-06 13:03:40 -0800167 cm := &conf.ConfigManager{}
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700168 cm.Backend = &db.Backend{StoreType: "etcd", Client: &mocks.MockKVClient{}}
kesavand494c2082020-08-31 11:16:12 +0530169 cfg := &config.AdapterFlags{OmccEncryption: true}
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +0530170 openOLT := &OpenOLT{eventProxy: ep, config: cfg, KVStoreType: "etcd", KVStoreAddress: "1:2"}
khenaidoo106c61a2021-08-11 18:05:46 -0400171 dh := NewDeviceHandler(cc, ep, device, openOLT, cm, cfg)
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +0530172 dh.kvStore = cm.Backend
Girish Gowdra38d533d2020-03-30 20:38:51 -0700173 oopRanges := []*oop.DeviceInfo_DeviceResourceRanges{{
Girish Gowdrafb3d6102020-10-16 16:32:36 -0700174 IntfIds: []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
Girish Gowdra38d533d2020-03-30 20:38:51 -0700175 Technology: "xgs-pon",
176 Pools: []*oop.DeviceInfo_DeviceResourceRanges_Pool{{}},
177 }}
178
Girish Gowdra9602eb42020-09-09 15:50:39 -0700179 deviceInf := &oop.DeviceInfo{Vendor: "openolt", Ranges: oopRanges, Model: "openolt", DeviceId: dh.device.Id, PonPorts: NumPonPorts}
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700180 dh.deviceInfo = deviceInf
khenaidoo106c61a2021-08-11 18:05:46 -0400181 dh.device = device
yasin saplid0566272021-12-21 09:10:30 +0000182 dh.resourceMgr = make([]*resourcemanager.OpenOltResourceMgr, deviceInf.PonPorts+1)
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700183 var i uint32
yasin saplid0566272021-12-21 09:10:30 +0000184 for i = 0; i < deviceInf.PonPorts+1; i++ {
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700185 dh.resourceMgr[i] = &resourcemanager.OpenOltResourceMgr{DeviceID: dh.device.Id, DeviceType: dh.device.Type, DevInfo: deviceInf,
186 KVStore: &db.Backend{
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700187 StoreType: "etcd",
188 Client: &mocks.MockKVClient{},
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700189 }}
190 dh.resourceMgr[i].InitLocalCache()
191 }
Girish Gowdra38d533d2020-03-30 20:38:51 -0700192
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530193 ranges := make(map[string]interface{})
194 sharedIdxByType := make(map[string]string)
195 sharedIdxByType["ALLOC_ID"] = "ALLOC_ID"
196 sharedIdxByType["ONU_ID"] = "ONU_ID"
197 sharedIdxByType["GEMPORT_ID"] = "GEMPORT_ID"
198 sharedIdxByType["FLOW_ID"] = "FLOW_ID"
199 ranges["ONU_ID"] = uint32(0)
200 ranges["GEMPORT_ID"] = uint32(0)
201 ranges["ALLOC_ID"] = uint32(0)
202 ranges["FLOW_ID"] = uint32(0)
203 ranges["onu_id_shared"] = uint32(0)
204 ranges["alloc_id_shared"] = uint32(0)
205 ranges["gemport_id_shared"] = uint32(0)
206 ranges["flow_id_shared"] = uint32(0)
207
Matteo Scandolo84585372021-03-18 14:21:22 -0700208 ponmgr := &ponrmgr.PONResourceManager{}
Matteo Scandolo84585372021-03-18 14:21:22 -0700209 ponmgr.DeviceID = "onu-1"
210 ponmgr.IntfIDs = []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
211 ponmgr.KVStore = &db.Backend{
212 Client: &mocks.MockKVClient{},
213 }
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700214 ponmgr.KVStoreForConfig = &db.Backend{
215 Client: &mocks.MockKVClient{},
216 }
217 ponmgr.Backend = "etcd"
Matteo Scandolo84585372021-03-18 14:21:22 -0700218 ponmgr.PonResourceRanges = ranges
219 ponmgr.SharedIdxByType = sharedIdxByType
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700220 ponmgr.Technology = "XGS-PON"
221 for i = 0; i < deviceInf.PonPorts; i++ {
222 dh.resourceMgr[i].PonRsrMgr = ponmgr
223 }
224
npujarec5762e2020-01-01 14:08:48 +0530225 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
226 defer cancel()
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700227 dh.groupMgr = NewGroupManager(ctx, dh, dh.resourceMgr[0])
Girish Gowdra9602eb42020-09-09 15:50:39 -0700228 dh.totalPonPorts = NumPonPorts
yasin saplid0566272021-12-21 09:10:30 +0000229 dh.flowMgr = make([]*OpenOltFlowMgr, dh.totalPonPorts+1)
230 for i = 0; i < dh.totalPonPorts+1; i++ {
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700231 dh.flowMgr[i] = &OpenOltFlowMgr{}
232 dh.flowMgr[i].deviceHandler = dh
233 dh.flowMgr[i].ponPortIdx = i
234 dh.flowMgr[i].grpMgr = dh.groupMgr
235 dh.flowMgr[i].resourceMgr = dh.resourceMgr[i]
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700236 dh.flowMgr[i].techprofile = mocks.MockTechProfile{}
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700237 dh.flowMgr[i].packetInGemPort = make(map[resourcemanager.PacketInInfoKey]uint32)
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700238
Girish Gowdra76a1b092021-07-28 10:07:04 -0700239 dh.resourceMgr[i].TechprofileRef = dh.flowMgr[i].techprofile
240
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700241 // Create a slice of buffered channels for handling concurrent flows per ONU.
242 // The additional entry (+1) is to handle the NNI trap flows on a separate channel from individual ONUs channel
Mahir Gunyel85f61c12021-10-06 11:53:45 -0700243 dh.flowMgr[i].incomingFlows = make([]chan flowControlBlock, plt.MaxOnusPerPon+1)
244 dh.flowMgr[i].stopFlowHandlerRoutine = make([]chan bool, plt.MaxOnusPerPon+1)
245 dh.flowMgr[i].flowHandlerRoutineActive = make([]bool, plt.MaxOnusPerPon+1)
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700246 for j := range dh.flowMgr[i].incomingFlows {
247 dh.flowMgr[i].incomingFlows[j] = make(chan flowControlBlock, maxConcurrentFlowsPerOnu)
Girish Gowdra4736e5c2021-08-25 15:19:10 -0700248 dh.flowMgr[i].stopFlowHandlerRoutine[j] = make(chan bool, 1)
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700249 // Spin up a go routine to handling incoming flows (add/remove).
250 // There will be on go routine per ONU.
251 // This routine will be blocked on the flowMgr.incomingFlows[onu-id] channel for incoming flows.
Girish Gowdra4736e5c2021-08-25 15:19:10 -0700252 dh.flowMgr[i].flowHandlerRoutineActive[j] = true
253 go dh.flowMgr[i].perOnuFlowHandlerRoutine(j, dh.flowMgr[i].incomingFlows[j], dh.flowMgr[i].stopFlowHandlerRoutine[j])
Girish Gowdra9602eb42020-09-09 15:50:39 -0700254 }
255 }
kdarapu891693b2019-09-16 12:33:49 +0530256 dh.Client = &mocks.MockOpenoltClient{}
kesavand39e0aa32020-01-28 20:58:50 -0500257 dh.eventMgr = &OpenOltEventMgr{eventProxy: &mocks.MockEventProxy{}, handler: dh}
kdarapu891693b2019-09-16 12:33:49 +0530258 dh.transitionMap = &TransitionMap{}
Naga Manjunath7615e552019-10-11 22:35:47 +0530259 dh.portStats = &OpenOltStatisticsMgr{}
Amit Ghoshd4cbe482019-11-21 12:07:14 +0000260
261 var pmNames = []string{
262 "rx_bytes",
263 "rx_packets",
264 "rx_mcast_packets",
265 "rx_bcast_packets",
266 "tx_bytes",
267 "tx_packets",
268 "tx_mcast_packets",
269 "tx_bcast_packets",
270 }
271
272 dh.metrics = pmmetrics.NewPmMetrics(device.Id, pmmetrics.Frequency(2), pmmetrics.FrequencyOverride(false), pmmetrics.Grouped(false), pmmetrics.Metrics(pmNames))
khenaidoo106c61a2021-08-11 18:05:46 -0400273
274 // Set the children endpoints
275 dh.childAdapterClients = map[string]*vgrpc.Client{
276 "mock-onu-endpoint": mocks.NewMockChildAdapterClient(newMockOnuInterAdapterService()),
277 }
kdarapu891693b2019-09-16 12:33:49 +0530278 return dh
kdarapu381c6902019-07-31 18:23:16 +0530279}
280
kdarapu891693b2019-09-16 12:33:49 +0530281func negativeDeviceHandler() *DeviceHandler {
282 dh := newMockDeviceHandler()
283 device := dh.device
284 device.Id = ""
kdarapu891693b2019-09-16 12:33:49 +0530285 return dh
286}
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700287
288func negativeDeviceHandlerNilFlowMgr() *DeviceHandler {
289 dh := newMockDeviceHandler()
290 dh.flowMgr = nil
291 return dh
292}
293
kdarapu381c6902019-07-31 18:23:16 +0530294func Test_generateMacFromHost(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000295 ctx := context.Background()
kdarapu381c6902019-07-31 18:23:16 +0530296 type args struct {
297 host string
298 }
299 tests := []struct {
300 name string
301 args args
302 want string
303 wantErr bool
304 }{
kdarapu891693b2019-09-16 12:33:49 +0530305 {"generateMacFromHost-1", args{host: "localhost"}, "00:00:7f:00:00:01", false},
306 {"generateMacFromHost-2", args{host: "10.10.10.10"}, "00:00:0a:0a:0a:0a", false},
307 //{"generateMacFromHost-3", args{host: "google.com"}, "00:00:d8:3a:c8:8e", false},
308 {"generateMacFromHost-4", args{host: "testing3"}, "", true},
kdarapu381c6902019-07-31 18:23:16 +0530309 }
310 for _, tt := range tests {
311 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000312 got, err := generateMacFromHost(ctx, tt.args.host)
kdarapu381c6902019-07-31 18:23:16 +0530313 if (err != nil) != tt.wantErr {
314 t.Errorf("generateMacFromHost() error = %v, wantErr %v", err, tt.wantErr)
315 return
316 }
317 if got != tt.want {
318 t.Errorf("generateMacFromHost() = %v, want %v", got, tt.want)
319 }
320 })
321 }
322}
323func Test_macifyIP(t *testing.T) {
324 type args struct {
325 ip net.IP
326 }
327 tests := []struct {
328 name string
329 args args
330 want string
331 }{{
kdarapu891693b2019-09-16 12:33:49 +0530332 "macifyIP-1",
kdarapu381c6902019-07-31 18:23:16 +0530333 args{ip: net.ParseIP("10.10.10.10")},
334 "00:00:0a:0a:0a:0a",
335 },
336 {
kdarapu891693b2019-09-16 12:33:49 +0530337 "macifyIP-2",
kdarapu381c6902019-07-31 18:23:16 +0530338 args{ip: net.ParseIP("127.0.0.1")},
339 "00:00:7f:00:00:01",
kdarapu891693b2019-09-16 12:33:49 +0530340 },
341 {
342 "macifyIP-3",
343 args{ip: net.ParseIP("127.0.0.1/24")},
344 "",
345 },
346 }
kdarapu381c6902019-07-31 18:23:16 +0530347 for _, tt := range tests {
348 t.Run(tt.name, func(t *testing.T) {
349 if got := macifyIP(tt.args.ip); got != tt.want {
350 t.Errorf("macifyIP() = %v, want %v", got, tt.want)
351 }
352 })
353 }
354}
355
David K. Bainbridge794735f2020-02-11 21:01:37 -0800356func sparseCompare(keys []string, spec, target interface{}) bool {
357 if spec == target {
358 return true
359 }
360 if spec == nil || target == nil {
361 return false
362 }
363 typeSpec := reflect.TypeOf(spec)
364 typeTarget := reflect.TypeOf(target)
365 if typeSpec != typeTarget {
366 return false
367 }
368
369 vSpec := reflect.ValueOf(spec)
370 vTarget := reflect.ValueOf(target)
371 if vSpec.Kind() == reflect.Ptr {
372 vSpec = vSpec.Elem()
373 vTarget = vTarget.Elem()
374 }
375
376 for _, key := range keys {
377 fSpec := vSpec.FieldByName(key)
378 fTarget := vTarget.FieldByName(key)
379 if !reflect.DeepEqual(fSpec.Interface(), fTarget.Interface()) {
380 return false
381 }
382 }
383 return true
384}
385
kdarapu381c6902019-07-31 18:23:16 +0530386func TestDeviceHandler_GetChildDevice(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000387 ctx := context.Background()
kdarapu891693b2019-09-16 12:33:49 +0530388 dh1 := newMockDeviceHandler()
389 dh2 := negativeDeviceHandler()
kdarapu381c6902019-07-31 18:23:16 +0530390 type args struct {
391 parentPort uint32
392 onuID uint32
393 }
394 tests := []struct {
kdarapu891693b2019-09-16 12:33:49 +0530395 name string
396 devicehandler *DeviceHandler
397 args args
398 want *voltha.Device
David K. Bainbridge794735f2020-02-11 21:01:37 -0800399 errType reflect.Type
kdarapu381c6902019-07-31 18:23:16 +0530400 }{
kdarapu891693b2019-09-16 12:33:49 +0530401 {"GetChildDevice-1", dh1,
402 args{parentPort: 1,
403 onuID: 1},
David K. Bainbridge794735f2020-02-11 21:01:37 -0800404 &voltha.Device{
405 Id: "1",
406 ParentId: "olt",
407 ParentPortNo: 1,
408 },
409 nil,
kdarapu891693b2019-09-16 12:33:49 +0530410 },
411 {"GetChildDevice-2", dh2,
kdarapu381c6902019-07-31 18:23:16 +0530412 args{parentPort: 1,
413 onuID: 1},
David K. Bainbridge794735f2020-02-11 21:01:37 -0800414 nil,
Thomas Lee S94109f12020-03-03 16:39:29 +0530415 reflect.TypeOf(&olterrors.ErrNotFound{}),
kdarapu381c6902019-07-31 18:23:16 +0530416 },
417 }
David K. Bainbridge794735f2020-02-11 21:01:37 -0800418
419 /*
420 --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-1 (0.00s)
421 device_handler_test.go:309: GetportLabel() => want=(, <nil>) got=(id:"1" parent_id:"olt" parent_port_no:1 proxy_address:<channel_id:1 channel_group_id:1 onu_id:1 > oper_status:ACTIVE connect_status:UNREACHABLE ports:<port_no:1 label:"pon" > ports:<port_no:2 label:"uni" > pm_configs:<id:"olt" default_freq:10 > , <nil>)
422 --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-2 (0.00s)
423 */
kdarapu381c6902019-07-31 18:23:16 +0530424 for _, tt := range tests {
425 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000426 got, err := tt.devicehandler.GetChildDevice(ctx, tt.args.parentPort, tt.args.onuID)
David K. Bainbridge794735f2020-02-11 21:01:37 -0800427 if reflect.TypeOf(err) != tt.errType || !sparseCompare([]string{"Id", "ParentId", "ParentPortNo"}, tt.want, got) {
428 t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
429 tt.want, tt.errType, got, reflect.TypeOf(err))
430 return
431 }
kdarapu381c6902019-07-31 18:23:16 +0530432 t.Log("onu device id", got)
433 })
434 }
435}
kdarapu891693b2019-09-16 12:33:49 +0530436
437func TestGetportLabel(t *testing.T) {
Thomas Lee S94109f12020-03-03 16:39:29 +0530438 invalid := reflect.TypeOf(&olterrors.ErrInvalidValue{})
kdarapu891693b2019-09-16 12:33:49 +0530439 type args struct {
440 portNum uint32
441 portType voltha.Port_PortType
442 }
443 tests := []struct {
David K. Bainbridge794735f2020-02-11 21:01:37 -0800444 name string
445 args args
446 want string
447 errType reflect.Type
kdarapu891693b2019-09-16 12:33:49 +0530448 }{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800449 {"GetportLabel-1", args{portNum: 0, portType: 0}, "", invalid},
450 {"GetportLabel-2", args{portNum: 1, portType: 1}, "nni-1", nil},
451 {"GetportLabel-3", args{portNum: 2, portType: 2}, "", invalid},
452 {"GetportLabel-4", args{portNum: 3, portType: 3}, "pon-3", nil},
453 {"GetportLabel-5", args{portNum: 4, portType: 4}, "", invalid},
454 {"GetportLabel-6", args{portNum: 5, portType: 5}, "", invalid},
455 {"GetportLabel-7", args{portNum: 6, portType: 6}, "", invalid},
kdarapu891693b2019-09-16 12:33:49 +0530456 }
457 for _, tt := range tests {
458 t.Run(tt.name, func(t *testing.T) {
David K. Bainbridge794735f2020-02-11 21:01:37 -0800459 got, err := GetportLabel(tt.args.portNum, tt.args.portType)
460 if reflect.TypeOf(err) != tt.errType || got != tt.want {
461 t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
462 tt.want, tt.errType, got, reflect.TypeOf(err))
kdarapu891693b2019-09-16 12:33:49 +0530463 }
David K. Bainbridge794735f2020-02-11 21:01:37 -0800464
kdarapu891693b2019-09-16 12:33:49 +0530465 })
466 }
467}
468
khenaidoo106c61a2021-08-11 18:05:46 -0400469// func TestDeviceHandler_ProcessInterAdapterMessage(t *testing.T) {
470// ctx := context.Background()
471// dh := newMockDeviceHandler()
472// proxyAddr := dh.device.ProxyAddress
khenaidoodc2116e2021-10-19 17:33:19 -0400473// body := &ca.InterAdapterOmciMessage{
khenaidoo106c61a2021-08-11 18:05:46 -0400474// Message: []byte("asdfasdfasdfasdfas"),
475// ProxyAddress: proxyAddr,
476// }
khenaidoodc2116e2021-10-19 17:33:19 -0400477// body2 := &ca.InterAdapterOmciMessage{
khenaidoo106c61a2021-08-11 18:05:46 -0400478// Message: []byte("asdfasdfasdfasdfas"),
479// //ProxyAddress: &voltha.Device_ProxyAddress{},
480// }
khenaidoodc2116e2021-10-19 17:33:19 -0400481// body3 := &ca.InterAdapterTechProfileDownloadMessage{}
khenaidoo106c61a2021-08-11 18:05:46 -0400482// var marshalledData *any.Any
483// var err error
kdarapu891693b2019-09-16 12:33:49 +0530484
khenaidoo106c61a2021-08-11 18:05:46 -0400485// if marshalledData, err = ptypes.MarshalAny(body); err != nil {
486// logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"err": err})
487// }
kdarapu891693b2019-09-16 12:33:49 +0530488
khenaidoo106c61a2021-08-11 18:05:46 -0400489// var marshalledData1 *any.Any
kdarapu891693b2019-09-16 12:33:49 +0530490
khenaidoo106c61a2021-08-11 18:05:46 -0400491// if marshalledData1, err = ptypes.MarshalAny(body2); err != nil {
492// logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"err": err})
493// }
494// var marshalledData2 *any.Any
kdarapu891693b2019-09-16 12:33:49 +0530495
khenaidoo106c61a2021-08-11 18:05:46 -0400496// if marshalledData2, err = ptypes.MarshalAny(body3); err != nil {
497// logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"err": err})
498// }
499// type args struct {
khenaidoodc2116e2021-10-19 17:33:19 -0400500// msg *ca.InterAdapterMessage
khenaidoo106c61a2021-08-11 18:05:46 -0400501// }
502// invalid := reflect.TypeOf(&olterrors.ErrInvalidValue{})
503// tests := []struct {
504// name string
505// args args
506// wantErr reflect.Type
507// }{
khenaidoodc2116e2021-10-19 17:33:19 -0400508// {"ProcessInterAdapterMessage-1", args{msg: &ca.InterAdapterMessage{
509// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400510// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400511// Type: ca.InterAdapterMessageType_FLOW_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400512// },
513// Body: marshalledData,
514// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400515// {"ProcessInterAdapterMessage-2", args{msg: &ca.InterAdapterMessage{
516// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400517// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400518// Type: ca.InterAdapterMessageType_FLOW_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400519// },
520// Body: marshalledData1,
521// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400522// {"ProcessInterAdapterMessage-3", args{msg: &ca.InterAdapterMessage{
523// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400524// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400525// Type: ca.InterAdapterMessageType_OMCI_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400526// },
527// Body: marshalledData,
528// }}, reflect.TypeOf(&olterrors.ErrCommunication{})},
khenaidoodc2116e2021-10-19 17:33:19 -0400529// {"ProcessInterAdapterMessage-4", args{msg: &ca.InterAdapterMessage{
530// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400531// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400532// Type: ca.InterAdapterMessageType_OMCI_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400533// }, Body: marshalledData,
534// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400535// {"ProcessInterAdapterMessage-5", args{msg: &ca.InterAdapterMessage{
536// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400537// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400538// Type: ca.InterAdapterMessageType_METRICS_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400539// }, Body: marshalledData1,
540// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400541// {"ProcessInterAdapterMessage-6", args{msg: &ca.InterAdapterMessage{
542// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400543// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400544// Type: ca.InterAdapterMessageType_METRICS_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400545// }, Body: marshalledData,
546// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400547// {"ProcessInterAdapterMessage-7", args{msg: &ca.InterAdapterMessage{
548// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400549// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400550// Type: ca.InterAdapterMessageType_ONU_IND_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400551// }, Body: marshalledData,
552// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400553// {"ProcessInterAdapterMessage-8", args{msg: &ca.InterAdapterMessage{
554// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400555// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400556// Type: ca.InterAdapterMessageType_ONU_IND_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400557// }, Body: marshalledData,
558// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400559// {"ProcessInterAdapterMessage-9", args{msg: &ca.InterAdapterMessage{
560// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400561// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400562// Type: ca.InterAdapterMessageType_TECH_PROFILE_DOWNLOAD_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400563// }, Body: marshalledData,
564// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400565// {"ProcessInterAdapterMessage-10", args{msg: &ca.InterAdapterMessage{
566// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400567// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400568// Type: ca.InterAdapterMessageType_DELETE_GEM_PORT_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400569// }, Body: marshalledData2,
570// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400571// {"ProcessInterAdapterMessage-11", args{msg: &ca.InterAdapterMessage{
572// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400573// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400574// Type: ca.InterAdapterMessageType_DELETE_TCONT_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400575// }, Body: marshalledData2,
576// }}, invalid},
577// }
578// for _, tt := range tests {
579// t.Run(tt.name, func(t *testing.T) {
kdarapu891693b2019-09-16 12:33:49 +0530580
khenaidoo106c61a2021-08-11 18:05:46 -0400581// if err := dh.ProcessInterAdapterMessage(ctx, tt.args.msg); reflect.TypeOf(err) != tt.wantErr {
582// t.Errorf("DeviceHandler.ProcessInterAdapterMessage() error = %v, wantErr %v", err, tt.wantErr)
583// }
584// })
585// }
586// }
kdarapu891693b2019-09-16 12:33:49 +0530587
khenaidoo106c61a2021-08-11 18:05:46 -0400588func TestDeviceHandler_ProxyOmciMessage(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000589 ctx := context.Background()
kdarapu891693b2019-09-16 12:33:49 +0530590 dh1 := newMockDeviceHandler()
591 dh2 := negativeDeviceHandler()
592 device1 := &voltha.Device{
593 Id: "onu1",
594 Root: false,
595 ParentId: "logical_device",
596 ProxyAddress: &voltha.Device_ProxyAddress{
597 DeviceId: "onu1",
598 DeviceType: "onu",
599 ChannelId: 1,
600 ChannelGroupId: 1,
601 },
602 ConnectStatus: 1,
603 }
604 device2 := device1
605 device2.ConnectStatus = 2
khenaidoodc2116e2021-10-19 17:33:19 -0400606 iaomciMsg1 := &ia.OmciMessage{
kdarapu891693b2019-09-16 12:33:49 +0530607 ProxyAddress: &voltha.Device_ProxyAddress{
608 DeviceId: "onu2",
609 DeviceType: "onu",
610 ChannelId: 1,
611 ChannelGroupId: 1,
kdarapu891693b2019-09-16 12:33:49 +0530612 },
613 ConnectStatus: 1,
614 }
khenaidoodc2116e2021-10-19 17:33:19 -0400615 iaomciMsg2 := &ia.OmciMessage{
kdarapu891693b2019-09-16 12:33:49 +0530616 ProxyAddress: &voltha.Device_ProxyAddress{
617 DeviceId: "onu3",
618 DeviceType: "onu",
619 ChannelId: 1,
620 ChannelGroupId: 1,
621 },
622 ConnectStatus: 1,
623 }
624 type args struct {
625 onuDevice *voltha.Device
khenaidoodc2116e2021-10-19 17:33:19 -0400626 omciMsg *ia.OmciMessage
kdarapu891693b2019-09-16 12:33:49 +0530627 }
628 tests := []struct {
629 name string
630 devicehandler *DeviceHandler
631 args args
632 }{
khenaidoodc2116e2021-10-19 17:33:19 -0400633 {"sendProxiedMessage-1", dh1, args{onuDevice: device1, omciMsg: &ia.OmciMessage{}}},
634 {"sendProxiedMessage-2", dh1, args{onuDevice: device2, omciMsg: &ia.OmciMessage{}}},
kdarapu891693b2019-09-16 12:33:49 +0530635 {"sendProxiedMessage-3", dh1, args{onuDevice: nil, omciMsg: iaomciMsg1}},
636 {"sendProxiedMessage-4", dh1, args{onuDevice: nil, omciMsg: iaomciMsg2}},
637 {"sendProxiedMessage-5", dh2, args{onuDevice: nil, omciMsg: iaomciMsg2}},
khenaidoodc2116e2021-10-19 17:33:19 -0400638 {"sendProxiedMessage-6", dh2, args{onuDevice: device1, omciMsg: &ia.OmciMessage{}}},
kdarapu891693b2019-09-16 12:33:49 +0530639 }
640 for _, tt := range tests {
641 t.Run(tt.name, func(t *testing.T) {
khenaidoo106c61a2021-08-11 18:05:46 -0400642 _ = tt.devicehandler.ProxyOmciMessage(ctx, tt.args.omciMsg)
Kent Hagermane6ff1012020-07-14 15:07:53 -0400643 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530644 })
645 }
646}
647
kesavandb9f54fd2021-11-25 20:08:04 +0530648func TestDeviceHandler_ProxyOmciRequests(t *testing.T) {
649 ctx := context.Background()
650 dh1 := newMockDeviceHandler()
651 dh2 := negativeDeviceHandler()
652 device1 := &voltha.Device{
653 Id: "onu1",
654 Root: false,
655 ParentId: "logical_device",
656 ProxyAddress: &voltha.Device_ProxyAddress{
657 DeviceId: "onu1",
658 DeviceType: "onu",
659 ChannelId: 1,
660 ChannelGroupId: 1,
661 },
662 ConnectStatus: 1,
663 }
664 device2 := device1
665 device2.ConnectStatus = 2
666
667 iaomciMsg1 := &ia.OmciMessages{
668 ConnectStatus: 1,
669 ProxyAddress: &voltha.Device_ProxyAddress{
670 DeviceId: "onu2",
671 DeviceType: "onu",
672 ChannelId: 1,
673 ChannelGroupId: 1,
674 },
675 }
676
677 iaomciMsg2 := &ia.OmciMessages{
678 ConnectStatus: 1,
679 ProxyAddress: &voltha.Device_ProxyAddress{
680 DeviceId: "onu3",
681 DeviceType: "onu",
682 ChannelId: 1,
683 ChannelGroupId: 1,
684 },
685 }
686
687 type args struct {
688 onuDevice *voltha.Device
689 omciMsg *ia.OmciMessages
690 }
691 tests := []struct {
692 name string
693 devicehandler *DeviceHandler
694 args args
695 }{
696 {"sendProxiedMessage-1", dh1, args{onuDevice: device1, omciMsg: &ia.OmciMessages{}}},
697 {"sendProxiedMessage-2", dh1, args{onuDevice: device2, omciMsg: &ia.OmciMessages{}}},
698 {"sendProxiedMessage-3", dh1, args{onuDevice: nil, omciMsg: iaomciMsg1}},
699 {"sendProxiedMessage-4", dh1, args{onuDevice: nil, omciMsg: iaomciMsg2}},
700 {"sendProxiedMessage-5", dh2, args{onuDevice: nil, omciMsg: iaomciMsg2}},
701 {"sendProxiedMessage-6", dh2, args{onuDevice: device1, omciMsg: &ia.OmciMessages{}}},
702 }
703 for _, tt := range tests {
704 t.Run(tt.name, func(t *testing.T) {
705 switch tt.name {
706 case "sendProxiedMessage-1":
707 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
708 assert.Contains(t, err.Error(), "no deviceID")
709 case "sendProxiedMessage-2":
710 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
711 assert.Contains(t, err.Error(), "no deviceID")
712 case "sendProxiedMessage-3":
713 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
714 assert.Contains(t, err.Error(), "failed-communication")
715 case "sendProxiedMessage-4":
716 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
717 assert.Contains(t, err.Error(), "failed-communication")
718 case "sendProxiedMessage-5":
719 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
720 assert.Contains(t, err.Error(), "failed-communication")
721 case "sendProxiedMessage-6":
722 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
723 assert.Contains(t, err.Error(), "no deviceID")
724
725 }
726
727 })
728 }
729}
730
kdarapu891693b2019-09-16 12:33:49 +0530731func TestDeviceHandler_SendPacketInToCore(t *testing.T) {
732 dh1 := newMockDeviceHandler()
733 dh2 := negativeDeviceHandler()
734
735 type args struct {
736 logicalPort uint32
737 packetPayload []byte
738 }
739 tests := []struct {
740 name string
741 devicehandler *DeviceHandler
742 args args
743 }{
744 {"SendPacketInToCore-1", dh1, args{logicalPort: 1, packetPayload: []byte("test1")}},
745 {"SendPacketInToCore-2", dh1, args{logicalPort: 1, packetPayload: []byte("")}},
746 {"SendPacketInToCore-3", dh2, args{logicalPort: 1, packetPayload: []byte("test1")}},
747 }
748 for _, tt := range tests {
749 t.Run(tt.name, func(t *testing.T) {
Kent Hagermane6ff1012020-07-14 15:07:53 -0400750 _ = tt.devicehandler.SendPacketInToCore(context.Background(), tt.args.logicalPort, tt.args.packetPayload)
751 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530752 })
753 }
754}
755
756func TestDeviceHandler_DisableDevice(t *testing.T) {
757 dh1 := newMockDeviceHandler()
758 dh2 := negativeDeviceHandler()
759 type args struct {
760 device *voltha.Device
761 }
762 tests := []struct {
763 name string
764 devicehandler *DeviceHandler
765 args args
766 wantErr bool
767 }{
768 {"DisableDevice-1", dh1, args{device: dh1.device}, false},
Chaitrashree G S3b4c0352019-09-09 20:59:29 -0400769 {"DisableDevice-2", dh1, args{device: dh2.device}, true},
kdarapu891693b2019-09-16 12:33:49 +0530770 }
771 for _, tt := range tests {
772 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000773 if err := tt.devicehandler.DisableDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530774 t.Errorf("DeviceHandler.DisableDevice() error = %v, wantErr %v", err, tt.wantErr)
775 }
776 })
777 }
778}
779
780func TestDeviceHandler_ReenableDevice(t *testing.T) {
781 dh1 := newMockDeviceHandler()
782 dh2 := negativeDeviceHandler()
783 type args struct {
784 device *voltha.Device
785 }
786 tests := []struct {
787 name string
788 devicehandler *DeviceHandler
789 args args
790 wantErr bool
791 }{
792 {"ReenableDevice-1", dh1, args{device: dh1.device}, false},
793 {"ReenableDevice-2", dh1, args{device: &voltha.Device{}}, true},
794 {"ReenableDevice-3", dh2, args{device: dh1.device}, false},
795 }
796 for _, tt := range tests {
797 t.Run(tt.name, func(t *testing.T) {
798 dh := tt.devicehandler
Neha Sharma96b7bf22020-06-15 10:37:32 +0000799 if err := dh.ReenableDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530800 t.Errorf("DeviceHandler.ReenableDevice() error = %v, wantErr %v", err, tt.wantErr)
801 }
802 })
803 }
804}
805
806func TestDeviceHandler_RebootDevice(t *testing.T) {
807 dh1 := newMockDeviceHandler()
808 dh2 := newMockDeviceHandler()
809 type args struct {
810 device *voltha.Device
811 }
812 tests := []struct {
813 name string
814 devicehandler *DeviceHandler
815 args args
816 wantErr bool
817 }{
818 // TODO: Add test cases.
819 {"RebootDevice-1", dh1, args{device: dh1.device}, false},
820 {"RebootDevice-2", dh1, args{device: dh2.device}, true},
821 {"RebootDevice-3", dh2, args{device: dh2.device}, false},
822 }
823 for _, tt := range tests {
824 t.Run(tt.name, func(t *testing.T) {
825
Neha Sharma96b7bf22020-06-15 10:37:32 +0000826 if err := tt.devicehandler.RebootDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530827 t.Errorf("DeviceHandler.RebootDevice() error = %v, wantErr %v", err, tt.wantErr)
828 }
829 })
830 }
831}
832
833func TestDeviceHandler_handleIndication(t *testing.T) {
834 dh1 := newMockDeviceHandler()
835 dh2 := negativeDeviceHandler()
836 dh3 := newMockDeviceHandler()
Naga Manjunatha8dc9372019-10-31 23:01:18 +0530837 dh3.onus = sync.Map{}
khenaidoo106c61a2021-08-11 18:05:46 -0400838 dh3.onus.Store("onu1", NewOnuDevice("onu1", "onu1", "onu1", 1, 1, "onu1", false, "mock_endpoint"))
839 dh3.onus.Store("onu2", NewOnuDevice("onu2", "onu2", "onu2", 2, 2, "onu2", false, "mock_endpoint"))
Naga Manjunatha8dc9372019-10-31 23:01:18 +0530840
kdarapu891693b2019-09-16 12:33:49 +0530841 type args struct {
842 indication *oop.Indication
843 }
844 tests := []struct {
845 name string
846 deviceHandler *DeviceHandler
847 args args
848 }{
849 // TODO: Add test cases.
850 {"handleIndication-1", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "up"}}}}},
851 {"handleIndication-2", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "down"}}}}},
852 {"handleIndication-3", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "up"}}}}},
853 {"handleIndication-4", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "down"}}}}},
854 {"handleIndication-5", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "nni", IntfId: 1, OperState: "up"}}}}},
855 {"handleIndication-6", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "pon", IntfId: 1, OperState: "up"}}}}},
856 {"handleIndication-7", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuDiscInd{OnuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}}}},
857 {"handleIndication-8", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
858 {"handleIndication-9", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
859 {"handleIndication-10", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
860 {"handleIndication-11", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
861 {"handleIndication-12", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 1, Pkt: []byte("onu123-random value")}}}}},
862 {"handleIndication-13", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", IntfId: 1, GemportId: 1, FlowId: 1234, PortNo: 1}}}}},
863 {"handleIndication-14", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PortStats{PortStats: &oop.PortStatistics{IntfId: 1, RxBytes: 100, RxPackets: 100, RxUcastPackets: 100, RxMcastPackets: 100, RxBcastPackets: 100, RxErrorPackets: 100, TxBytes: 100, TxPackets: 100, TxUcastPackets: 100, TxMcastPackets: 100, TxBcastPackets: 100, TxErrorPackets: 100, RxCrcErrors: 100, BipErrors: 100, Timestamp: 1000}}}}},
864 {"handleIndication-15", dh1, args{indication: &oop.Indication{Data: &oop.Indication_FlowStats{FlowStats: &oop.FlowStatistics{RxBytes: 100, RxPackets: 100, TxBytes: 100, TxPackets: 100, Timestamp: 1000}}}}},
865 {"handleIndication-16", dh1, args{indication: &oop.Indication{Data: &oop.Indication_AlarmInd{AlarmInd: &oop.AlarmIndication{}}}}},
866 {"handleIndication-17", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", FlowId: 1234, PortNo: 1}}}}},
867 {"handleIndication-18", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{}}}}},
868
869 // Negative testcases
870 {"handleIndication-19", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "up"}}}}},
871 {"handleIndication-20", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "down"}}}}},
872 {"handleIndication-21", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "up"}}}}},
873 {"handleIndication-22", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "down"}}}}},
874 {"handleIndication-23", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "nni", IntfId: 1, OperState: "up"}}}}},
875 {"handleIndication-24", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "pon", IntfId: 1, OperState: "up"}}}}},
876 {"handleIndication-25", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuDiscInd{OnuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}}}},
877 {"handleIndication-26", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
878 {"handleIndication-27", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
879 {"handleIndication-28", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
880 {"handleIndication-29", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
881 {"handleIndication-30", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 1, Pkt: []byte("onu123-random value")}}}}},
882 {"handleIndication-31", dh2, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", IntfId: 1, GemportId: 1, FlowId: 1234, PortNo: 1}}}}},
883 {"handleIndication-32", dh2, args{indication: &oop.Indication{Data: &oop.Indication_PortStats{PortStats: &oop.PortStatistics{IntfId: 1, RxBytes: 100, RxPackets: 100, RxUcastPackets: 100, RxMcastPackets: 100, RxBcastPackets: 100, RxErrorPackets: 100, TxBytes: 100, TxPackets: 100, TxUcastPackets: 100, TxMcastPackets: 100, TxBcastPackets: 100, TxErrorPackets: 100, RxCrcErrors: 100, BipErrors: 100, Timestamp: 1000}}}}},
884 {"handleIndication-33", dh2, args{indication: &oop.Indication{Data: &oop.Indication_FlowStats{FlowStats: &oop.FlowStatistics{RxBytes: 100, RxPackets: 100, TxBytes: 100, TxPackets: 100, Timestamp: 1000}}}}},
885 {"handleIndication-34", dh2, args{indication: &oop.Indication{Data: &oop.Indication_AlarmInd{AlarmInd: &oop.AlarmIndication{}}}}},
886 //
887 {"handleIndication-35", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
888 {"handleIndication-36", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
889 {"handleIndication-37", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
890 {"handleIndication-38", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
891 {"handleIndication-30", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 4, Pkt: []byte("onu123-random value")}}}}},
892 {"handleIndication-30", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 4, Pkt: []byte("onu123-random value")}}}}},
893 }
894 for _, tt := range tests {
895 t.Run(tt.name, func(t *testing.T) {
896 dh := tt.deviceHandler
khenaidoo106c61a2021-08-11 18:05:46 -0400897 time.Sleep(5 * time.Millisecond)
npujarec5762e2020-01-01 14:08:48 +0530898 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
899 defer cancel()
900 dh.handleIndication(ctx, tt.args.indication)
kdarapu891693b2019-09-16 12:33:49 +0530901 })
902 }
903}
904
905func TestDeviceHandler_addPort(t *testing.T) {
906 dh1 := newMockDeviceHandler()
907 dh2 := negativeDeviceHandler()
Elia Battiston596406d2022-02-02 12:19:00 +0100908
909 const defaultCapacity = uint32(of.OfpPortFeatures_OFPPF_1GB_FD | of.OfpPortFeatures_OFPPF_FIBER)
kdarapu891693b2019-09-16 12:33:49 +0530910 type args struct {
Elia Battiston596406d2022-02-02 12:19:00 +0100911 intfID uint32
912 portType voltha.Port_PortType
913 state string
914 speedMbps uint32
kdarapu891693b2019-09-16 12:33:49 +0530915 }
916 tests := []struct {
Elia Battiston596406d2022-02-02 12:19:00 +0100917 name string
918 devicehandler *DeviceHandler
919 args args
920 expectedCapacity uint32
kdarapu891693b2019-09-16 12:33:49 +0530921 }{
922 // State up
Elia Battiston596406d2022-02-02 12:19:00 +0100923 {"addPort.1", dh1, args{intfID: 1, portType: voltha.Port_UNKNOWN, state: "up"}, defaultCapacity},
924 {"addPort.2", dh1, args{intfID: 1, portType: voltha.Port_VENET_OLT, state: "up"}, defaultCapacity},
925 {"addPort.3", dh1, args{intfID: 1, portType: voltha.Port_VENET_ONU, state: "up"}, defaultCapacity},
926 {"addPort.4", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
927 {"addPort.5", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "up"}, defaultCapacity},
928 {"addPort.6", dh1, args{intfID: 1, portType: voltha.Port_PON_OLT, state: "up"}, defaultCapacity},
929 {"addPort.7", dh1, args{intfID: 1, portType: voltha.Port_PON_ONU, state: "up"}, defaultCapacity},
930 {"addPort.8", dh1, args{intfID: 1, portType: 8, state: "up"}, defaultCapacity},
kdarapu891693b2019-09-16 12:33:49 +0530931 // state discovery
Elia Battiston596406d2022-02-02 12:19:00 +0100932 {"addPort.9", dh1, args{intfID: 1, portType: voltha.Port_UNKNOWN, state: "down"}, defaultCapacity},
933 {"addPort.10", dh1, args{intfID: 1, portType: voltha.Port_VENET_OLT, state: "down"}, defaultCapacity},
934 {"addPort.11", dh1, args{intfID: 1, portType: voltha.Port_VENET_ONU, state: "down"}, defaultCapacity},
935 {"addPort.12", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "down", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
936 {"addPort.13", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "down"}, defaultCapacity},
937 {"addPort.14", dh1, args{intfID: 1, portType: voltha.Port_PON_OLT, state: "down"}, defaultCapacity},
938 {"addPort.15", dh1, args{intfID: 1, portType: voltha.Port_PON_ONU, state: "down"}, defaultCapacity},
939 {"addPort.16", dh1, args{intfID: 1, portType: 8, state: "down"}, defaultCapacity},
kdarapu891693b2019-09-16 12:33:49 +0530940
Elia Battiston596406d2022-02-02 12:19:00 +0100941 {"addPort.17", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
942 {"addPort.18", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "up"}, defaultCapacity},
943 {"addPort.19", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "down", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
944 {"addPort.20", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "down"}, defaultCapacity},
945
946 // NNI speeds
947 {"addPort.21", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 0}, defaultCapacity},
948 {"addPort.22", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 10}, uint32(of.OfpPortFeatures_OFPPF_10MB_FD | of.OfpPortFeatures_OFPPF_FIBER)},
949 {"addPort.23", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 100}, uint32(of.OfpPortFeatures_OFPPF_100MB_FD | of.OfpPortFeatures_OFPPF_FIBER)},
950 {"addPort.24", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 1000}, uint32(of.OfpPortFeatures_OFPPF_1GB_FD | of.OfpPortFeatures_OFPPF_FIBER)},
951 {"addPort.25", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 10000}, uint32(of.OfpPortFeatures_OFPPF_10GB_FD | of.OfpPortFeatures_OFPPF_FIBER)},
952 {"addPort.26", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 40000}, uint32(of.OfpPortFeatures_OFPPF_40GB_FD | of.OfpPortFeatures_OFPPF_FIBER)},
953 {"addPort.27", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 100000}, uint32(of.OfpPortFeatures_OFPPF_100GB_FD | of.OfpPortFeatures_OFPPF_FIBER)},
954 {"addPort.28", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 1000000}, uint32(of.OfpPortFeatures_OFPPF_1TB_FD | of.OfpPortFeatures_OFPPF_FIBER)},
955 {"addPort.29", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 12345}, uint32(of.OfpPortFeatures_OFPPF_OTHER | of.OfpPortFeatures_OFPPF_FIBER)},
kdarapu891693b2019-09-16 12:33:49 +0530956 }
957 for _, tt := range tests {
958 t.Run(tt.name, func(t *testing.T) {
Elia Battiston596406d2022-02-02 12:19:00 +0100959 _ = tt.devicehandler.addPort(context.Background(), tt.args.intfID, tt.args.portType, tt.args.state, tt.args.speedMbps)
960
961 //Check if the correct state is stored
962 storedState, ok := tt.devicehandler.activePorts.Load(tt.args.intfID)
963 expectedState := tt.args.state == "up"
964
965 if !ok {
966 t.Errorf("Port state not stored in test %v", tt.name)
967 } else if storedState != expectedState {
968 t.Errorf("Expected stored port state: %v, found: %v in test %v", expectedState, storedState, tt.name)
969 }
970
971 //Check if the reported speed values are correct
972 ofpPort := makeOfpPort(tt.devicehandler.device.MacAddress, tt.args.speedMbps)
973
974 if ofpPort.Curr != tt.expectedCapacity ||
975 ofpPort.Advertised != tt.expectedCapacity ||
976 ofpPort.Peer != tt.expectedCapacity {
977 t.Errorf("Expected port capacity: %v, found: (%v,%v,%v) in test %v", tt.expectedCapacity, ofpPort.Curr, ofpPort.Advertised, ofpPort.Peer, tt.name)
978 }
979
980 var expectedSpeedKbps uint32
981 if tt.args.speedMbps == 0 {
982 expectedSpeedKbps = defaultPortSpeedMbps * 1000
983 } else {
984 expectedSpeedKbps = tt.args.speedMbps * 1000
985 }
986
987 if ofpPort.CurrSpeed != expectedSpeedKbps ||
988 ofpPort.MaxSpeed != expectedSpeedKbps {
989 t.Errorf("Expected port speed: %v, found: (%v,%v) in test %v", expectedSpeedKbps, ofpPort.CurrSpeed, ofpPort.MaxSpeed, tt.name)
990 }
kdarapu891693b2019-09-16 12:33:49 +0530991 })
992 }
993}
994
995func Test_macAddressToUint32Array(t *testing.T) {
996 type args struct {
997 mac string
998 }
999 tests := []struct {
1000 name string
1001 args args
1002 want []uint32
1003 }{
1004 // TODO: Add test cases.
1005 {"macAddressToUint32Array-1", args{mac: "00:00:00:00:00:01"}, []uint32{0, 0, 0, 0, 0, 1}},
1006 {"macAddressToUint32Array-2", args{mac: "0abcdef"}, []uint32{11259375}},
1007 {"macAddressToUint32Array-3", args{mac: "testing"}, []uint32{1, 2, 3, 4, 5, 6}},
1008 }
1009 for _, tt := range tests {
1010 t.Run(tt.name, func(t *testing.T) {
1011 if got := macAddressToUint32Array(tt.args.mac); !reflect.DeepEqual(got, tt.want) {
1012 t.Errorf("macAddressToUint32Array() = %v, want %v", got, tt.want)
1013 }
1014 })
1015 }
1016}
1017
1018func TestDeviceHandler_handleOltIndication(t *testing.T) {
1019
1020 type args struct {
1021 oltIndication *oop.OltIndication
1022 }
1023 tests := []struct {
1024 name string
1025 args args
1026 }{
1027 {"handleOltIndication-1", args{oltIndication: &oop.OltIndication{OperState: "up"}}},
1028 {"handleOltIndication-2", args{oltIndication: &oop.OltIndication{OperState: "down"}}},
1029 }
1030 for _, tt := range tests {
1031 t.Run(tt.name, func(t *testing.T) {
1032 dh := newMockDeviceHandler()
npujarec5762e2020-01-01 14:08:48 +05301033 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1034 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001035 if err := dh.handleOltIndication(ctx, tt.args.oltIndication); err != nil {
1036 t.Error(err)
1037 }
kdarapu891693b2019-09-16 12:33:49 +05301038 })
1039 }
1040}
1041
1042func TestDeviceHandler_AdoptDevice(t *testing.T) {
1043 dh1 := newMockDeviceHandler()
1044 dh2 := negativeDeviceHandler()
1045 type args struct {
1046 device *voltha.Device
1047 }
1048 tests := []struct {
1049 name string
1050 devicehandler *DeviceHandler
1051 args args
1052 }{
1053 // TODO: Add test cases.
1054 {"AdoptDevice-1", dh1, args{device: dh1.device}},
Naga Manjunath7615e552019-10-11 22:35:47 +05301055 {"AdoptDevice-2", dh2, args{device: dh2.device}},
kdarapu891693b2019-09-16 12:33:49 +05301056 }
1057 for _, tt := range tests {
1058 t.Run(tt.name, func(t *testing.T) {
1059 //dh.doStateInit()
1060 // context.
1061 //dh.AdoptDevice(tt.args.device)
npujarec5762e2020-01-01 14:08:48 +05301062 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1063 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001064 if err := tt.devicehandler.postInit(ctx); err != nil {
1065 t.Error(err)
1066 }
kdarapu891693b2019-09-16 12:33:49 +05301067 })
1068 }
1069}
1070
1071func TestDeviceHandler_activateONU(t *testing.T) {
1072 dh := newMockDeviceHandler()
1073 dh1 := negativeDeviceHandler()
1074 type args struct {
1075 intfID uint32
1076 onuID int64
1077 serialNum *oop.SerialNumber
1078 serialNumber string
1079 }
1080 tests := []struct {
1081 name string
1082 devicehandler *DeviceHandler
1083 args args
1084 }{
Girish Gowdra38d533d2020-03-30 20:38:51 -07001085 {"activateONU-1", dh, args{intfID: 0, onuID: 1, serialNum: &oop.SerialNumber{VendorId: []byte("onu1")}}},
1086 {"activateONU-2", dh, args{intfID: 1, onuID: 2, serialNum: &oop.SerialNumber{VendorId: []byte("onu2")}}},
1087 {"activateONU-3", dh1, args{intfID: 0, onuID: 1, serialNum: &oop.SerialNumber{VendorId: []byte("onu1")}}},
1088 {"activateONU-4", dh1, args{intfID: 1, onuID: 2, serialNum: &oop.SerialNumber{VendorId: []byte("onu2")}}},
kdarapu891693b2019-09-16 12:33:49 +05301089 }
1090 for _, tt := range tests {
1091 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301092 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1093 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001094 _ = tt.devicehandler.activateONU(ctx, tt.args.intfID, tt.args.onuID, tt.args.serialNum, tt.args.serialNumber)
1095 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301096 })
1097 }
1098}
1099
1100func TestDeviceHandler_start(t *testing.T) {
1101 dh := newMockDeviceHandler()
1102 dh1 := negativeDeviceHandler()
1103 dh.start(context.Background())
khenaidooefff76e2021-12-15 16:51:30 -05001104 dh.Stop(context.Background())
kdarapu891693b2019-09-16 12:33:49 +05301105
1106 dh1.start(context.Background())
khenaidooefff76e2021-12-15 16:51:30 -05001107 dh1.Stop(context.Background())
kdarapu891693b2019-09-16 12:33:49 +05301108
1109}
1110
1111func TestDeviceHandler_PacketOut(t *testing.T) {
1112 dh1 := newMockDeviceHandler()
1113 dh2 := negativeDeviceHandler()
1114 acts := []*ofp.OfpAction{
1115 fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA))),
1116 fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101)),
1117 fu.Output(1),
1118 }
1119 pktout := &ofp.OfpPacketOut{BufferId: 0, InPort: 1, Actions: acts, Data: []byte("AYDCAAAOAODsSE5TiMwCBwQA4OxITlIEBQUwLzUxBgIAFAgEMC81MQoJbG9jYWxob3N0EBwFAawbqqACAAAAoRAxLjMuNi4xLjQuMS40NDEz/gYAgMILAgD+GQCAwgkDAAAAAGQAAAAAAAAAAgICAgICAgL+GQCAwgoDAAAAAGQAAAAAAAAAAgICAgICAgIAAA==")}
1120 type args struct {
1121 egressPortNo int
1122 packet *of.OfpPacketOut
1123 }
1124 tests := []struct {
1125 name string
1126 devicehandler *DeviceHandler
1127 args args
1128 wantErr bool
1129 }{
1130 // TODO: Add test cases.
1131 //{"test1", args{egressPortNo: 0, packet: &ofp.OfpPacketOut{}}, true},
1132 {"PacketOut-1", dh1, args{egressPortNo: 0, packet: pktout}, false},
1133 {"PacketOut-2", dh2, args{egressPortNo: 1, packet: pktout}, false},
Matteo Scandolo2c0d2742020-06-10 11:28:42 -07001134 {"PacketOut-3", dh2, args{egressPortNo: 4112, packet: pktout}, false},
Mahir Gunyel0c009fc2021-10-22 17:47:16 -07001135 {"PacketOut-4", dh1, args{egressPortNo: 16777217, packet: pktout}, false},
1136 {"PacketOut-5", dh2, args{egressPortNo: 16777216, packet: pktout}, false},
kdarapu891693b2019-09-16 12:33:49 +05301137 }
1138 for _, tt := range tests {
1139 t.Run(tt.name, func(t *testing.T) {
1140 dh := tt.devicehandler
npujarec5762e2020-01-01 14:08:48 +05301141 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1142 defer cancel()
khenaidoo106c61a2021-08-11 18:05:46 -04001143 if err := dh.PacketOut(ctx, uint32(tt.args.egressPortNo), tt.args.packet); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +05301144 t.Errorf("DeviceHandler.PacketOut() error = %v, wantErr %v", err, tt.wantErr)
1145 }
1146 })
1147 }
1148}
1149
1150//
1151func TestDeviceHandler_doStateUp(t *testing.T) {
1152 dh1 := newMockDeviceHandler()
1153 dh2 := newMockDeviceHandler()
1154
Thomas Lee S985938d2020-05-04 11:40:41 +05301155 dh2.device.Id = ""
kdarapu891693b2019-09-16 12:33:49 +05301156 dh3 := negativeDeviceHandler()
1157
1158 tests := []struct {
1159 name string
1160 devicehandler *DeviceHandler
1161 wantErr bool
1162 }{
1163 {"dostateup-1", dh1, false},
1164 {"dostateup-2", dh2, false},
1165 {"dostateup-3", dh3, true},
1166 }
1167 for _, tt := range tests {
1168 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301169 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1170 defer cancel()
1171 if err := tt.devicehandler.doStateUp(ctx); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +05301172 t.Logf("DeviceHandler.doStateUp() error = %v, wantErr %v", err, tt.wantErr)
1173 }
Thomas Lee S85f37312020-04-03 17:06:12 +05301174 tt.devicehandler.stopCollector <- true //stop the stat collector invoked from doStateUp
kdarapu891693b2019-09-16 12:33:49 +05301175 })
1176 }
1177}
1178func TestDeviceHandler_doStateDown(t *testing.T) {
1179 dh1 := newMockDeviceHandler()
1180 dh2 := negativeDeviceHandler()
1181 dh3 := newMockDeviceHandler()
1182 dh3.device.OperStatus = voltha.OperStatus_UNKNOWN
1183 tests := []struct {
1184 name string
1185 devicehandler *DeviceHandler
1186 wantErr bool
1187 }{
1188 {"dostatedown-1", dh1, false},
1189 {"dostatedown-2", dh2, true},
1190 {"dostatedown-2", dh3, true},
1191 }
1192 for _, tt := range tests {
1193 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301194 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1195 defer cancel()
1196 if err := tt.devicehandler.doStateDown(ctx); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +05301197 t.Logf("DeviceHandler.doStateDown() error = %v", err)
Kent Hagermane6ff1012020-07-14 15:07:53 -04001198 //TODO: should fail this test case (Errorf) if result is not as expected
kdarapu891693b2019-09-16 12:33:49 +05301199 }
1200 })
1201 }
1202}
1203
1204func TestDeviceHandler_GetOfpDeviceInfo(t *testing.T) {
1205 dh1 := newMockDeviceHandler()
1206 dh2 := negativeDeviceHandler()
1207 type args struct {
1208 device *voltha.Device
1209 }
1210 tests := []struct {
1211 name string
1212 devicehandler *DeviceHandler
1213 args args
1214 wantErr bool
1215 }{
1216 // TODO: Add test cases.
1217 {"GetOfpDeviceInfo-1", dh1, args{dh1.device}, false},
1218 {"GetOfpDeviceInfo-2", dh1, args{&voltha.Device{}}, false},
1219 {"GetOfpDeviceInfo-3", dh2, args{dh1.device}, false},
1220 }
1221 for _, tt := range tests {
1222 t.Run(tt.name, func(t *testing.T) {
1223 dh := tt.devicehandler
1224 _, err := dh.GetOfpDeviceInfo(tt.args.device)
1225 if (err != nil) != tt.wantErr {
1226 t.Errorf("DeviceHandler.GetOfpDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
1227 return
1228 }
1229 })
1230 }
1231}
1232
kdarapu891693b2019-09-16 12:33:49 +05301233func TestDeviceHandler_onuDiscIndication(t *testing.T) {
1234
1235 dh1 := newMockDeviceHandler()
Naga Manjunatha8dc9372019-10-31 23:01:18 +05301236 dh1.discOnus = sync.Map{}
1237 dh1.discOnus.Store("onu1", true)
1238 dh1.discOnus.Store("onu2", false)
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +05301239 dh1.discOnus.Store("onu3", true)
1240 dh1.discOnus.Store("onu4", true)
1241 dh1.onus = sync.Map{}
khenaidoo106c61a2021-08-11 18:05:46 -04001242 dh1.onus.Store("onu3", NewOnuDevice("onu3", "onu3", "onu3", 3, 3, "onu3", true, "mock_endpoint"))
1243 dh1.onus.Store("onu4", NewOnuDevice("onu4", "onu4", "onu4", 4, 4, "onu4", true, "mock_endpoint"))
kdarapu891693b2019-09-16 12:33:49 +05301244 dh2 := negativeDeviceHandler()
1245 type args struct {
1246 onuDiscInd *oop.OnuDiscIndication
1247 sn string
1248 }
1249 tests := []struct {
1250 name string
1251 devicehandler *DeviceHandler
1252 args args
1253 }{
1254 // TODO: Add test cases.
1255 {"onuDiscIndication-1", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}},
1256 {"onuDiscIndication-2", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{}}}},
1257 {"onuDiscIndication-3", dh1, args{onuDiscInd: &oop.OnuDiscIndication{SerialNumber: &oop.SerialNumber{}}}},
1258 {"onuDiscIndication-4", dh1, args{onuDiscInd: &oop.OnuDiscIndication{}}},
1259 {"onuDiscIndication-5", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu1"}},
1260 {"onuDiscIndication-6", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu2"}},
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +05301261 {"onuDiscIndication-7", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 3, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu3"}},
1262 {"onuDiscIndication-8", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 3, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu4"}},
1263 {"onuDiscIndication-9", dh2, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}},
kdarapu891693b2019-09-16 12:33:49 +05301264 }
1265 for _, tt := range tests {
1266 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301267 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1268 defer cancel()
Mahir Gunyelb0046752021-02-26 13:51:05 -08001269 _ = tt.devicehandler.onuDiscIndication(ctx, tt.args.onuDiscInd)
Kent Hagermane6ff1012020-07-14 15:07:53 -04001270 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301271 })
1272 }
1273}
1274
1275func TestDeviceHandler_populateDeviceInfo(t *testing.T) {
1276 dh1 := newMockDeviceHandler()
1277 dh2 := negativeDeviceHandler()
1278 tests := []struct {
1279 name string
1280 devicehandler *DeviceHandler
1281
1282 wantErr bool
1283 }{
1284 // TODO: Add test cases.
1285 {"populateDeviceInfo-1", dh1, false},
1286 {"populateDeviceInfo-2", dh1, true},
1287 {"populateDeviceInfo-3", dh1, true},
1288 {"populateDeviceInfo-4", dh1, true},
1289 {"populateDeviceInfo-5", dh2, true},
1290 }
1291 for _, tt := range tests {
1292 t.Run(tt.name, func(t *testing.T) {
1293
Neha Sharma96b7bf22020-06-15 10:37:32 +00001294 _, err := tt.devicehandler.populateDeviceInfo(context.Background())
kdarapu891693b2019-09-16 12:33:49 +05301295 if (err != nil) != tt.wantErr {
1296 t.Errorf("DeviceHandler.populateDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
1297 return
1298 }
1299
1300 })
1301 }
1302}
1303
1304func TestDeviceHandler_readIndications(t *testing.T) {
1305 dh1 := newMockDeviceHandler()
1306 dh2 := newMockDeviceHandler()
kdarapu891693b2019-09-16 12:33:49 +05301307 dh3 := newMockDeviceHandler()
1308 dh3.device.AdminState = voltha.AdminState_DISABLED
1309 dh4 := negativeDeviceHandler()
1310 tests := []struct {
1311 name string
1312 devicehandler *DeviceHandler
1313 }{
1314 // TODO: Add test cases.
1315 {"readIndications-1", dh1},
1316 {"readIndications-2", dh2},
1317 {"readIndications-3", dh2},
1318 {"readIndications-4", dh2},
1319 {"readIndications-5", dh2},
1320 {"readIndications-6", dh3},
1321 {"readIndications-7", dh3},
1322 {"readIndications-8", dh4},
1323 }
1324 for _, tt := range tests {
1325 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301326 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1327 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001328 _ = tt.devicehandler.readIndications(ctx)
1329 // TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301330 })
1331 }
1332}
Naga Manjunath7615e552019-10-11 22:35:47 +05301333
1334func Test_startCollector(t *testing.T) {
1335 type args struct {
1336 dh *DeviceHandler
1337 }
1338 dh := newMockDeviceHandler()
khenaidoo106c61a2021-08-11 18:05:46 -04001339 mcs := newMockCoreService()
1340 mcs.DevicePorts[dh.device.Id] = []*voltha.Port{
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301341 {PortNo: 1, Label: "pon", Type: voltha.Port_PON_OLT},
Mahir Gunyel0c009fc2021-10-22 17:47:16 -07001342 {PortNo: 16777216, Label: "nni", Type: voltha.Port_ETHERNET_NNI},
1343 {PortNo: 16777218, Label: "nni", Type: voltha.Port_ETHERNET_NNI},
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301344 }
khenaidoo106c61a2021-08-11 18:05:46 -04001345 dh.coreClient.SetService(mcs)
Naga Manjunath7615e552019-10-11 22:35:47 +05301346 dh.portStats.NorthBoundPort = make(map[uint32]*NniPort)
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301347 dh.portStats.NorthBoundPort[1] = &NniPort{Name: "OLT-1"}
1348 dh.portStats.NorthBoundPort[2] = &NniPort{Name: "OLT-1"}
Naga Manjunath7615e552019-10-11 22:35:47 +05301349 dh.portStats.SouthBoundPort = make(map[uint32]*PonPort)
1350 dh.portStats.Device = dh
1351 for i := 0; i < 16; i++ {
1352 dh.portStats.SouthBoundPort[uint32(i)] = &PonPort{DeviceID: "OLT-1"}
1353 }
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301354 dh1 := newMockDeviceHandler()
khenaidoo106c61a2021-08-11 18:05:46 -04001355 mcs = newMockCoreService()
1356 mcs.DevicePorts[dh.device.Id] = []*voltha.Port{}
1357 dh.coreClient.SetService(mcs)
Naga Manjunath7615e552019-10-11 22:35:47 +05301358 tests := []struct {
1359 name string
1360 args args
1361 }{
1362 // TODO: Add test cases.
1363 {"StartCollector-1", args{dh}},
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301364 {"StartCollector-2", args{dh1}},
Naga Manjunath7615e552019-10-11 22:35:47 +05301365 }
1366 for _, tt := range tests {
1367 t.Run(tt.name, func(t *testing.T) {
1368 go func() {
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301369 time.Sleep(1 * time.Second) // simulated wait time to stop startCollector
Naga Manjunath7615e552019-10-11 22:35:47 +05301370 tt.args.dh.stopCollector <- true
1371 }()
Neha Sharma96b7bf22020-06-15 10:37:32 +00001372 startCollector(context.Background(), tt.args.dh)
Naga Manjunath7615e552019-10-11 22:35:47 +05301373 })
1374 }
1375}
Gamze Abakac2c32a62021-03-11 11:44:18 +00001376
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +05301377/* We are not using the adapterPreviouslyConnected and agentPreviouslyConnected flags now to check for reboots and reconnects
1378commenting out all the tests related to these
Gamze Abakac2c32a62021-03-11 11:44:18 +00001379func TestDeviceHandler_TestReconcileStatus(t *testing.T) {
1380
1381 // olt disconnect (not reboot)
1382 dh1 := newMockDeviceHandler()
1383 dh1.adapterPreviouslyConnected = false
1384 dh1.agentPreviouslyConnected = true
1385
1386 // adapter restart
1387 dh2 := newMockDeviceHandler()
1388 dh2.Client = &mocks.MockOpenoltClient{}
1389 dh2.adapterPreviouslyConnected = true
1390 dh2.agentPreviouslyConnected = true
1391
1392 // first connection or olt restart
1393 dh3 := newMockDeviceHandler()
1394 dh3.Client = &mocks.MockOpenoltClient{}
1395 dh3.adapterPreviouslyConnected = false
1396 dh3.agentPreviouslyConnected = false
1397
1398 // olt and adapter restart at the same time (first case)
1399 dh4 := newMockDeviceHandler()
1400 dh4.Client = &mocks.MockOpenoltClient{}
1401 dh4.adapterPreviouslyConnected = true
1402 dh4.agentPreviouslyConnected = false
1403
1404 // adapter restart and olt disconnect at the same time
1405 dh5 := newMockDeviceHandler()
1406 dh5.Client = &mocks.MockOpenoltClient{}
1407 dh5.adapterPreviouslyConnected = true
1408 dh5.agentPreviouslyConnected = true
1409
1410 tests := []struct {
1411 name string
1412 devicehandler *DeviceHandler
1413 expectedRestart bool
1414 wantErr bool
1415 }{
1416 {"dostateup-1", dh1, true, false},
1417 {"dostateup-2", dh2, false, false},
1418 {"dostateup-3", dh3, false, false},
1419 {"dostateup-4", dh4, true, false},
1420 {"dostateup-5", dh5, false, false},
1421 }
1422 for _, tt := range tests {
1423 t.Run(tt.name, func(t *testing.T) {
1424 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1425 defer cancel()
1426 if err := tt.devicehandler.doStateUp(ctx); (err != nil) != tt.wantErr {
1427 t.Logf("DeviceHandler.doStateUp() error = %v, wantErr %v", err, tt.wantErr)
1428 }
1429 tt.devicehandler.stopCollector <- true //stop the stat collector invoked from doStateUp
1430 isRestarted := tt.devicehandler.Client.(*mocks.MockOpenoltClient).IsRestarted
1431 if tt.expectedRestart != isRestarted {
1432 t.Errorf("olt-reboot-failed expected= %v, got= %v", tt.expectedRestart, isRestarted)
1433 }
1434 })
1435 }
1436}
Abhilash Laxmeshward0f58cf2022-06-01 12:15:19 +05301437*/
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001438func Test_UpdateFlowsIncrementallyNegativeTestCases(t *testing.T) {
1439 dh1 := negativeDeviceHandlerNilFlowMgr()
1440 tests := []struct {
1441 name string
1442 devicehandler *DeviceHandler
1443 wantErr bool
1444 }{
1445 {"update-flow-when-device-handler-is-nil", dh1, true},
1446 }
1447
khenaidoodc2116e2021-10-19 17:33:19 -04001448 flowMetadata0 := of.FlowMetadata{Meters: []*of.OfpMeterConfig{
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001449 {
1450 Flags: 5,
1451 MeterId: 1,
khenaidoodc2116e2021-10-19 17:33:19 -04001452 Bands: []*of.OfpMeterBandHeader{
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001453 {
khenaidoodc2116e2021-10-19 17:33:19 -04001454 Type: of.OfpMeterBandType_OFPMBT_DROP,
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001455 Rate: 16000,
1456 BurstSize: 0,
1457 },
1458 {
khenaidoodc2116e2021-10-19 17:33:19 -04001459 Type: of.OfpMeterBandType_OFPMBT_DROP,
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001460 Rate: 32000,
1461 BurstSize: 30,
1462 },
1463 {
khenaidoodc2116e2021-10-19 17:33:19 -04001464 Type: of.OfpMeterBandType_OFPMBT_DROP,
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001465 Rate: 64000,
1466 BurstSize: 30,
1467 },
1468 },
1469 },
1470 }}
1471
1472 kwTable0Meter1 := make(map[string]uint64)
1473 kwTable0Meter1["table_id"] = 0
1474 kwTable0Meter1["meter_id"] = 1
1475 kwTable0Meter1["write_metadata"] = 0x4000000000 // Tech-Profile-ID 64
1476
1477 // Upstream flow DHCP flow - ONU1 UNI0 PON0
1478 fa0 := &fu.FlowArgs{
1479 MatchFields: []*ofp.OfpOxmOfbField{
1480 fu.InPort(536870912),
1481 fu.Metadata_ofp(1),
1482 fu.IpProto(17), // dhcp
1483 fu.VlanPcp(0),
1484 fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT)),
1485 fu.TunnelId(256),
1486 },
1487 Actions: []*ofp.OfpAction{
1488 //fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
1489 fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
1490 fu.Output(2147483645),
1491 fu.PushVlan(0x8100),
1492 },
1493 KV: kwTable0Meter1,
1494 }
1495
1496 flow0, _ := fu.MkFlowStat(fa0)
khenaidoodc2116e2021-10-19 17:33:19 -04001497 flowAdd := of.Flows{Items: make([]*of.OfpFlowStats, 0)}
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001498 flowAdd.Items = append(flowAdd.Items, flow0)
khenaidoodc2116e2021-10-19 17:33:19 -04001499 flowRemove := of.Flows{Items: make([]*of.OfpFlowStats, 0)}
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001500 flowChanges := &ofp.FlowChanges{ToAdd: &flowAdd, ToRemove: &flowRemove}
1501
1502 for _, tt := range tests {
1503 t.Run(tt.name, func(t *testing.T) {
1504 err := tt.devicehandler.UpdateFlowsIncrementally(context.Background(), tt.devicehandler.device, flowChanges, nil, &flowMetadata0)
1505 if (err != nil) != tt.wantErr {
1506 t.Errorf("DeviceHandler.populateDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
1507 return
1508 }
1509 })
1510 }
1511}