blob: 9c5961c5a236f77f5f765a0a2731e432b52dc7b2 [file] [log] [blame]
kdarapu381c6902019-07-31 18:23:16 +05301/*
2 * Copyright 2018-present Open Networking Foundation
3
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 },
162 ConnectStatus: 1,
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}
khenaidoo106c61a2021-08-11 18:05:46 -0400170 openOLT := &OpenOLT{eventProxy: ep, config: cfg}
171 dh := NewDeviceHandler(cc, ep, device, openOLT, cm, cfg)
Girish Gowdra38d533d2020-03-30 20:38:51 -0700172 oopRanges := []*oop.DeviceInfo_DeviceResourceRanges{{
Girish Gowdrafb3d6102020-10-16 16:32:36 -0700173 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 -0700174 Technology: "xgs-pon",
175 Pools: []*oop.DeviceInfo_DeviceResourceRanges_Pool{{}},
176 }}
177
Girish Gowdra9602eb42020-09-09 15:50:39 -0700178 deviceInf := &oop.DeviceInfo{Vendor: "openolt", Ranges: oopRanges, Model: "openolt", DeviceId: dh.device.Id, PonPorts: NumPonPorts}
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700179 dh.deviceInfo = deviceInf
khenaidoo106c61a2021-08-11 18:05:46 -0400180 dh.device = device
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700181 dh.resourceMgr = make([]*resourcemanager.OpenOltResourceMgr, deviceInf.PonPorts)
182 var i uint32
183 for i = 0; i < deviceInf.PonPorts; i++ {
184 dh.resourceMgr[i] = &resourcemanager.OpenOltResourceMgr{DeviceID: dh.device.Id, DeviceType: dh.device.Type, DevInfo: deviceInf,
185 KVStore: &db.Backend{
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700186 StoreType: "etcd",
187 Client: &mocks.MockKVClient{},
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700188 }}
189 dh.resourceMgr[i].InitLocalCache()
190 }
Girish Gowdra38d533d2020-03-30 20:38:51 -0700191
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530192 ranges := make(map[string]interface{})
193 sharedIdxByType := make(map[string]string)
194 sharedIdxByType["ALLOC_ID"] = "ALLOC_ID"
195 sharedIdxByType["ONU_ID"] = "ONU_ID"
196 sharedIdxByType["GEMPORT_ID"] = "GEMPORT_ID"
197 sharedIdxByType["FLOW_ID"] = "FLOW_ID"
198 ranges["ONU_ID"] = uint32(0)
199 ranges["GEMPORT_ID"] = uint32(0)
200 ranges["ALLOC_ID"] = uint32(0)
201 ranges["FLOW_ID"] = uint32(0)
202 ranges["onu_id_shared"] = uint32(0)
203 ranges["alloc_id_shared"] = uint32(0)
204 ranges["gemport_id_shared"] = uint32(0)
205 ranges["flow_id_shared"] = uint32(0)
206
Matteo Scandolo84585372021-03-18 14:21:22 -0700207 ponmgr := &ponrmgr.PONResourceManager{}
Matteo Scandolo84585372021-03-18 14:21:22 -0700208 ponmgr.DeviceID = "onu-1"
209 ponmgr.IntfIDs = []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
210 ponmgr.KVStore = &db.Backend{
211 Client: &mocks.MockKVClient{},
212 }
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700213 ponmgr.KVStoreForConfig = &db.Backend{
214 Client: &mocks.MockKVClient{},
215 }
216 ponmgr.Backend = "etcd"
Matteo Scandolo84585372021-03-18 14:21:22 -0700217 ponmgr.PonResourceRanges = ranges
218 ponmgr.SharedIdxByType = sharedIdxByType
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700219 ponmgr.Technology = "XGS-PON"
220 for i = 0; i < deviceInf.PonPorts; i++ {
221 dh.resourceMgr[i].PonRsrMgr = ponmgr
222 }
223
npujarec5762e2020-01-01 14:08:48 +0530224 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
225 defer cancel()
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700226 dh.groupMgr = NewGroupManager(ctx, dh, dh.resourceMgr[0])
Girish Gowdra9602eb42020-09-09 15:50:39 -0700227 dh.totalPonPorts = NumPonPorts
228 dh.flowMgr = make([]*OpenOltFlowMgr, dh.totalPonPorts)
Girish Gowdra8a0bdcd2021-05-13 12:31:04 -0700229 for i = 0; i < dh.totalPonPorts; i++ {
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700230 dh.flowMgr[i] = &OpenOltFlowMgr{}
231 dh.flowMgr[i].deviceHandler = dh
232 dh.flowMgr[i].ponPortIdx = i
233 dh.flowMgr[i].grpMgr = dh.groupMgr
234 dh.flowMgr[i].resourceMgr = dh.resourceMgr[i]
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700235 dh.flowMgr[i].techprofile = mocks.MockTechProfile{}
236 dh.flowMgr[i].gemToFlowIDs = make(map[uint32][]uint64)
237 dh.flowMgr[i].packetInGemPort = make(map[resourcemanager.PacketInInfoKey]uint32)
238 dh.flowMgr[i].flowIDToGems = make(map[uint64][]uint32)
239
Girish Gowdra76a1b092021-07-28 10:07:04 -0700240 dh.resourceMgr[i].TechprofileRef = dh.flowMgr[i].techprofile
241
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700242 // Create a slice of buffered channels for handling concurrent flows per ONU.
243 // 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 -0700244 dh.flowMgr[i].incomingFlows = make([]chan flowControlBlock, plt.MaxOnusPerPon+1)
245 dh.flowMgr[i].stopFlowHandlerRoutine = make([]chan bool, plt.MaxOnusPerPon+1)
246 dh.flowMgr[i].flowHandlerRoutineActive = make([]bool, plt.MaxOnusPerPon+1)
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700247 for j := range dh.flowMgr[i].incomingFlows {
248 dh.flowMgr[i].incomingFlows[j] = make(chan flowControlBlock, maxConcurrentFlowsPerOnu)
Girish Gowdra4736e5c2021-08-25 15:19:10 -0700249 dh.flowMgr[i].stopFlowHandlerRoutine[j] = make(chan bool, 1)
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700250 // Spin up a go routine to handling incoming flows (add/remove).
251 // There will be on go routine per ONU.
252 // This routine will be blocked on the flowMgr.incomingFlows[onu-id] channel for incoming flows.
Girish Gowdra4736e5c2021-08-25 15:19:10 -0700253 dh.flowMgr[i].flowHandlerRoutineActive[j] = true
254 go dh.flowMgr[i].perOnuFlowHandlerRoutine(j, dh.flowMgr[i].incomingFlows[j], dh.flowMgr[i].stopFlowHandlerRoutine[j])
Girish Gowdra9602eb42020-09-09 15:50:39 -0700255 }
Girish Gowdra4c3d4602021-07-22 16:33:37 -0700256 dh.flowMgr[i].onuGemInfoMap = make(map[uint32]*resourcemanager.OnuGemInfo)
Girish Gowdra9602eb42020-09-09 15:50:39 -0700257 }
kdarapu891693b2019-09-16 12:33:49 +0530258 dh.Client = &mocks.MockOpenoltClient{}
kesavand39e0aa32020-01-28 20:58:50 -0500259 dh.eventMgr = &OpenOltEventMgr{eventProxy: &mocks.MockEventProxy{}, handler: dh}
kdarapu891693b2019-09-16 12:33:49 +0530260 dh.transitionMap = &TransitionMap{}
Naga Manjunath7615e552019-10-11 22:35:47 +0530261 dh.portStats = &OpenOltStatisticsMgr{}
Amit Ghoshd4cbe482019-11-21 12:07:14 +0000262
263 var pmNames = []string{
264 "rx_bytes",
265 "rx_packets",
266 "rx_mcast_packets",
267 "rx_bcast_packets",
268 "tx_bytes",
269 "tx_packets",
270 "tx_mcast_packets",
271 "tx_bcast_packets",
272 }
273
274 dh.metrics = pmmetrics.NewPmMetrics(device.Id, pmmetrics.Frequency(2), pmmetrics.FrequencyOverride(false), pmmetrics.Grouped(false), pmmetrics.Metrics(pmNames))
khenaidoo106c61a2021-08-11 18:05:46 -0400275
276 // Set the children endpoints
277 dh.childAdapterClients = map[string]*vgrpc.Client{
278 "mock-onu-endpoint": mocks.NewMockChildAdapterClient(newMockOnuInterAdapterService()),
279 }
kdarapu891693b2019-09-16 12:33:49 +0530280 return dh
kdarapu381c6902019-07-31 18:23:16 +0530281}
282
kdarapu891693b2019-09-16 12:33:49 +0530283func negativeDeviceHandler() *DeviceHandler {
284 dh := newMockDeviceHandler()
285 device := dh.device
286 device.Id = ""
kdarapu891693b2019-09-16 12:33:49 +0530287 return dh
288}
Girish Gowdra0fb24a32021-10-27 15:15:27 -0700289
290func negativeDeviceHandlerNilFlowMgr() *DeviceHandler {
291 dh := newMockDeviceHandler()
292 dh.flowMgr = nil
293 return dh
294}
295
kdarapu381c6902019-07-31 18:23:16 +0530296func Test_generateMacFromHost(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000297 ctx := context.Background()
kdarapu381c6902019-07-31 18:23:16 +0530298 type args struct {
299 host string
300 }
301 tests := []struct {
302 name string
303 args args
304 want string
305 wantErr bool
306 }{
kdarapu891693b2019-09-16 12:33:49 +0530307 {"generateMacFromHost-1", args{host: "localhost"}, "00:00:7f:00:00:01", false},
308 {"generateMacFromHost-2", args{host: "10.10.10.10"}, "00:00:0a:0a:0a:0a", false},
309 //{"generateMacFromHost-3", args{host: "google.com"}, "00:00:d8:3a:c8:8e", false},
310 {"generateMacFromHost-4", args{host: "testing3"}, "", true},
kdarapu381c6902019-07-31 18:23:16 +0530311 }
312 for _, tt := range tests {
313 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000314 got, err := generateMacFromHost(ctx, tt.args.host)
kdarapu381c6902019-07-31 18:23:16 +0530315 if (err != nil) != tt.wantErr {
316 t.Errorf("generateMacFromHost() error = %v, wantErr %v", err, tt.wantErr)
317 return
318 }
319 if got != tt.want {
320 t.Errorf("generateMacFromHost() = %v, want %v", got, tt.want)
321 }
322 })
323 }
324}
325func Test_macifyIP(t *testing.T) {
326 type args struct {
327 ip net.IP
328 }
329 tests := []struct {
330 name string
331 args args
332 want string
333 }{{
kdarapu891693b2019-09-16 12:33:49 +0530334 "macifyIP-1",
kdarapu381c6902019-07-31 18:23:16 +0530335 args{ip: net.ParseIP("10.10.10.10")},
336 "00:00:0a:0a:0a:0a",
337 },
338 {
kdarapu891693b2019-09-16 12:33:49 +0530339 "macifyIP-2",
kdarapu381c6902019-07-31 18:23:16 +0530340 args{ip: net.ParseIP("127.0.0.1")},
341 "00:00:7f:00:00:01",
kdarapu891693b2019-09-16 12:33:49 +0530342 },
343 {
344 "macifyIP-3",
345 args{ip: net.ParseIP("127.0.0.1/24")},
346 "",
347 },
348 }
kdarapu381c6902019-07-31 18:23:16 +0530349 for _, tt := range tests {
350 t.Run(tt.name, func(t *testing.T) {
351 if got := macifyIP(tt.args.ip); got != tt.want {
352 t.Errorf("macifyIP() = %v, want %v", got, tt.want)
353 }
354 })
355 }
356}
357
David K. Bainbridge794735f2020-02-11 21:01:37 -0800358func sparseCompare(keys []string, spec, target interface{}) bool {
359 if spec == target {
360 return true
361 }
362 if spec == nil || target == nil {
363 return false
364 }
365 typeSpec := reflect.TypeOf(spec)
366 typeTarget := reflect.TypeOf(target)
367 if typeSpec != typeTarget {
368 return false
369 }
370
371 vSpec := reflect.ValueOf(spec)
372 vTarget := reflect.ValueOf(target)
373 if vSpec.Kind() == reflect.Ptr {
374 vSpec = vSpec.Elem()
375 vTarget = vTarget.Elem()
376 }
377
378 for _, key := range keys {
379 fSpec := vSpec.FieldByName(key)
380 fTarget := vTarget.FieldByName(key)
381 if !reflect.DeepEqual(fSpec.Interface(), fTarget.Interface()) {
382 return false
383 }
384 }
385 return true
386}
387
kdarapu381c6902019-07-31 18:23:16 +0530388func TestDeviceHandler_GetChildDevice(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000389 ctx := context.Background()
kdarapu891693b2019-09-16 12:33:49 +0530390 dh1 := newMockDeviceHandler()
391 dh2 := negativeDeviceHandler()
kdarapu381c6902019-07-31 18:23:16 +0530392 type args struct {
393 parentPort uint32
394 onuID uint32
395 }
396 tests := []struct {
kdarapu891693b2019-09-16 12:33:49 +0530397 name string
398 devicehandler *DeviceHandler
399 args args
400 want *voltha.Device
David K. Bainbridge794735f2020-02-11 21:01:37 -0800401 errType reflect.Type
kdarapu381c6902019-07-31 18:23:16 +0530402 }{
kdarapu891693b2019-09-16 12:33:49 +0530403 {"GetChildDevice-1", dh1,
404 args{parentPort: 1,
405 onuID: 1},
David K. Bainbridge794735f2020-02-11 21:01:37 -0800406 &voltha.Device{
407 Id: "1",
408 ParentId: "olt",
409 ParentPortNo: 1,
410 },
411 nil,
kdarapu891693b2019-09-16 12:33:49 +0530412 },
413 {"GetChildDevice-2", dh2,
kdarapu381c6902019-07-31 18:23:16 +0530414 args{parentPort: 1,
415 onuID: 1},
David K. Bainbridge794735f2020-02-11 21:01:37 -0800416 nil,
Thomas Lee S94109f12020-03-03 16:39:29 +0530417 reflect.TypeOf(&olterrors.ErrNotFound{}),
kdarapu381c6902019-07-31 18:23:16 +0530418 },
419 }
David K. Bainbridge794735f2020-02-11 21:01:37 -0800420
421 /*
422 --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-1 (0.00s)
423 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>)
424 --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-2 (0.00s)
425 */
kdarapu381c6902019-07-31 18:23:16 +0530426 for _, tt := range tests {
427 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000428 got, err := tt.devicehandler.GetChildDevice(ctx, tt.args.parentPort, tt.args.onuID)
David K. Bainbridge794735f2020-02-11 21:01:37 -0800429 if reflect.TypeOf(err) != tt.errType || !sparseCompare([]string{"Id", "ParentId", "ParentPortNo"}, tt.want, got) {
430 t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
431 tt.want, tt.errType, got, reflect.TypeOf(err))
432 return
433 }
kdarapu381c6902019-07-31 18:23:16 +0530434 t.Log("onu device id", got)
435 })
436 }
437}
kdarapu891693b2019-09-16 12:33:49 +0530438
439func TestGetportLabel(t *testing.T) {
Thomas Lee S94109f12020-03-03 16:39:29 +0530440 invalid := reflect.TypeOf(&olterrors.ErrInvalidValue{})
kdarapu891693b2019-09-16 12:33:49 +0530441 type args struct {
442 portNum uint32
443 portType voltha.Port_PortType
444 }
445 tests := []struct {
David K. Bainbridge794735f2020-02-11 21:01:37 -0800446 name string
447 args args
448 want string
449 errType reflect.Type
kdarapu891693b2019-09-16 12:33:49 +0530450 }{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800451 {"GetportLabel-1", args{portNum: 0, portType: 0}, "", invalid},
452 {"GetportLabel-2", args{portNum: 1, portType: 1}, "nni-1", nil},
453 {"GetportLabel-3", args{portNum: 2, portType: 2}, "", invalid},
454 {"GetportLabel-4", args{portNum: 3, portType: 3}, "pon-3", nil},
455 {"GetportLabel-5", args{portNum: 4, portType: 4}, "", invalid},
456 {"GetportLabel-6", args{portNum: 5, portType: 5}, "", invalid},
457 {"GetportLabel-7", args{portNum: 6, portType: 6}, "", invalid},
kdarapu891693b2019-09-16 12:33:49 +0530458 }
459 for _, tt := range tests {
460 t.Run(tt.name, func(t *testing.T) {
David K. Bainbridge794735f2020-02-11 21:01:37 -0800461 got, err := GetportLabel(tt.args.portNum, tt.args.portType)
462 if reflect.TypeOf(err) != tt.errType || got != tt.want {
463 t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
464 tt.want, tt.errType, got, reflect.TypeOf(err))
kdarapu891693b2019-09-16 12:33:49 +0530465 }
David K. Bainbridge794735f2020-02-11 21:01:37 -0800466
kdarapu891693b2019-09-16 12:33:49 +0530467 })
468 }
469}
470
khenaidoo106c61a2021-08-11 18:05:46 -0400471// func TestDeviceHandler_ProcessInterAdapterMessage(t *testing.T) {
472// ctx := context.Background()
473// dh := newMockDeviceHandler()
474// proxyAddr := dh.device.ProxyAddress
khenaidoodc2116e2021-10-19 17:33:19 -0400475// body := &ca.InterAdapterOmciMessage{
khenaidoo106c61a2021-08-11 18:05:46 -0400476// Message: []byte("asdfasdfasdfasdfas"),
477// ProxyAddress: proxyAddr,
478// }
khenaidoodc2116e2021-10-19 17:33:19 -0400479// body2 := &ca.InterAdapterOmciMessage{
khenaidoo106c61a2021-08-11 18:05:46 -0400480// Message: []byte("asdfasdfasdfasdfas"),
481// //ProxyAddress: &voltha.Device_ProxyAddress{},
482// }
khenaidoodc2116e2021-10-19 17:33:19 -0400483// body3 := &ca.InterAdapterTechProfileDownloadMessage{}
khenaidoo106c61a2021-08-11 18:05:46 -0400484// var marshalledData *any.Any
485// var err error
kdarapu891693b2019-09-16 12:33:49 +0530486
khenaidoo106c61a2021-08-11 18:05:46 -0400487// if marshalledData, err = ptypes.MarshalAny(body); err != nil {
488// logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"err": err})
489// }
kdarapu891693b2019-09-16 12:33:49 +0530490
khenaidoo106c61a2021-08-11 18:05:46 -0400491// var marshalledData1 *any.Any
kdarapu891693b2019-09-16 12:33:49 +0530492
khenaidoo106c61a2021-08-11 18:05:46 -0400493// if marshalledData1, err = ptypes.MarshalAny(body2); err != nil {
494// logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"err": err})
495// }
496// var marshalledData2 *any.Any
kdarapu891693b2019-09-16 12:33:49 +0530497
khenaidoo106c61a2021-08-11 18:05:46 -0400498// if marshalledData2, err = ptypes.MarshalAny(body3); err != nil {
499// logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"err": err})
500// }
501// type args struct {
khenaidoodc2116e2021-10-19 17:33:19 -0400502// msg *ca.InterAdapterMessage
khenaidoo106c61a2021-08-11 18:05:46 -0400503// }
504// invalid := reflect.TypeOf(&olterrors.ErrInvalidValue{})
505// tests := []struct {
506// name string
507// args args
508// wantErr reflect.Type
509// }{
khenaidoodc2116e2021-10-19 17:33:19 -0400510// {"ProcessInterAdapterMessage-1", args{msg: &ca.InterAdapterMessage{
511// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400512// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400513// Type: ca.InterAdapterMessageType_FLOW_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400514// },
515// Body: marshalledData,
516// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400517// {"ProcessInterAdapterMessage-2", args{msg: &ca.InterAdapterMessage{
518// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400519// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400520// Type: ca.InterAdapterMessageType_FLOW_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400521// },
522// Body: marshalledData1,
523// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400524// {"ProcessInterAdapterMessage-3", args{msg: &ca.InterAdapterMessage{
525// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400526// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400527// Type: ca.InterAdapterMessageType_OMCI_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400528// },
529// Body: marshalledData,
530// }}, reflect.TypeOf(&olterrors.ErrCommunication{})},
khenaidoodc2116e2021-10-19 17:33:19 -0400531// {"ProcessInterAdapterMessage-4", args{msg: &ca.InterAdapterMessage{
532// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400533// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400534// Type: ca.InterAdapterMessageType_OMCI_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400535// }, Body: marshalledData,
536// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400537// {"ProcessInterAdapterMessage-5", args{msg: &ca.InterAdapterMessage{
538// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400539// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400540// Type: ca.InterAdapterMessageType_METRICS_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400541// }, Body: marshalledData1,
542// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400543// {"ProcessInterAdapterMessage-6", args{msg: &ca.InterAdapterMessage{
544// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400545// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400546// Type: ca.InterAdapterMessageType_METRICS_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400547// }, Body: marshalledData,
548// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400549// {"ProcessInterAdapterMessage-7", args{msg: &ca.InterAdapterMessage{
550// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400551// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400552// Type: ca.InterAdapterMessageType_ONU_IND_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400553// }, Body: marshalledData,
554// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400555// {"ProcessInterAdapterMessage-8", args{msg: &ca.InterAdapterMessage{
556// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400557// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400558// Type: ca.InterAdapterMessageType_ONU_IND_RESPONSE,
khenaidoo106c61a2021-08-11 18:05:46 -0400559// }, Body: marshalledData,
560// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400561// {"ProcessInterAdapterMessage-9", args{msg: &ca.InterAdapterMessage{
562// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400563// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400564// Type: ca.InterAdapterMessageType_TECH_PROFILE_DOWNLOAD_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400565// }, Body: marshalledData,
566// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400567// {"ProcessInterAdapterMessage-10", args{msg: &ca.InterAdapterMessage{
568// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400569// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400570// Type: ca.InterAdapterMessageType_DELETE_GEM_PORT_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400571// }, Body: marshalledData2,
572// }}, invalid},
khenaidoodc2116e2021-10-19 17:33:19 -0400573// {"ProcessInterAdapterMessage-11", args{msg: &ca.InterAdapterMessage{
574// Header: &ca.InterAdapterHeader{
khenaidoo106c61a2021-08-11 18:05:46 -0400575// Id: "012345",
khenaidoodc2116e2021-10-19 17:33:19 -0400576// Type: ca.InterAdapterMessageType_DELETE_TCONT_REQUEST,
khenaidoo106c61a2021-08-11 18:05:46 -0400577// }, Body: marshalledData2,
578// }}, invalid},
579// }
580// for _, tt := range tests {
581// t.Run(tt.name, func(t *testing.T) {
kdarapu891693b2019-09-16 12:33:49 +0530582
khenaidoo106c61a2021-08-11 18:05:46 -0400583// if err := dh.ProcessInterAdapterMessage(ctx, tt.args.msg); reflect.TypeOf(err) != tt.wantErr {
584// t.Errorf("DeviceHandler.ProcessInterAdapterMessage() error = %v, wantErr %v", err, tt.wantErr)
585// }
586// })
587// }
588// }
kdarapu891693b2019-09-16 12:33:49 +0530589
khenaidoo106c61a2021-08-11 18:05:46 -0400590func TestDeviceHandler_ProxyOmciMessage(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000591 ctx := context.Background()
kdarapu891693b2019-09-16 12:33:49 +0530592 dh1 := newMockDeviceHandler()
593 dh2 := negativeDeviceHandler()
594 device1 := &voltha.Device{
595 Id: "onu1",
596 Root: false,
597 ParentId: "logical_device",
598 ProxyAddress: &voltha.Device_ProxyAddress{
599 DeviceId: "onu1",
600 DeviceType: "onu",
601 ChannelId: 1,
602 ChannelGroupId: 1,
603 },
604 ConnectStatus: 1,
605 }
606 device2 := device1
607 device2.ConnectStatus = 2
khenaidoodc2116e2021-10-19 17:33:19 -0400608 iaomciMsg1 := &ia.OmciMessage{
kdarapu891693b2019-09-16 12:33:49 +0530609 ProxyAddress: &voltha.Device_ProxyAddress{
610 DeviceId: "onu2",
611 DeviceType: "onu",
612 ChannelId: 1,
613 ChannelGroupId: 1,
kdarapu891693b2019-09-16 12:33:49 +0530614 },
615 ConnectStatus: 1,
616 }
khenaidoodc2116e2021-10-19 17:33:19 -0400617 iaomciMsg2 := &ia.OmciMessage{
kdarapu891693b2019-09-16 12:33:49 +0530618 ProxyAddress: &voltha.Device_ProxyAddress{
619 DeviceId: "onu3",
620 DeviceType: "onu",
621 ChannelId: 1,
622 ChannelGroupId: 1,
623 },
624 ConnectStatus: 1,
625 }
626 type args struct {
627 onuDevice *voltha.Device
khenaidoodc2116e2021-10-19 17:33:19 -0400628 omciMsg *ia.OmciMessage
kdarapu891693b2019-09-16 12:33:49 +0530629 }
630 tests := []struct {
631 name string
632 devicehandler *DeviceHandler
633 args args
634 }{
khenaidoodc2116e2021-10-19 17:33:19 -0400635 {"sendProxiedMessage-1", dh1, args{onuDevice: device1, omciMsg: &ia.OmciMessage{}}},
636 {"sendProxiedMessage-2", dh1, args{onuDevice: device2, omciMsg: &ia.OmciMessage{}}},
kdarapu891693b2019-09-16 12:33:49 +0530637 {"sendProxiedMessage-3", dh1, args{onuDevice: nil, omciMsg: iaomciMsg1}},
638 {"sendProxiedMessage-4", dh1, args{onuDevice: nil, omciMsg: iaomciMsg2}},
639 {"sendProxiedMessage-5", dh2, args{onuDevice: nil, omciMsg: iaomciMsg2}},
khenaidoodc2116e2021-10-19 17:33:19 -0400640 {"sendProxiedMessage-6", dh2, args{onuDevice: device1, omciMsg: &ia.OmciMessage{}}},
kdarapu891693b2019-09-16 12:33:49 +0530641 }
642 for _, tt := range tests {
643 t.Run(tt.name, func(t *testing.T) {
khenaidoo106c61a2021-08-11 18:05:46 -0400644 _ = tt.devicehandler.ProxyOmciMessage(ctx, tt.args.omciMsg)
Kent Hagermane6ff1012020-07-14 15:07:53 -0400645 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530646 })
647 }
648}
649
kesavandb9f54fd2021-11-25 20:08:04 +0530650func TestDeviceHandler_ProxyOmciRequests(t *testing.T) {
651 ctx := context.Background()
652 dh1 := newMockDeviceHandler()
653 dh2 := negativeDeviceHandler()
654 device1 := &voltha.Device{
655 Id: "onu1",
656 Root: false,
657 ParentId: "logical_device",
658 ProxyAddress: &voltha.Device_ProxyAddress{
659 DeviceId: "onu1",
660 DeviceType: "onu",
661 ChannelId: 1,
662 ChannelGroupId: 1,
663 },
664 ConnectStatus: 1,
665 }
666 device2 := device1
667 device2.ConnectStatus = 2
668
669 iaomciMsg1 := &ia.OmciMessages{
670 ConnectStatus: 1,
671 ProxyAddress: &voltha.Device_ProxyAddress{
672 DeviceId: "onu2",
673 DeviceType: "onu",
674 ChannelId: 1,
675 ChannelGroupId: 1,
676 },
677 }
678
679 iaomciMsg2 := &ia.OmciMessages{
680 ConnectStatus: 1,
681 ProxyAddress: &voltha.Device_ProxyAddress{
682 DeviceId: "onu3",
683 DeviceType: "onu",
684 ChannelId: 1,
685 ChannelGroupId: 1,
686 },
687 }
688
689 type args struct {
690 onuDevice *voltha.Device
691 omciMsg *ia.OmciMessages
692 }
693 tests := []struct {
694 name string
695 devicehandler *DeviceHandler
696 args args
697 }{
698 {"sendProxiedMessage-1", dh1, args{onuDevice: device1, omciMsg: &ia.OmciMessages{}}},
699 {"sendProxiedMessage-2", dh1, args{onuDevice: device2, omciMsg: &ia.OmciMessages{}}},
700 {"sendProxiedMessage-3", dh1, args{onuDevice: nil, omciMsg: iaomciMsg1}},
701 {"sendProxiedMessage-4", dh1, args{onuDevice: nil, omciMsg: iaomciMsg2}},
702 {"sendProxiedMessage-5", dh2, args{onuDevice: nil, omciMsg: iaomciMsg2}},
703 {"sendProxiedMessage-6", dh2, args{onuDevice: device1, omciMsg: &ia.OmciMessages{}}},
704 }
705 for _, tt := range tests {
706 t.Run(tt.name, func(t *testing.T) {
707 switch tt.name {
708 case "sendProxiedMessage-1":
709 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
710 assert.Contains(t, err.Error(), "no deviceID")
711 case "sendProxiedMessage-2":
712 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
713 assert.Contains(t, err.Error(), "no deviceID")
714 case "sendProxiedMessage-3":
715 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
716 assert.Contains(t, err.Error(), "failed-communication")
717 case "sendProxiedMessage-4":
718 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
719 assert.Contains(t, err.Error(), "failed-communication")
720 case "sendProxiedMessage-5":
721 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
722 assert.Contains(t, err.Error(), "failed-communication")
723 case "sendProxiedMessage-6":
724 err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
725 assert.Contains(t, err.Error(), "no deviceID")
726
727 }
728
729 })
730 }
731}
732
kdarapu891693b2019-09-16 12:33:49 +0530733func TestDeviceHandler_SendPacketInToCore(t *testing.T) {
734 dh1 := newMockDeviceHandler()
735 dh2 := negativeDeviceHandler()
736
737 type args struct {
738 logicalPort uint32
739 packetPayload []byte
740 }
741 tests := []struct {
742 name string
743 devicehandler *DeviceHandler
744 args args
745 }{
746 {"SendPacketInToCore-1", dh1, args{logicalPort: 1, packetPayload: []byte("test1")}},
747 {"SendPacketInToCore-2", dh1, args{logicalPort: 1, packetPayload: []byte("")}},
748 {"SendPacketInToCore-3", dh2, args{logicalPort: 1, packetPayload: []byte("test1")}},
749 }
750 for _, tt := range tests {
751 t.Run(tt.name, func(t *testing.T) {
Kent Hagermane6ff1012020-07-14 15:07:53 -0400752 _ = tt.devicehandler.SendPacketInToCore(context.Background(), tt.args.logicalPort, tt.args.packetPayload)
753 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530754 })
755 }
756}
757
758func TestDeviceHandler_DisableDevice(t *testing.T) {
759 dh1 := newMockDeviceHandler()
760 dh2 := negativeDeviceHandler()
761 type args struct {
762 device *voltha.Device
763 }
764 tests := []struct {
765 name string
766 devicehandler *DeviceHandler
767 args args
768 wantErr bool
769 }{
770 {"DisableDevice-1", dh1, args{device: dh1.device}, false},
Chaitrashree G S3b4c0352019-09-09 20:59:29 -0400771 {"DisableDevice-2", dh1, args{device: dh2.device}, true},
kdarapu891693b2019-09-16 12:33:49 +0530772 }
773 for _, tt := range tests {
774 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000775 if err := tt.devicehandler.DisableDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530776 t.Errorf("DeviceHandler.DisableDevice() error = %v, wantErr %v", err, tt.wantErr)
777 }
778 })
779 }
780}
781
782func TestDeviceHandler_ReenableDevice(t *testing.T) {
783 dh1 := newMockDeviceHandler()
784 dh2 := negativeDeviceHandler()
785 type args struct {
786 device *voltha.Device
787 }
788 tests := []struct {
789 name string
790 devicehandler *DeviceHandler
791 args args
792 wantErr bool
793 }{
794 {"ReenableDevice-1", dh1, args{device: dh1.device}, false},
795 {"ReenableDevice-2", dh1, args{device: &voltha.Device{}}, true},
796 {"ReenableDevice-3", dh2, args{device: dh1.device}, false},
797 }
798 for _, tt := range tests {
799 t.Run(tt.name, func(t *testing.T) {
800 dh := tt.devicehandler
Neha Sharma96b7bf22020-06-15 10:37:32 +0000801 if err := dh.ReenableDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530802 t.Errorf("DeviceHandler.ReenableDevice() error = %v, wantErr %v", err, tt.wantErr)
803 }
804 })
805 }
806}
807
808func TestDeviceHandler_RebootDevice(t *testing.T) {
809 dh1 := newMockDeviceHandler()
810 dh2 := newMockDeviceHandler()
811 type args struct {
812 device *voltha.Device
813 }
814 tests := []struct {
815 name string
816 devicehandler *DeviceHandler
817 args args
818 wantErr bool
819 }{
820 // TODO: Add test cases.
821 {"RebootDevice-1", dh1, args{device: dh1.device}, false},
822 {"RebootDevice-2", dh1, args{device: dh2.device}, true},
823 {"RebootDevice-3", dh2, args{device: dh2.device}, false},
824 }
825 for _, tt := range tests {
826 t.Run(tt.name, func(t *testing.T) {
827
Neha Sharma96b7bf22020-06-15 10:37:32 +0000828 if err := tt.devicehandler.RebootDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530829 t.Errorf("DeviceHandler.RebootDevice() error = %v, wantErr %v", err, tt.wantErr)
830 }
831 })
832 }
833}
834
835func TestDeviceHandler_handleIndication(t *testing.T) {
836 dh1 := newMockDeviceHandler()
837 dh2 := negativeDeviceHandler()
838 dh3 := newMockDeviceHandler()
Naga Manjunatha8dc9372019-10-31 23:01:18 +0530839 dh3.onus = sync.Map{}
khenaidoo106c61a2021-08-11 18:05:46 -0400840 dh3.onus.Store("onu1", NewOnuDevice("onu1", "onu1", "onu1", 1, 1, "onu1", false, "mock_endpoint"))
841 dh3.onus.Store("onu2", NewOnuDevice("onu2", "onu2", "onu2", 2, 2, "onu2", false, "mock_endpoint"))
Naga Manjunatha8dc9372019-10-31 23:01:18 +0530842
kdarapu891693b2019-09-16 12:33:49 +0530843 type args struct {
844 indication *oop.Indication
845 }
846 tests := []struct {
847 name string
848 deviceHandler *DeviceHandler
849 args args
850 }{
851 // TODO: Add test cases.
852 {"handleIndication-1", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "up"}}}}},
853 {"handleIndication-2", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "down"}}}}},
854 {"handleIndication-3", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "up"}}}}},
855 {"handleIndication-4", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "down"}}}}},
856 {"handleIndication-5", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "nni", IntfId: 1, OperState: "up"}}}}},
857 {"handleIndication-6", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "pon", IntfId: 1, OperState: "up"}}}}},
858 {"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")}}}}}},
859 {"handleIndication-8", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
860 {"handleIndication-9", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
861 {"handleIndication-10", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
862 {"handleIndication-11", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
863 {"handleIndication-12", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 1, Pkt: []byte("onu123-random value")}}}}},
864 {"handleIndication-13", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", IntfId: 1, GemportId: 1, FlowId: 1234, PortNo: 1}}}}},
865 {"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}}}}},
866 {"handleIndication-15", dh1, args{indication: &oop.Indication{Data: &oop.Indication_FlowStats{FlowStats: &oop.FlowStatistics{RxBytes: 100, RxPackets: 100, TxBytes: 100, TxPackets: 100, Timestamp: 1000}}}}},
867 {"handleIndication-16", dh1, args{indication: &oop.Indication{Data: &oop.Indication_AlarmInd{AlarmInd: &oop.AlarmIndication{}}}}},
868 {"handleIndication-17", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", FlowId: 1234, PortNo: 1}}}}},
869 {"handleIndication-18", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{}}}}},
870
871 // Negative testcases
872 {"handleIndication-19", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "up"}}}}},
873 {"handleIndication-20", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "down"}}}}},
874 {"handleIndication-21", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "up"}}}}},
875 {"handleIndication-22", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "down"}}}}},
876 {"handleIndication-23", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "nni", IntfId: 1, OperState: "up"}}}}},
877 {"handleIndication-24", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "pon", IntfId: 1, OperState: "up"}}}}},
878 {"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")}}}}}},
879 {"handleIndication-26", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
880 {"handleIndication-27", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
881 {"handleIndication-28", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
882 {"handleIndication-29", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
883 {"handleIndication-30", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 1, Pkt: []byte("onu123-random value")}}}}},
884 {"handleIndication-31", dh2, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", IntfId: 1, GemportId: 1, FlowId: 1234, PortNo: 1}}}}},
885 {"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}}}}},
886 {"handleIndication-33", dh2, args{indication: &oop.Indication{Data: &oop.Indication_FlowStats{FlowStats: &oop.FlowStatistics{RxBytes: 100, RxPackets: 100, TxBytes: 100, TxPackets: 100, Timestamp: 1000}}}}},
887 {"handleIndication-34", dh2, args{indication: &oop.Indication{Data: &oop.Indication_AlarmInd{AlarmInd: &oop.AlarmIndication{}}}}},
888 //
889 {"handleIndication-35", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
890 {"handleIndication-36", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
891 {"handleIndication-37", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
892 {"handleIndication-38", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
893 {"handleIndication-30", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 4, Pkt: []byte("onu123-random value")}}}}},
894 {"handleIndication-30", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 4, Pkt: []byte("onu123-random value")}}}}},
895 }
896 for _, tt := range tests {
897 t.Run(tt.name, func(t *testing.T) {
898 dh := tt.deviceHandler
khenaidoo106c61a2021-08-11 18:05:46 -0400899 time.Sleep(5 * time.Millisecond)
npujarec5762e2020-01-01 14:08:48 +0530900 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
901 defer cancel()
902 dh.handleIndication(ctx, tt.args.indication)
kdarapu891693b2019-09-16 12:33:49 +0530903 })
904 }
905}
906
907func TestDeviceHandler_addPort(t *testing.T) {
908 dh1 := newMockDeviceHandler()
909 dh2 := negativeDeviceHandler()
Elia Battiston596406d2022-02-02 12:19:00 +0100910
911 const defaultCapacity = uint32(of.OfpPortFeatures_OFPPF_1GB_FD | of.OfpPortFeatures_OFPPF_FIBER)
kdarapu891693b2019-09-16 12:33:49 +0530912 type args struct {
Elia Battiston596406d2022-02-02 12:19:00 +0100913 intfID uint32
914 portType voltha.Port_PortType
915 state string
916 speedMbps uint32
kdarapu891693b2019-09-16 12:33:49 +0530917 }
918 tests := []struct {
Elia Battiston596406d2022-02-02 12:19:00 +0100919 name string
920 devicehandler *DeviceHandler
921 args args
922 expectedCapacity uint32
kdarapu891693b2019-09-16 12:33:49 +0530923 }{
924 // State up
Elia Battiston596406d2022-02-02 12:19:00 +0100925 {"addPort.1", dh1, args{intfID: 1, portType: voltha.Port_UNKNOWN, state: "up"}, defaultCapacity},
926 {"addPort.2", dh1, args{intfID: 1, portType: voltha.Port_VENET_OLT, state: "up"}, defaultCapacity},
927 {"addPort.3", dh1, args{intfID: 1, portType: voltha.Port_VENET_ONU, state: "up"}, defaultCapacity},
928 {"addPort.4", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
929 {"addPort.5", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "up"}, defaultCapacity},
930 {"addPort.6", dh1, args{intfID: 1, portType: voltha.Port_PON_OLT, state: "up"}, defaultCapacity},
931 {"addPort.7", dh1, args{intfID: 1, portType: voltha.Port_PON_ONU, state: "up"}, defaultCapacity},
932 {"addPort.8", dh1, args{intfID: 1, portType: 8, state: "up"}, defaultCapacity},
kdarapu891693b2019-09-16 12:33:49 +0530933 // state discovery
Elia Battiston596406d2022-02-02 12:19:00 +0100934 {"addPort.9", dh1, args{intfID: 1, portType: voltha.Port_UNKNOWN, state: "down"}, defaultCapacity},
935 {"addPort.10", dh1, args{intfID: 1, portType: voltha.Port_VENET_OLT, state: "down"}, defaultCapacity},
936 {"addPort.11", dh1, args{intfID: 1, portType: voltha.Port_VENET_ONU, state: "down"}, defaultCapacity},
937 {"addPort.12", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "down", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
938 {"addPort.13", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "down"}, defaultCapacity},
939 {"addPort.14", dh1, args{intfID: 1, portType: voltha.Port_PON_OLT, state: "down"}, defaultCapacity},
940 {"addPort.15", dh1, args{intfID: 1, portType: voltha.Port_PON_ONU, state: "down"}, defaultCapacity},
941 {"addPort.16", dh1, args{intfID: 1, portType: 8, state: "down"}, defaultCapacity},
kdarapu891693b2019-09-16 12:33:49 +0530942
Elia Battiston596406d2022-02-02 12:19:00 +0100943 {"addPort.17", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
944 {"addPort.18", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "up"}, defaultCapacity},
945 {"addPort.19", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "down", speedMbps: defaultPortSpeedMbps}, defaultCapacity},
946 {"addPort.20", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "down"}, defaultCapacity},
947
948 // NNI speeds
949 {"addPort.21", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up", speedMbps: 0}, defaultCapacity},
950 {"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)},
951 {"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)},
952 {"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)},
953 {"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)},
954 {"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)},
955 {"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)},
956 {"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)},
957 {"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 +0530958 }
959 for _, tt := range tests {
960 t.Run(tt.name, func(t *testing.T) {
Elia Battiston596406d2022-02-02 12:19:00 +0100961 _ = tt.devicehandler.addPort(context.Background(), tt.args.intfID, tt.args.portType, tt.args.state, tt.args.speedMbps)
962
963 //Check if the correct state is stored
964 storedState, ok := tt.devicehandler.activePorts.Load(tt.args.intfID)
965 expectedState := tt.args.state == "up"
966
967 if !ok {
968 t.Errorf("Port state not stored in test %v", tt.name)
969 } else if storedState != expectedState {
970 t.Errorf("Expected stored port state: %v, found: %v in test %v", expectedState, storedState, tt.name)
971 }
972
973 //Check if the reported speed values are correct
974 ofpPort := makeOfpPort(tt.devicehandler.device.MacAddress, tt.args.speedMbps)
975
976 if ofpPort.Curr != tt.expectedCapacity ||
977 ofpPort.Advertised != tt.expectedCapacity ||
978 ofpPort.Peer != tt.expectedCapacity {
979 t.Errorf("Expected port capacity: %v, found: (%v,%v,%v) in test %v", tt.expectedCapacity, ofpPort.Curr, ofpPort.Advertised, ofpPort.Peer, tt.name)
980 }
981
982 var expectedSpeedKbps uint32
983 if tt.args.speedMbps == 0 {
984 expectedSpeedKbps = defaultPortSpeedMbps * 1000
985 } else {
986 expectedSpeedKbps = tt.args.speedMbps * 1000
987 }
988
989 if ofpPort.CurrSpeed != expectedSpeedKbps ||
990 ofpPort.MaxSpeed != expectedSpeedKbps {
991 t.Errorf("Expected port speed: %v, found: (%v,%v) in test %v", expectedSpeedKbps, ofpPort.CurrSpeed, ofpPort.MaxSpeed, tt.name)
992 }
kdarapu891693b2019-09-16 12:33:49 +0530993 })
994 }
995}
996
997func Test_macAddressToUint32Array(t *testing.T) {
998 type args struct {
999 mac string
1000 }
1001 tests := []struct {
1002 name string
1003 args args
1004 want []uint32
1005 }{
1006 // TODO: Add test cases.
1007 {"macAddressToUint32Array-1", args{mac: "00:00:00:00:00:01"}, []uint32{0, 0, 0, 0, 0, 1}},
1008 {"macAddressToUint32Array-2", args{mac: "0abcdef"}, []uint32{11259375}},
1009 {"macAddressToUint32Array-3", args{mac: "testing"}, []uint32{1, 2, 3, 4, 5, 6}},
1010 }
1011 for _, tt := range tests {
1012 t.Run(tt.name, func(t *testing.T) {
1013 if got := macAddressToUint32Array(tt.args.mac); !reflect.DeepEqual(got, tt.want) {
1014 t.Errorf("macAddressToUint32Array() = %v, want %v", got, tt.want)
1015 }
1016 })
1017 }
1018}
1019
1020func TestDeviceHandler_handleOltIndication(t *testing.T) {
1021
1022 type args struct {
1023 oltIndication *oop.OltIndication
1024 }
1025 tests := []struct {
1026 name string
1027 args args
1028 }{
1029 {"handleOltIndication-1", args{oltIndication: &oop.OltIndication{OperState: "up"}}},
1030 {"handleOltIndication-2", args{oltIndication: &oop.OltIndication{OperState: "down"}}},
1031 }
1032 for _, tt := range tests {
1033 t.Run(tt.name, func(t *testing.T) {
1034 dh := newMockDeviceHandler()
npujarec5762e2020-01-01 14:08:48 +05301035 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1036 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001037 if err := dh.handleOltIndication(ctx, tt.args.oltIndication); err != nil {
1038 t.Error(err)
1039 }
kdarapu891693b2019-09-16 12:33:49 +05301040 })
1041 }
1042}
1043
1044func TestDeviceHandler_AdoptDevice(t *testing.T) {
1045 dh1 := newMockDeviceHandler()
1046 dh2 := negativeDeviceHandler()
1047 type args struct {
1048 device *voltha.Device
1049 }
1050 tests := []struct {
1051 name string
1052 devicehandler *DeviceHandler
1053 args args
1054 }{
1055 // TODO: Add test cases.
1056 {"AdoptDevice-1", dh1, args{device: dh1.device}},
Naga Manjunath7615e552019-10-11 22:35:47 +05301057 {"AdoptDevice-2", dh2, args{device: dh2.device}},
kdarapu891693b2019-09-16 12:33:49 +05301058 }
1059 for _, tt := range tests {
1060 t.Run(tt.name, func(t *testing.T) {
1061 //dh.doStateInit()
1062 // context.
1063 //dh.AdoptDevice(tt.args.device)
npujarec5762e2020-01-01 14:08:48 +05301064 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1065 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001066 if err := tt.devicehandler.postInit(ctx); err != nil {
1067 t.Error(err)
1068 }
kdarapu891693b2019-09-16 12:33:49 +05301069 })
1070 }
1071}
1072
1073func TestDeviceHandler_activateONU(t *testing.T) {
1074 dh := newMockDeviceHandler()
1075 dh1 := negativeDeviceHandler()
1076 type args struct {
1077 intfID uint32
1078 onuID int64
1079 serialNum *oop.SerialNumber
1080 serialNumber string
1081 }
1082 tests := []struct {
1083 name string
1084 devicehandler *DeviceHandler
1085 args args
1086 }{
Girish Gowdra38d533d2020-03-30 20:38:51 -07001087 {"activateONU-1", dh, args{intfID: 0, onuID: 1, serialNum: &oop.SerialNumber{VendorId: []byte("onu1")}}},
1088 {"activateONU-2", dh, args{intfID: 1, onuID: 2, serialNum: &oop.SerialNumber{VendorId: []byte("onu2")}}},
1089 {"activateONU-3", dh1, args{intfID: 0, onuID: 1, serialNum: &oop.SerialNumber{VendorId: []byte("onu1")}}},
1090 {"activateONU-4", dh1, args{intfID: 1, onuID: 2, serialNum: &oop.SerialNumber{VendorId: []byte("onu2")}}},
kdarapu891693b2019-09-16 12:33:49 +05301091 }
1092 for _, tt := range tests {
1093 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301094 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1095 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001096 _ = tt.devicehandler.activateONU(ctx, tt.args.intfID, tt.args.onuID, tt.args.serialNum, tt.args.serialNumber)
1097 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301098 })
1099 }
1100}
1101
1102func TestDeviceHandler_start(t *testing.T) {
1103 dh := newMockDeviceHandler()
1104 dh1 := negativeDeviceHandler()
1105 dh.start(context.Background())
1106 dh.stop(context.Background())
1107
1108 dh1.start(context.Background())
1109 dh1.stop(context.Background())
1110
1111}
1112
1113func TestDeviceHandler_PacketOut(t *testing.T) {
1114 dh1 := newMockDeviceHandler()
1115 dh2 := negativeDeviceHandler()
1116 acts := []*ofp.OfpAction{
1117 fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA))),
1118 fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101)),
1119 fu.Output(1),
1120 }
1121 pktout := &ofp.OfpPacketOut{BufferId: 0, InPort: 1, Actions: acts, Data: []byte("AYDCAAAOAODsSE5TiMwCBwQA4OxITlIEBQUwLzUxBgIAFAgEMC81MQoJbG9jYWxob3N0EBwFAawbqqACAAAAoRAxLjMuNi4xLjQuMS40NDEz/gYAgMILAgD+GQCAwgkDAAAAAGQAAAAAAAAAAgICAgICAgL+GQCAwgoDAAAAAGQAAAAAAAAAAgICAgICAgIAAA==")}
1122 type args struct {
1123 egressPortNo int
1124 packet *of.OfpPacketOut
1125 }
1126 tests := []struct {
1127 name string
1128 devicehandler *DeviceHandler
1129 args args
1130 wantErr bool
1131 }{
1132 // TODO: Add test cases.
1133 //{"test1", args{egressPortNo: 0, packet: &ofp.OfpPacketOut{}}, true},
1134 {"PacketOut-1", dh1, args{egressPortNo: 0, packet: pktout}, false},
1135 {"PacketOut-2", dh2, args{egressPortNo: 1, packet: pktout}, false},
Matteo Scandolo2c0d2742020-06-10 11:28:42 -07001136 {"PacketOut-3", dh2, args{egressPortNo: 4112, packet: pktout}, false},
Mahir Gunyel0c009fc2021-10-22 17:47:16 -07001137 {"PacketOut-4", dh1, args{egressPortNo: 16777217, packet: pktout}, false},
1138 {"PacketOut-5", dh2, args{egressPortNo: 16777216, packet: pktout}, false},
kdarapu891693b2019-09-16 12:33:49 +05301139 }
1140 for _, tt := range tests {
1141 t.Run(tt.name, func(t *testing.T) {
1142 dh := tt.devicehandler
npujarec5762e2020-01-01 14:08:48 +05301143 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1144 defer cancel()
khenaidoo106c61a2021-08-11 18:05:46 -04001145 if err := dh.PacketOut(ctx, uint32(tt.args.egressPortNo), tt.args.packet); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +05301146 t.Errorf("DeviceHandler.PacketOut() error = %v, wantErr %v", err, tt.wantErr)
1147 }
1148 })
1149 }
1150}
1151
1152//
1153func TestDeviceHandler_doStateUp(t *testing.T) {
1154 dh1 := newMockDeviceHandler()
1155 dh2 := newMockDeviceHandler()
1156
Thomas Lee S985938d2020-05-04 11:40:41 +05301157 dh2.device.Id = ""
kdarapu891693b2019-09-16 12:33:49 +05301158 dh3 := negativeDeviceHandler()
1159
1160 tests := []struct {
1161 name string
1162 devicehandler *DeviceHandler
1163 wantErr bool
1164 }{
1165 {"dostateup-1", dh1, false},
1166 {"dostateup-2", dh2, false},
1167 {"dostateup-3", dh3, true},
1168 }
1169 for _, tt := range tests {
1170 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301171 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1172 defer cancel()
1173 if err := tt.devicehandler.doStateUp(ctx); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +05301174 t.Logf("DeviceHandler.doStateUp() error = %v, wantErr %v", err, tt.wantErr)
1175 }
Thomas Lee S85f37312020-04-03 17:06:12 +05301176 tt.devicehandler.stopCollector <- true //stop the stat collector invoked from doStateUp
kdarapu891693b2019-09-16 12:33:49 +05301177 })
1178 }
1179}
1180func TestDeviceHandler_doStateDown(t *testing.T) {
1181 dh1 := newMockDeviceHandler()
1182 dh2 := negativeDeviceHandler()
1183 dh3 := newMockDeviceHandler()
1184 dh3.device.OperStatus = voltha.OperStatus_UNKNOWN
1185 tests := []struct {
1186 name string
1187 devicehandler *DeviceHandler
1188 wantErr bool
1189 }{
1190 {"dostatedown-1", dh1, false},
1191 {"dostatedown-2", dh2, true},
1192 {"dostatedown-2", dh3, true},
1193 }
1194 for _, tt := range tests {
1195 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301196 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1197 defer cancel()
1198 if err := tt.devicehandler.doStateDown(ctx); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +05301199 t.Logf("DeviceHandler.doStateDown() error = %v", err)
Kent Hagermane6ff1012020-07-14 15:07:53 -04001200 //TODO: should fail this test case (Errorf) if result is not as expected
kdarapu891693b2019-09-16 12:33:49 +05301201 }
1202 })
1203 }
1204}
1205
1206func TestDeviceHandler_GetOfpDeviceInfo(t *testing.T) {
1207 dh1 := newMockDeviceHandler()
1208 dh2 := negativeDeviceHandler()
1209 type args struct {
1210 device *voltha.Device
1211 }
1212 tests := []struct {
1213 name string
1214 devicehandler *DeviceHandler
1215 args args
1216 wantErr bool
1217 }{
1218 // TODO: Add test cases.
1219 {"GetOfpDeviceInfo-1", dh1, args{dh1.device}, false},
1220 {"GetOfpDeviceInfo-2", dh1, args{&voltha.Device{}}, false},
1221 {"GetOfpDeviceInfo-3", dh2, args{dh1.device}, false},
1222 }
1223 for _, tt := range tests {
1224 t.Run(tt.name, func(t *testing.T) {
1225 dh := tt.devicehandler
1226 _, err := dh.GetOfpDeviceInfo(tt.args.device)
1227 if (err != nil) != tt.wantErr {
1228 t.Errorf("DeviceHandler.GetOfpDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
1229 return
1230 }
1231 })
1232 }
1233}
1234
kdarapu891693b2019-09-16 12:33:49 +05301235func TestDeviceHandler_onuDiscIndication(t *testing.T) {
1236
1237 dh1 := newMockDeviceHandler()
Naga Manjunatha8dc9372019-10-31 23:01:18 +05301238 dh1.discOnus = sync.Map{}
1239 dh1.discOnus.Store("onu1", true)
1240 dh1.discOnus.Store("onu2", false)
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +05301241 dh1.discOnus.Store("onu3", true)
1242 dh1.discOnus.Store("onu4", true)
1243 dh1.onus = sync.Map{}
khenaidoo106c61a2021-08-11 18:05:46 -04001244 dh1.onus.Store("onu3", NewOnuDevice("onu3", "onu3", "onu3", 3, 3, "onu3", true, "mock_endpoint"))
1245 dh1.onus.Store("onu4", NewOnuDevice("onu4", "onu4", "onu4", 4, 4, "onu4", true, "mock_endpoint"))
kdarapu891693b2019-09-16 12:33:49 +05301246 dh2 := negativeDeviceHandler()
1247 type args struct {
1248 onuDiscInd *oop.OnuDiscIndication
1249 sn string
1250 }
1251 tests := []struct {
1252 name string
1253 devicehandler *DeviceHandler
1254 args args
1255 }{
1256 // TODO: Add test cases.
1257 {"onuDiscIndication-1", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}},
1258 {"onuDiscIndication-2", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{}}}},
1259 {"onuDiscIndication-3", dh1, args{onuDiscInd: &oop.OnuDiscIndication{SerialNumber: &oop.SerialNumber{}}}},
1260 {"onuDiscIndication-4", dh1, args{onuDiscInd: &oop.OnuDiscIndication{}}},
1261 {"onuDiscIndication-5", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu1"}},
1262 {"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 +05301263 {"onuDiscIndication-7", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 3, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu3"}},
1264 {"onuDiscIndication-8", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 3, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu4"}},
1265 {"onuDiscIndication-9", dh2, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}},
kdarapu891693b2019-09-16 12:33:49 +05301266 }
1267 for _, tt := range tests {
1268 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301269 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1270 defer cancel()
Mahir Gunyelb0046752021-02-26 13:51:05 -08001271 _ = tt.devicehandler.onuDiscIndication(ctx, tt.args.onuDiscInd)
Kent Hagermane6ff1012020-07-14 15:07:53 -04001272 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301273 })
1274 }
1275}
1276
1277func TestDeviceHandler_populateDeviceInfo(t *testing.T) {
1278 dh1 := newMockDeviceHandler()
1279 dh2 := negativeDeviceHandler()
1280 tests := []struct {
1281 name string
1282 devicehandler *DeviceHandler
1283
1284 wantErr bool
1285 }{
1286 // TODO: Add test cases.
1287 {"populateDeviceInfo-1", dh1, false},
1288 {"populateDeviceInfo-2", dh1, true},
1289 {"populateDeviceInfo-3", dh1, true},
1290 {"populateDeviceInfo-4", dh1, true},
1291 {"populateDeviceInfo-5", dh2, true},
1292 }
1293 for _, tt := range tests {
1294 t.Run(tt.name, func(t *testing.T) {
1295
Neha Sharma96b7bf22020-06-15 10:37:32 +00001296 _, err := tt.devicehandler.populateDeviceInfo(context.Background())
kdarapu891693b2019-09-16 12:33:49 +05301297 if (err != nil) != tt.wantErr {
1298 t.Errorf("DeviceHandler.populateDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
1299 return
1300 }
1301
1302 })
1303 }
1304}
1305
1306func TestDeviceHandler_readIndications(t *testing.T) {
1307 dh1 := newMockDeviceHandler()
1308 dh2 := newMockDeviceHandler()
kdarapu891693b2019-09-16 12:33:49 +05301309 dh3 := newMockDeviceHandler()
1310 dh3.device.AdminState = voltha.AdminState_DISABLED
1311 dh4 := negativeDeviceHandler()
1312 tests := []struct {
1313 name string
1314 devicehandler *DeviceHandler
1315 }{
1316 // TODO: Add test cases.
1317 {"readIndications-1", dh1},
1318 {"readIndications-2", dh2},
1319 {"readIndications-3", dh2},
1320 {"readIndications-4", dh2},
1321 {"readIndications-5", dh2},
1322 {"readIndications-6", dh3},
1323 {"readIndications-7", dh3},
1324 {"readIndications-8", dh4},
1325 }
1326 for _, tt := range tests {
1327 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301328 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1329 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001330 _ = tt.devicehandler.readIndications(ctx)
1331 // TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301332 })
1333 }
1334}
Naga Manjunath7615e552019-10-11 22:35:47 +05301335
1336func Test_startCollector(t *testing.T) {
1337 type args struct {
1338 dh *DeviceHandler
1339 }
1340 dh := newMockDeviceHandler()
khenaidoo106c61a2021-08-11 18:05:46 -04001341 mcs := newMockCoreService()
1342 mcs.DevicePorts[dh.device.Id] = []*voltha.Port{
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301343 {PortNo: 1, Label: "pon", Type: voltha.Port_PON_OLT},
Mahir Gunyel0c009fc2021-10-22 17:47:16 -07001344 {PortNo: 16777216, Label: "nni", Type: voltha.Port_ETHERNET_NNI},
1345 {PortNo: 16777218, Label: "nni", Type: voltha.Port_ETHERNET_NNI},
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301346 }
khenaidoo106c61a2021-08-11 18:05:46 -04001347 dh.coreClient.SetService(mcs)
Naga Manjunath7615e552019-10-11 22:35:47 +05301348 dh.portStats.NorthBoundPort = make(map[uint32]*NniPort)
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301349 dh.portStats.NorthBoundPort[1] = &NniPort{Name: "OLT-1"}
1350 dh.portStats.NorthBoundPort[2] = &NniPort{Name: "OLT-1"}
Naga Manjunath7615e552019-10-11 22:35:47 +05301351 dh.portStats.SouthBoundPort = make(map[uint32]*PonPort)
1352 dh.portStats.Device = dh
1353 for i := 0; i < 16; i++ {
1354 dh.portStats.SouthBoundPort[uint32(i)] = &PonPort{DeviceID: "OLT-1"}
1355 }
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301356 dh1 := newMockDeviceHandler()
khenaidoo106c61a2021-08-11 18:05:46 -04001357 mcs = newMockCoreService()
1358 mcs.DevicePorts[dh.device.Id] = []*voltha.Port{}
1359 dh.coreClient.SetService(mcs)
Naga Manjunath7615e552019-10-11 22:35:47 +05301360 tests := []struct {
1361 name string
1362 args args
1363 }{
1364 // TODO: Add test cases.
1365 {"StartCollector-1", args{dh}},
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301366 {"StartCollector-2", args{dh1}},
Naga Manjunath7615e552019-10-11 22:35:47 +05301367 }
1368 for _, tt := range tests {
1369 t.Run(tt.name, func(t *testing.T) {
1370 go func() {
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301371 time.Sleep(1 * time.Second) // simulated wait time to stop startCollector
Naga Manjunath7615e552019-10-11 22:35:47 +05301372 tt.args.dh.stopCollector <- true
1373 }()
Neha Sharma96b7bf22020-06-15 10:37:32 +00001374 startCollector(context.Background(), tt.args.dh)
Naga Manjunath7615e552019-10-11 22:35:47 +05301375 })
1376 }
1377}
Gamze Abakac2c32a62021-03-11 11:44:18 +00001378
1379func 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}
Girish Gowdra0fb24a32021-10-27 15:15:27 -07001437
1438func 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}