blob: 855f42c3667e6d47f9ddf5d61b3b3651f739835f [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
kdarapu891693b2019-09-16 12:33:49 +053028 "github.com/golang/protobuf/ptypes"
29 "github.com/golang/protobuf/ptypes/any"
Esin Karamanccb714b2019-11-29 15:02:06 +000030 "github.com/opencord/voltha-lib-go/v3/pkg/db"
31 fu "github.com/opencord/voltha-lib-go/v3/pkg/flows"
32 "github.com/opencord/voltha-lib-go/v3/pkg/log"
Kent Hagermane6ff1012020-07-14 15:07:53 -040033 "github.com/opencord/voltha-lib-go/v3/pkg/pmmetrics"
Esin Karamanccb714b2019-11-29 15:02:06 +000034 ponrmgr "github.com/opencord/voltha-lib-go/v3/pkg/ponresourcemanager"
kesavand494c2082020-08-31 11:16:12 +053035 "github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
Thomas Lee S94109f12020-03-03 16:39:29 +053036 "github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
Scott Bakerdbd960e2020-02-28 08:57:51 -080037 "github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
38 "github.com/opencord/voltha-openolt-adapter/pkg/mocks"
Esin Karamanccb714b2019-11-29 15:02:06 +000039 ic "github.com/opencord/voltha-protos/v3/go/inter_container"
40 of "github.com/opencord/voltha-protos/v3/go/openflow_13"
41 ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
42 oop "github.com/opencord/voltha-protos/v3/go/openolt"
43 "github.com/opencord/voltha-protos/v3/go/voltha"
kdarapu381c6902019-07-31 18:23:16 +053044)
45
kdarapu891693b2019-09-16 12:33:49 +053046func newMockCoreProxy() *mocks.MockCoreProxy {
Kent Hagermanf1db18b2020-07-08 13:38:15 -040047 mcp := mocks.MockCoreProxy{
48 Devices: make(map[string]*voltha.Device),
49 DevicePorts: make(map[string][]*voltha.Port),
50 }
Naga Manjunath7615e552019-10-11 22:35:47 +053051 var pm []*voltha.PmConfig
kdarapu891693b2019-09-16 12:33:49 +053052 mcp.Devices["olt"] = &voltha.Device{
kdarapu891693b2019-09-16 12:33:49 +053053 Id: "olt",
54 Root: true,
55 ParentId: "logical_device",
56 ParentPortNo: 1,
kdarapu891693b2019-09-16 12:33:49 +053057 ProxyAddress: &voltha.Device_ProxyAddress{
58 DeviceId: "olt",
59 DeviceType: "onu",
60 ChannelId: 1,
61 ChannelGroupId: 1,
62 },
63 ConnectStatus: 1,
Naga Manjunath7615e552019-10-11 22:35:47 +053064 PmConfigs: &voltha.PmConfigs{
65 DefaultFreq: 10,
66 Id: "olt",
67 FreqOverride: false,
68 Grouped: false,
69 Metrics: pm,
70 },
kdarapu891693b2019-09-16 12:33:49 +053071 }
Kent Hagermanf1db18b2020-07-08 13:38:15 -040072 mcp.DevicePorts["olt"] = []*voltha.Port{
73 {PortNo: 1, Label: "pon"},
74 {PortNo: 2, Label: "nni"},
75 }
kdarapu891693b2019-09-16 12:33:49 +053076
Kent Hagermanf1db18b2020-07-08 13:38:15 -040077 mcp.Devices["onu1"] = &voltha.Device{
kdarapu891693b2019-09-16 12:33:49 +053078 Id: "1",
79 Root: false,
80 ParentId: "olt",
81 ParentPortNo: 1,
82
kdarapu891693b2019-09-16 12:33:49 +053083 OperStatus: 4,
84 ProxyAddress: &voltha.Device_ProxyAddress{
85 OnuId: 1,
86 ChannelId: 1,
87 ChannelGroupId: 1,
88 },
89 ConnectStatus: 1,
Naga Manjunath7615e552019-10-11 22:35:47 +053090 PmConfigs: &voltha.PmConfigs{
91 DefaultFreq: 10,
92 Id: "olt",
93 FreqOverride: false,
94 Grouped: false,
95 Metrics: pm,
96 },
kdarapu891693b2019-09-16 12:33:49 +053097 }
Kent Hagermanf1db18b2020-07-08 13:38:15 -040098 mcp.DevicePorts["onu1"] = []*voltha.Port{
99 {PortNo: 1, Label: "pon"},
100 {PortNo: 2, Label: "uni"},
101 }
102
kdarapu891693b2019-09-16 12:33:49 +0530103 mcp.Devices["onu2"] = &voltha.Device{
104 Id: "2",
105 Root: false,
106 ParentId: "olt",
107 OperStatus: 2,
kdarapu891693b2019-09-16 12:33:49 +0530108
109 ParentPortNo: 1,
110
111 ProxyAddress: &voltha.Device_ProxyAddress{
112 OnuId: 2,
113 ChannelId: 1,
114 ChannelGroupId: 1,
115 },
116 ConnectStatus: 1,
Naga Manjunath7615e552019-10-11 22:35:47 +0530117 PmConfigs: &voltha.PmConfigs{
118 DefaultFreq: 10,
119 Id: "olt",
120 FreqOverride: false,
121 Grouped: false,
122 Metrics: pm,
123 },
kdarapu891693b2019-09-16 12:33:49 +0530124 }
Kent Hagermanf1db18b2020-07-08 13:38:15 -0400125 mcp.DevicePorts["onu2"] = []*voltha.Port{
126 {PortNo: 1, Label: "pon"},
127 {PortNo: 2, Label: "uni"},
128 }
kdarapu891693b2019-09-16 12:33:49 +0530129 return &mcp
130}
131func newMockDeviceHandler() *DeviceHandler {
kdarapu381c6902019-07-31 18:23:16 +0530132 device := &voltha.Device{
133 Id: "olt",
134 Root: true,
135 ParentId: "logical_device",
kdarapu891693b2019-09-16 12:33:49 +0530136 ProxyAddress: &voltha.Device_ProxyAddress{
137 DeviceId: "olt",
138 DeviceType: "onu",
139 ChannelId: 1,
140 ChannelGroupId: 1,
141 },
142 ConnectStatus: 1,
kdarapu381c6902019-07-31 18:23:16 +0530143 }
kdarapu891693b2019-09-16 12:33:49 +0530144 cp := newMockCoreProxy()
145 ap := &mocks.MockAdapterProxy{}
146 ep := &mocks.MockEventProxy{}
kesavand494c2082020-08-31 11:16:12 +0530147 cfg := &config.AdapterFlags{OmccEncryption: true}
148 openOLT := &OpenOLT{coreProxy: cp, adapterProxy: ap, eventProxy: ep, config: cfg}
kdarapu891693b2019-09-16 12:33:49 +0530149 dh := NewDeviceHandler(cp, ap, ep, device, openOLT)
Girish Gowdra38d533d2020-03-30 20:38:51 -0700150 oopRanges := []*oop.DeviceInfo_DeviceResourceRanges{{
151 IntfIds: []uint32{0, 1},
152 Technology: "xgs-pon",
153 Pools: []*oop.DeviceInfo_DeviceResourceRanges_Pool{{}},
154 }}
155
Thomas Lee S985938d2020-05-04 11:40:41 +0530156 deviceInf := &oop.DeviceInfo{Vendor: "openolt", Ranges: oopRanges, Model: "openolt", DeviceId: dh.device.Id, PonPorts: 2}
157 rsrMgr := resourcemanager.OpenOltResourceMgr{DeviceID: dh.device.Id, DeviceType: dh.device.Type, DevInfo: deviceInf,
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530158 KVStore: &db.Backend{
159 Client: &mocks.MockKVClient{},
160 }}
Girish Gowdra38d533d2020-03-30 20:38:51 -0700161 rsrMgr.AllocIDMgmtLock = make([]sync.RWMutex, deviceInf.PonPorts)
162 rsrMgr.GemPortIDMgmtLock = make([]sync.RWMutex, deviceInf.PonPorts)
163 rsrMgr.OnuIDMgmtLock = make([]sync.RWMutex, deviceInf.PonPorts)
164
165 dh.resourceMgr = &rsrMgr
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530166 dh.resourceMgr.ResourceMgrs = make(map[uint32]*ponrmgr.PONResourceManager)
167 ranges := make(map[string]interface{})
168 sharedIdxByType := make(map[string]string)
169 sharedIdxByType["ALLOC_ID"] = "ALLOC_ID"
170 sharedIdxByType["ONU_ID"] = "ONU_ID"
171 sharedIdxByType["GEMPORT_ID"] = "GEMPORT_ID"
172 sharedIdxByType["FLOW_ID"] = "FLOW_ID"
173 ranges["ONU_ID"] = uint32(0)
174 ranges["GEMPORT_ID"] = uint32(0)
175 ranges["ALLOC_ID"] = uint32(0)
176 ranges["FLOW_ID"] = uint32(0)
177 ranges["onu_id_shared"] = uint32(0)
178 ranges["alloc_id_shared"] = uint32(0)
179 ranges["gemport_id_shared"] = uint32(0)
180 ranges["flow_id_shared"] = uint32(0)
181
182 ponmgr := &ponrmgr.PONResourceManager{
183 DeviceID: "onu-1",
Girish Gowdra38d533d2020-03-30 20:38:51 -0700184 IntfIDs: []uint32{0, 1},
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530185 KVStore: &db.Backend{
186 Client: &mocks.MockKVClient{},
187 },
188 PonResourceRanges: ranges,
189 SharedIdxByType: sharedIdxByType,
190 }
Girish Gowdra38d533d2020-03-30 20:38:51 -0700191 dh.resourceMgr.ResourceMgrs[0] = ponmgr
Abhilash Laxmeshwarab0bd522019-10-21 15:05:15 +0530192 dh.resourceMgr.ResourceMgrs[1] = ponmgr
npujarec5762e2020-01-01 14:08:48 +0530193 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
194 defer cancel()
195 dh.flowMgr = NewFlowManager(ctx, dh, dh.resourceMgr)
kdarapu891693b2019-09-16 12:33:49 +0530196 dh.Client = &mocks.MockOpenoltClient{}
kesavand39e0aa32020-01-28 20:58:50 -0500197 dh.eventMgr = &OpenOltEventMgr{eventProxy: &mocks.MockEventProxy{}, handler: dh}
kdarapu891693b2019-09-16 12:33:49 +0530198 dh.transitionMap = &TransitionMap{}
Naga Manjunath7615e552019-10-11 22:35:47 +0530199 dh.portStats = &OpenOltStatisticsMgr{}
Amit Ghoshd4cbe482019-11-21 12:07:14 +0000200
201 var pmNames = []string{
202 "rx_bytes",
203 "rx_packets",
204 "rx_mcast_packets",
205 "rx_bcast_packets",
206 "tx_bytes",
207 "tx_packets",
208 "tx_mcast_packets",
209 "tx_bcast_packets",
210 }
211
212 dh.metrics = pmmetrics.NewPmMetrics(device.Id, pmmetrics.Frequency(2), pmmetrics.FrequencyOverride(false), pmmetrics.Grouped(false), pmmetrics.Metrics(pmNames))
kdarapu891693b2019-09-16 12:33:49 +0530213 return dh
kdarapu381c6902019-07-31 18:23:16 +0530214}
215
kdarapu891693b2019-09-16 12:33:49 +0530216func negativeDeviceHandler() *DeviceHandler {
217 dh := newMockDeviceHandler()
218 device := dh.device
219 device.Id = ""
kdarapu891693b2019-09-16 12:33:49 +0530220 return dh
221}
kdarapu381c6902019-07-31 18:23:16 +0530222func Test_generateMacFromHost(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000223 ctx := context.Background()
kdarapu381c6902019-07-31 18:23:16 +0530224 type args struct {
225 host string
226 }
227 tests := []struct {
228 name string
229 args args
230 want string
231 wantErr bool
232 }{
kdarapu891693b2019-09-16 12:33:49 +0530233 {"generateMacFromHost-1", args{host: "localhost"}, "00:00:7f:00:00:01", false},
234 {"generateMacFromHost-2", args{host: "10.10.10.10"}, "00:00:0a:0a:0a:0a", false},
235 //{"generateMacFromHost-3", args{host: "google.com"}, "00:00:d8:3a:c8:8e", false},
236 {"generateMacFromHost-4", args{host: "testing3"}, "", true},
kdarapu381c6902019-07-31 18:23:16 +0530237 }
238 for _, tt := range tests {
239 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000240 got, err := generateMacFromHost(ctx, tt.args.host)
kdarapu381c6902019-07-31 18:23:16 +0530241 if (err != nil) != tt.wantErr {
242 t.Errorf("generateMacFromHost() error = %v, wantErr %v", err, tt.wantErr)
243 return
244 }
245 if got != tt.want {
246 t.Errorf("generateMacFromHost() = %v, want %v", got, tt.want)
247 }
248 })
249 }
250}
251func Test_macifyIP(t *testing.T) {
252 type args struct {
253 ip net.IP
254 }
255 tests := []struct {
256 name string
257 args args
258 want string
259 }{{
kdarapu891693b2019-09-16 12:33:49 +0530260 "macifyIP-1",
kdarapu381c6902019-07-31 18:23:16 +0530261 args{ip: net.ParseIP("10.10.10.10")},
262 "00:00:0a:0a:0a:0a",
263 },
264 {
kdarapu891693b2019-09-16 12:33:49 +0530265 "macifyIP-2",
kdarapu381c6902019-07-31 18:23:16 +0530266 args{ip: net.ParseIP("127.0.0.1")},
267 "00:00:7f:00:00:01",
kdarapu891693b2019-09-16 12:33:49 +0530268 },
269 {
270 "macifyIP-3",
271 args{ip: net.ParseIP("127.0.0.1/24")},
272 "",
273 },
274 }
kdarapu381c6902019-07-31 18:23:16 +0530275 for _, tt := range tests {
276 t.Run(tt.name, func(t *testing.T) {
277 if got := macifyIP(tt.args.ip); got != tt.want {
278 t.Errorf("macifyIP() = %v, want %v", got, tt.want)
279 }
280 })
281 }
282}
283
David K. Bainbridge794735f2020-02-11 21:01:37 -0800284func sparseCompare(keys []string, spec, target interface{}) bool {
285 if spec == target {
286 return true
287 }
288 if spec == nil || target == nil {
289 return false
290 }
291 typeSpec := reflect.TypeOf(spec)
292 typeTarget := reflect.TypeOf(target)
293 if typeSpec != typeTarget {
294 return false
295 }
296
297 vSpec := reflect.ValueOf(spec)
298 vTarget := reflect.ValueOf(target)
299 if vSpec.Kind() == reflect.Ptr {
300 vSpec = vSpec.Elem()
301 vTarget = vTarget.Elem()
302 }
303
304 for _, key := range keys {
305 fSpec := vSpec.FieldByName(key)
306 fTarget := vTarget.FieldByName(key)
307 if !reflect.DeepEqual(fSpec.Interface(), fTarget.Interface()) {
308 return false
309 }
310 }
311 return true
312}
313
kdarapu381c6902019-07-31 18:23:16 +0530314func TestDeviceHandler_GetChildDevice(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000315 ctx := context.Background()
kdarapu891693b2019-09-16 12:33:49 +0530316 dh1 := newMockDeviceHandler()
317 dh2 := negativeDeviceHandler()
kdarapu381c6902019-07-31 18:23:16 +0530318 type args struct {
319 parentPort uint32
320 onuID uint32
321 }
322 tests := []struct {
kdarapu891693b2019-09-16 12:33:49 +0530323 name string
324 devicehandler *DeviceHandler
325 args args
326 want *voltha.Device
David K. Bainbridge794735f2020-02-11 21:01:37 -0800327 errType reflect.Type
kdarapu381c6902019-07-31 18:23:16 +0530328 }{
kdarapu891693b2019-09-16 12:33:49 +0530329 {"GetChildDevice-1", dh1,
330 args{parentPort: 1,
331 onuID: 1},
David K. Bainbridge794735f2020-02-11 21:01:37 -0800332 &voltha.Device{
333 Id: "1",
334 ParentId: "olt",
335 ParentPortNo: 1,
336 },
337 nil,
kdarapu891693b2019-09-16 12:33:49 +0530338 },
339 {"GetChildDevice-2", dh2,
kdarapu381c6902019-07-31 18:23:16 +0530340 args{parentPort: 1,
341 onuID: 1},
David K. Bainbridge794735f2020-02-11 21:01:37 -0800342 nil,
Thomas Lee S94109f12020-03-03 16:39:29 +0530343 reflect.TypeOf(&olterrors.ErrNotFound{}),
kdarapu381c6902019-07-31 18:23:16 +0530344 },
345 }
David K. Bainbridge794735f2020-02-11 21:01:37 -0800346
347 /*
348 --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-1 (0.00s)
349 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>)
350 --- FAIL: TestDeviceHandler_GetChildDevice/GetChildDevice-2 (0.00s)
351 */
kdarapu381c6902019-07-31 18:23:16 +0530352 for _, tt := range tests {
353 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000354 got, err := tt.devicehandler.GetChildDevice(ctx, tt.args.parentPort, tt.args.onuID)
David K. Bainbridge794735f2020-02-11 21:01:37 -0800355 if reflect.TypeOf(err) != tt.errType || !sparseCompare([]string{"Id", "ParentId", "ParentPortNo"}, tt.want, got) {
356 t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
357 tt.want, tt.errType, got, reflect.TypeOf(err))
358 return
359 }
kdarapu381c6902019-07-31 18:23:16 +0530360 t.Log("onu device id", got)
361 })
362 }
363}
kdarapu891693b2019-09-16 12:33:49 +0530364
365func TestGetportLabel(t *testing.T) {
Thomas Lee S94109f12020-03-03 16:39:29 +0530366 invalid := reflect.TypeOf(&olterrors.ErrInvalidValue{})
kdarapu891693b2019-09-16 12:33:49 +0530367 type args struct {
368 portNum uint32
369 portType voltha.Port_PortType
370 }
371 tests := []struct {
David K. Bainbridge794735f2020-02-11 21:01:37 -0800372 name string
373 args args
374 want string
375 errType reflect.Type
kdarapu891693b2019-09-16 12:33:49 +0530376 }{
David K. Bainbridge794735f2020-02-11 21:01:37 -0800377 {"GetportLabel-1", args{portNum: 0, portType: 0}, "", invalid},
378 {"GetportLabel-2", args{portNum: 1, portType: 1}, "nni-1", nil},
379 {"GetportLabel-3", args{portNum: 2, portType: 2}, "", invalid},
380 {"GetportLabel-4", args{portNum: 3, portType: 3}, "pon-3", nil},
381 {"GetportLabel-5", args{portNum: 4, portType: 4}, "", invalid},
382 {"GetportLabel-6", args{portNum: 5, portType: 5}, "", invalid},
383 {"GetportLabel-7", args{portNum: 6, portType: 6}, "", invalid},
kdarapu891693b2019-09-16 12:33:49 +0530384 }
385 for _, tt := range tests {
386 t.Run(tt.name, func(t *testing.T) {
David K. Bainbridge794735f2020-02-11 21:01:37 -0800387 got, err := GetportLabel(tt.args.portNum, tt.args.portType)
388 if reflect.TypeOf(err) != tt.errType || got != tt.want {
389 t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
390 tt.want, tt.errType, got, reflect.TypeOf(err))
kdarapu891693b2019-09-16 12:33:49 +0530391 }
David K. Bainbridge794735f2020-02-11 21:01:37 -0800392
kdarapu891693b2019-09-16 12:33:49 +0530393 })
394 }
395}
396
397func TestDeviceHandler_ProcessInterAdapterMessage(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000398 ctx := context.Background()
kdarapu891693b2019-09-16 12:33:49 +0530399 dh := newMockDeviceHandler()
400 proxyAddr := dh.device.ProxyAddress
401 body := &ic.InterAdapterOmciMessage{
402 Message: []byte("asdfasdfasdfasdfas"),
403 ProxyAddress: proxyAddr,
404 }
405 body2 := &ic.InterAdapterOmciMessage{
406 Message: []byte("asdfasdfasdfasdfas"),
407 //ProxyAddress: &voltha.Device_ProxyAddress{},
408 }
409 body3 := &ic.InterAdapterTechProfileDownloadMessage{}
410 var marshalledData *any.Any
411 var err error
412
413 if marshalledData, err = ptypes.MarshalAny(body); err != nil {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000414 logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"error": err})
kdarapu891693b2019-09-16 12:33:49 +0530415 }
416
417 var marshalledData1 *any.Any
418
419 if marshalledData1, err = ptypes.MarshalAny(body2); err != nil {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000420 logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"error": err})
kdarapu891693b2019-09-16 12:33:49 +0530421 }
422 var marshalledData2 *any.Any
423
424 if marshalledData2, err = ptypes.MarshalAny(body3); err != nil {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000425 logger.Errorw(ctx, "cannot-marshal-request", log.Fields{"error": err})
kdarapu891693b2019-09-16 12:33:49 +0530426 }
427 type args struct {
428 msg *ic.InterAdapterMessage
429 }
Thomas Lee S94109f12020-03-03 16:39:29 +0530430 invalid := reflect.TypeOf(&olterrors.ErrInvalidValue{})
kdarapu891693b2019-09-16 12:33:49 +0530431 tests := []struct {
432 name string
433 args args
David K. Bainbridge794735f2020-02-11 21:01:37 -0800434 wantErr reflect.Type
kdarapu891693b2019-09-16 12:33:49 +0530435 }{
436 {"ProcessInterAdapterMessage-1", args{msg: &ic.InterAdapterMessage{
437 Header: &ic.InterAdapterHeader{
438 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800439 Type: ic.InterAdapterMessageType_FLOW_REQUEST,
kdarapu891693b2019-09-16 12:33:49 +0530440 },
441 Body: marshalledData,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800442 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530443 {"ProcessInterAdapterMessage-2", args{msg: &ic.InterAdapterMessage{
444 Header: &ic.InterAdapterHeader{
445 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800446 Type: ic.InterAdapterMessageType_FLOW_RESPONSE,
kdarapu891693b2019-09-16 12:33:49 +0530447 },
448 Body: marshalledData1,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800449 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530450 {"ProcessInterAdapterMessage-3", args{msg: &ic.InterAdapterMessage{
451 Header: &ic.InterAdapterHeader{
452 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800453 Type: ic.InterAdapterMessageType_OMCI_REQUEST,
kdarapu891693b2019-09-16 12:33:49 +0530454 },
455 Body: marshalledData,
Thomas Lee S94109f12020-03-03 16:39:29 +0530456 }}, reflect.TypeOf(&olterrors.ErrCommunication{})},
kdarapu891693b2019-09-16 12:33:49 +0530457 {"ProcessInterAdapterMessage-4", args{msg: &ic.InterAdapterMessage{
458 Header: &ic.InterAdapterHeader{
459 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800460 Type: ic.InterAdapterMessageType_OMCI_RESPONSE,
kdarapu891693b2019-09-16 12:33:49 +0530461 }, Body: marshalledData,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800462 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530463 {"ProcessInterAdapterMessage-5", args{msg: &ic.InterAdapterMessage{
464 Header: &ic.InterAdapterHeader{
465 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800466 Type: ic.InterAdapterMessageType_METRICS_REQUEST,
kdarapu891693b2019-09-16 12:33:49 +0530467 }, Body: marshalledData1,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800468 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530469 {"ProcessInterAdapterMessage-6", args{msg: &ic.InterAdapterMessage{
470 Header: &ic.InterAdapterHeader{
471 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800472 Type: ic.InterAdapterMessageType_METRICS_RESPONSE,
kdarapu891693b2019-09-16 12:33:49 +0530473 }, Body: marshalledData,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800474 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530475 {"ProcessInterAdapterMessage-7", args{msg: &ic.InterAdapterMessage{
476 Header: &ic.InterAdapterHeader{
477 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800478 Type: ic.InterAdapterMessageType_ONU_IND_REQUEST,
kdarapu891693b2019-09-16 12:33:49 +0530479 }, Body: marshalledData,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800480 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530481 {"ProcessInterAdapterMessage-8", args{msg: &ic.InterAdapterMessage{
482 Header: &ic.InterAdapterHeader{
483 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800484 Type: ic.InterAdapterMessageType_ONU_IND_RESPONSE,
kdarapu891693b2019-09-16 12:33:49 +0530485 }, Body: marshalledData,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800486 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530487 {"ProcessInterAdapterMessage-9", args{msg: &ic.InterAdapterMessage{
488 Header: &ic.InterAdapterHeader{
489 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800490 Type: ic.InterAdapterMessageType_TECH_PROFILE_DOWNLOAD_REQUEST,
kdarapu891693b2019-09-16 12:33:49 +0530491 }, Body: marshalledData,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800492 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530493 {"ProcessInterAdapterMessage-10", args{msg: &ic.InterAdapterMessage{
494 Header: &ic.InterAdapterHeader{
495 Id: "012345",
David K. Bainbridge794735f2020-02-11 21:01:37 -0800496 Type: ic.InterAdapterMessageType_DELETE_GEM_PORT_REQUEST,
kdarapu891693b2019-09-16 12:33:49 +0530497 }, Body: marshalledData2,
David K. Bainbridge794735f2020-02-11 21:01:37 -0800498 }}, invalid},
499 {"ProcessInterAdapterMessage-11", args{msg: &ic.InterAdapterMessage{
500 Header: &ic.InterAdapterHeader{
501 Id: "012345",
502 Type: ic.InterAdapterMessageType_DELETE_TCONT_REQUEST,
503 }, Body: marshalledData2,
504 }}, invalid},
kdarapu891693b2019-09-16 12:33:49 +0530505 }
506 for _, tt := range tests {
507 t.Run(tt.name, func(t *testing.T) {
508
Neha Sharma96b7bf22020-06-15 10:37:32 +0000509 if err := dh.ProcessInterAdapterMessage(ctx, tt.args.msg); reflect.TypeOf(err) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530510 t.Errorf("DeviceHandler.ProcessInterAdapterMessage() error = %v, wantErr %v", err, tt.wantErr)
511 }
512 })
513 }
514}
515
516func TestDeviceHandler_sendProxiedMessage(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000517 ctx := context.Background()
kdarapu891693b2019-09-16 12:33:49 +0530518 dh1 := newMockDeviceHandler()
519 dh2 := negativeDeviceHandler()
520 device1 := &voltha.Device{
521 Id: "onu1",
522 Root: false,
523 ParentId: "logical_device",
524 ProxyAddress: &voltha.Device_ProxyAddress{
525 DeviceId: "onu1",
526 DeviceType: "onu",
527 ChannelId: 1,
528 ChannelGroupId: 1,
529 },
530 ConnectStatus: 1,
531 }
532 device2 := device1
533 device2.ConnectStatus = 2
534 iaomciMsg1 := &ic.InterAdapterOmciMessage{
535 ProxyAddress: &voltha.Device_ProxyAddress{
536 DeviceId: "onu2",
537 DeviceType: "onu",
538 ChannelId: 1,
539 ChannelGroupId: 1,
540 //OnuId: 2,
541 },
542 ConnectStatus: 1,
543 }
544 iaomciMsg2 := &ic.InterAdapterOmciMessage{
545 ProxyAddress: &voltha.Device_ProxyAddress{
546 DeviceId: "onu3",
547 DeviceType: "onu",
548 ChannelId: 1,
549 ChannelGroupId: 1,
550 },
551 ConnectStatus: 1,
552 }
553 type args struct {
554 onuDevice *voltha.Device
555 omciMsg *ic.InterAdapterOmciMessage
556 }
557 tests := []struct {
558 name string
559 devicehandler *DeviceHandler
560 args args
561 }{
562 {"sendProxiedMessage-1", dh1, args{onuDevice: device1, omciMsg: &ic.InterAdapterOmciMessage{}}},
563 {"sendProxiedMessage-2", dh1, args{onuDevice: device2, omciMsg: &ic.InterAdapterOmciMessage{}}},
564 {"sendProxiedMessage-3", dh1, args{onuDevice: nil, omciMsg: iaomciMsg1}},
565 {"sendProxiedMessage-4", dh1, args{onuDevice: nil, omciMsg: iaomciMsg2}},
566 {"sendProxiedMessage-5", dh2, args{onuDevice: nil, omciMsg: iaomciMsg2}},
567 {"sendProxiedMessage-6", dh2, args{onuDevice: device1, omciMsg: &ic.InterAdapterOmciMessage{}}},
568 }
569 for _, tt := range tests {
570 t.Run(tt.name, func(t *testing.T) {
Kent Hagermane6ff1012020-07-14 15:07:53 -0400571 _ = tt.devicehandler.sendProxiedMessage(ctx, tt.args.onuDevice, tt.args.omciMsg)
572 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530573 })
574 }
575}
576
577func TestDeviceHandler_SendPacketInToCore(t *testing.T) {
578 dh1 := newMockDeviceHandler()
579 dh2 := negativeDeviceHandler()
580
581 type args struct {
582 logicalPort uint32
583 packetPayload []byte
584 }
585 tests := []struct {
586 name string
587 devicehandler *DeviceHandler
588 args args
589 }{
590 {"SendPacketInToCore-1", dh1, args{logicalPort: 1, packetPayload: []byte("test1")}},
591 {"SendPacketInToCore-2", dh1, args{logicalPort: 1, packetPayload: []byte("")}},
592 {"SendPacketInToCore-3", dh2, args{logicalPort: 1, packetPayload: []byte("test1")}},
593 }
594 for _, tt := range tests {
595 t.Run(tt.name, func(t *testing.T) {
Kent Hagermane6ff1012020-07-14 15:07:53 -0400596 _ = tt.devicehandler.SendPacketInToCore(context.Background(), tt.args.logicalPort, tt.args.packetPayload)
597 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530598 })
599 }
600}
601
602func TestDeviceHandler_DisableDevice(t *testing.T) {
603 dh1 := newMockDeviceHandler()
604 dh2 := negativeDeviceHandler()
605 type args struct {
606 device *voltha.Device
607 }
608 tests := []struct {
609 name string
610 devicehandler *DeviceHandler
611 args args
612 wantErr bool
613 }{
614 {"DisableDevice-1", dh1, args{device: dh1.device}, false},
Chaitrashree G S3b4c0352019-09-09 20:59:29 -0400615 {"DisableDevice-2", dh1, args{device: dh2.device}, true},
kdarapu891693b2019-09-16 12:33:49 +0530616 }
617 for _, tt := range tests {
618 t.Run(tt.name, func(t *testing.T) {
Neha Sharma96b7bf22020-06-15 10:37:32 +0000619 if err := tt.devicehandler.DisableDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530620 t.Errorf("DeviceHandler.DisableDevice() error = %v, wantErr %v", err, tt.wantErr)
621 }
622 })
623 }
624}
625
626func TestDeviceHandler_ReenableDevice(t *testing.T) {
627 dh1 := newMockDeviceHandler()
628 dh2 := negativeDeviceHandler()
629 type args struct {
630 device *voltha.Device
631 }
632 tests := []struct {
633 name string
634 devicehandler *DeviceHandler
635 args args
636 wantErr bool
637 }{
638 {"ReenableDevice-1", dh1, args{device: dh1.device}, false},
639 {"ReenableDevice-2", dh1, args{device: &voltha.Device{}}, true},
640 {"ReenableDevice-3", dh2, args{device: dh1.device}, false},
641 }
642 for _, tt := range tests {
643 t.Run(tt.name, func(t *testing.T) {
644 dh := tt.devicehandler
Neha Sharma96b7bf22020-06-15 10:37:32 +0000645 if err := dh.ReenableDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530646 t.Errorf("DeviceHandler.ReenableDevice() error = %v, wantErr %v", err, tt.wantErr)
647 }
648 })
649 }
650}
651
652func TestDeviceHandler_RebootDevice(t *testing.T) {
653 dh1 := newMockDeviceHandler()
654 dh2 := newMockDeviceHandler()
655 type args struct {
656 device *voltha.Device
657 }
658 tests := []struct {
659 name string
660 devicehandler *DeviceHandler
661 args args
662 wantErr bool
663 }{
664 // TODO: Add test cases.
665 {"RebootDevice-1", dh1, args{device: dh1.device}, false},
666 {"RebootDevice-2", dh1, args{device: dh2.device}, true},
667 {"RebootDevice-3", dh2, args{device: dh2.device}, false},
668 }
669 for _, tt := range tests {
670 t.Run(tt.name, func(t *testing.T) {
671
Neha Sharma96b7bf22020-06-15 10:37:32 +0000672 if err := tt.devicehandler.RebootDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530673 t.Errorf("DeviceHandler.RebootDevice() error = %v, wantErr %v", err, tt.wantErr)
674 }
675 })
676 }
677}
678
679func TestDeviceHandler_handleIndication(t *testing.T) {
680 dh1 := newMockDeviceHandler()
681 dh2 := negativeDeviceHandler()
682 dh3 := newMockDeviceHandler()
Naga Manjunatha8dc9372019-10-31 23:01:18 +0530683 dh3.onus = sync.Map{}
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +0530684 dh3.onus.Store("onu1", NewOnuDevice("onu1", "onu1", "onu1", 1, 1, "onu1", false))
685 dh3.onus.Store("onu2", NewOnuDevice("onu2", "onu2", "onu2", 2, 2, "onu2", false))
Naga Manjunatha8dc9372019-10-31 23:01:18 +0530686
kdarapu891693b2019-09-16 12:33:49 +0530687 type args struct {
688 indication *oop.Indication
689 }
690 tests := []struct {
691 name string
692 deviceHandler *DeviceHandler
693 args args
694 }{
695 // TODO: Add test cases.
696 {"handleIndication-1", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "up"}}}}},
697 {"handleIndication-2", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "down"}}}}},
698 {"handleIndication-3", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "up"}}}}},
699 {"handleIndication-4", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "down"}}}}},
700 {"handleIndication-5", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "nni", IntfId: 1, OperState: "up"}}}}},
701 {"handleIndication-6", dh1, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "pon", IntfId: 1, OperState: "up"}}}}},
702 {"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")}}}}}},
703 {"handleIndication-8", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
704 {"handleIndication-9", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
705 {"handleIndication-10", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
706 {"handleIndication-11", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
707 {"handleIndication-12", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 1, Pkt: []byte("onu123-random value")}}}}},
708 {"handleIndication-13", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", IntfId: 1, GemportId: 1, FlowId: 1234, PortNo: 1}}}}},
709 {"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}}}}},
710 {"handleIndication-15", dh1, args{indication: &oop.Indication{Data: &oop.Indication_FlowStats{FlowStats: &oop.FlowStatistics{RxBytes: 100, RxPackets: 100, TxBytes: 100, TxPackets: 100, Timestamp: 1000}}}}},
711 {"handleIndication-16", dh1, args{indication: &oop.Indication{Data: &oop.Indication_AlarmInd{AlarmInd: &oop.AlarmIndication{}}}}},
712 {"handleIndication-17", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", FlowId: 1234, PortNo: 1}}}}},
713 {"handleIndication-18", dh1, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{}}}}},
714
715 // Negative testcases
716 {"handleIndication-19", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "up"}}}}},
717 {"handleIndication-20", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OltInd{OltInd: &oop.OltIndication{OperState: "down"}}}}},
718 {"handleIndication-21", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "up"}}}}},
719 {"handleIndication-22", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfInd{IntfInd: &oop.IntfIndication{IntfId: 1, OperState: "down"}}}}},
720 {"handleIndication-23", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "nni", IntfId: 1, OperState: "up"}}}}},
721 {"handleIndication-24", dh2, args{indication: &oop.Indication{Data: &oop.Indication_IntfOperInd{IntfOperInd: &oop.IntfOperIndication{Type: "pon", IntfId: 1, OperState: "up"}}}}},
722 {"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")}}}}}},
723 {"handleIndication-26", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
724 {"handleIndication-27", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
725 {"handleIndication-28", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
726 {"handleIndication-29", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
727 {"handleIndication-30", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 1, Pkt: []byte("onu123-random value")}}}}},
728 {"handleIndication-31", dh2, args{indication: &oop.Indication{Data: &oop.Indication_PktInd{PktInd: &oop.PacketIndication{IntfType: "nni", IntfId: 1, GemportId: 1, FlowId: 1234, PortNo: 1}}}}},
729 {"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}}}}},
730 {"handleIndication-33", dh2, args{indication: &oop.Indication{Data: &oop.Indication_FlowStats{FlowStats: &oop.FlowStatistics{RxBytes: 100, RxPackets: 100, TxBytes: 100, TxPackets: 100, Timestamp: 1000}}}}},
731 {"handleIndication-34", dh2, args{indication: &oop.Indication{Data: &oop.Indication_AlarmInd{AlarmInd: &oop.AlarmIndication{}}}}},
732 //
733 {"handleIndication-35", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "up"}}}}},
734 {"handleIndication-36", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "up"}}}}},
735 {"handleIndication-37", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "up", AdminState: "down"}}}}},
736 {"handleIndication-38", dh3, args{indication: &oop.Indication{Data: &oop.Indication_OnuInd{OnuInd: &oop.OnuIndication{IntfId: 1, OnuId: 1, OperState: "down", AdminState: "down"}}}}},
737 {"handleIndication-30", dh1, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 4, Pkt: []byte("onu123-random value")}}}}},
738 {"handleIndication-30", dh2, args{indication: &oop.Indication{Data: &oop.Indication_OmciInd{OmciInd: &oop.OmciIndication{IntfId: 1, OnuId: 4, Pkt: []byte("onu123-random value")}}}}},
739 }
740 for _, tt := range tests {
741 t.Run(tt.name, func(t *testing.T) {
742 dh := tt.deviceHandler
npujarec5762e2020-01-01 14:08:48 +0530743 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
744 defer cancel()
745 dh.handleIndication(ctx, tt.args.indication)
kdarapu891693b2019-09-16 12:33:49 +0530746 })
747 }
748}
749
750func TestDeviceHandler_addPort(t *testing.T) {
751 dh1 := newMockDeviceHandler()
752 dh2 := negativeDeviceHandler()
753 type args struct {
754 intfID uint32
755 portType voltha.Port_PortType
756 state string
757 }
758 tests := []struct {
759 name string
760 devicehandler *DeviceHandler
761 args args
762 }{
763 // State up
764 {"addPort.1", dh1, args{intfID: 1, portType: voltha.Port_UNKNOWN, state: "up"}},
765 {"addPort.2", dh1, args{intfID: 1, portType: voltha.Port_VENET_OLT, state: "up"}},
766 {"addPort.3", dh1, args{intfID: 1, portType: voltha.Port_VENET_ONU, state: "up"}},
767 {"addPort.4", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up"}},
768 {"addPort.5", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "up"}},
769 {"addPort.6", dh1, args{intfID: 1, portType: voltha.Port_PON_OLT, state: "up"}},
770 {"addPort.7", dh1, args{intfID: 1, portType: voltha.Port_PON_ONU, state: "up"}},
771 {"addPort.8", dh1, args{intfID: 1, portType: 8, state: "up"}},
772 // state discovery
773 {"addPort.9", dh1, args{intfID: 1, portType: voltha.Port_UNKNOWN, state: "down"}},
774 {"addPort.10", dh1, args{intfID: 1, portType: voltha.Port_VENET_OLT, state: "down"}},
775 {"addPort.11", dh1, args{intfID: 1, portType: voltha.Port_VENET_ONU, state: "down"}},
776 {"addPort.12", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "down"}},
777 {"addPort.13", dh1, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "down"}},
778 {"addPort.14", dh1, args{intfID: 1, portType: voltha.Port_PON_OLT, state: "down"}},
779 {"addPort.15", dh1, args{intfID: 1, portType: voltha.Port_PON_ONU, state: "down"}},
780 {"addPort.16", dh1, args{intfID: 1, portType: 8, state: "down"}},
781
782 {"addPort.17", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "up"}},
783 {"addPort.18", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "up"}},
784 {"addPort.19", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_NNI, state: "down"}},
785 {"addPort.20", dh2, args{intfID: 1, portType: voltha.Port_ETHERNET_UNI, state: "down"}},
786 }
787 for _, tt := range tests {
788 t.Run(tt.name, func(t *testing.T) {
Kent Hagermane6ff1012020-07-14 15:07:53 -0400789 _ = tt.devicehandler.addPort(context.Background(), tt.args.intfID, tt.args.portType, tt.args.state)
790 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530791 })
792 }
793}
794
795func Test_macAddressToUint32Array(t *testing.T) {
796 type args struct {
797 mac string
798 }
799 tests := []struct {
800 name string
801 args args
802 want []uint32
803 }{
804 // TODO: Add test cases.
805 {"macAddressToUint32Array-1", args{mac: "00:00:00:00:00:01"}, []uint32{0, 0, 0, 0, 0, 1}},
806 {"macAddressToUint32Array-2", args{mac: "0abcdef"}, []uint32{11259375}},
807 {"macAddressToUint32Array-3", args{mac: "testing"}, []uint32{1, 2, 3, 4, 5, 6}},
808 }
809 for _, tt := range tests {
810 t.Run(tt.name, func(t *testing.T) {
811 if got := macAddressToUint32Array(tt.args.mac); !reflect.DeepEqual(got, tt.want) {
812 t.Errorf("macAddressToUint32Array() = %v, want %v", got, tt.want)
813 }
814 })
815 }
816}
817
818func TestDeviceHandler_handleOltIndication(t *testing.T) {
819
820 type args struct {
821 oltIndication *oop.OltIndication
822 }
823 tests := []struct {
824 name string
825 args args
826 }{
827 {"handleOltIndication-1", args{oltIndication: &oop.OltIndication{OperState: "up"}}},
828 {"handleOltIndication-2", args{oltIndication: &oop.OltIndication{OperState: "down"}}},
829 }
830 for _, tt := range tests {
831 t.Run(tt.name, func(t *testing.T) {
832 dh := newMockDeviceHandler()
npujarec5762e2020-01-01 14:08:48 +0530833 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
834 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -0400835 if err := dh.handleOltIndication(ctx, tt.args.oltIndication); err != nil {
836 t.Error(err)
837 }
kdarapu891693b2019-09-16 12:33:49 +0530838 })
839 }
840}
841
842func TestDeviceHandler_AdoptDevice(t *testing.T) {
843 dh1 := newMockDeviceHandler()
844 dh2 := negativeDeviceHandler()
845 type args struct {
846 device *voltha.Device
847 }
848 tests := []struct {
849 name string
850 devicehandler *DeviceHandler
851 args args
852 }{
853 // TODO: Add test cases.
854 {"AdoptDevice-1", dh1, args{device: dh1.device}},
Naga Manjunath7615e552019-10-11 22:35:47 +0530855 {"AdoptDevice-2", dh2, args{device: dh2.device}},
kdarapu891693b2019-09-16 12:33:49 +0530856 }
857 for _, tt := range tests {
858 t.Run(tt.name, func(t *testing.T) {
859 //dh.doStateInit()
860 // context.
861 //dh.AdoptDevice(tt.args.device)
npujarec5762e2020-01-01 14:08:48 +0530862 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
863 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -0400864 if err := tt.devicehandler.postInit(ctx); err != nil {
865 t.Error(err)
866 }
kdarapu891693b2019-09-16 12:33:49 +0530867 })
868 }
869}
870
871func TestDeviceHandler_activateONU(t *testing.T) {
872 dh := newMockDeviceHandler()
873 dh1 := negativeDeviceHandler()
874 type args struct {
875 intfID uint32
876 onuID int64
877 serialNum *oop.SerialNumber
878 serialNumber string
879 }
880 tests := []struct {
881 name string
882 devicehandler *DeviceHandler
883 args args
884 }{
Girish Gowdra38d533d2020-03-30 20:38:51 -0700885 {"activateONU-1", dh, args{intfID: 0, onuID: 1, serialNum: &oop.SerialNumber{VendorId: []byte("onu1")}}},
886 {"activateONU-2", dh, args{intfID: 1, onuID: 2, serialNum: &oop.SerialNumber{VendorId: []byte("onu2")}}},
887 {"activateONU-3", dh1, args{intfID: 0, onuID: 1, serialNum: &oop.SerialNumber{VendorId: []byte("onu1")}}},
888 {"activateONU-4", dh1, args{intfID: 1, onuID: 2, serialNum: &oop.SerialNumber{VendorId: []byte("onu2")}}},
kdarapu891693b2019-09-16 12:33:49 +0530889 }
890 for _, tt := range tests {
891 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +0530892 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
893 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -0400894 _ = tt.devicehandler.activateONU(ctx, tt.args.intfID, tt.args.onuID, tt.args.serialNum, tt.args.serialNumber)
895 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +0530896 })
897 }
898}
899
900func TestDeviceHandler_start(t *testing.T) {
901 dh := newMockDeviceHandler()
902 dh1 := negativeDeviceHandler()
903 dh.start(context.Background())
904 dh.stop(context.Background())
905
906 dh1.start(context.Background())
907 dh1.stop(context.Background())
908
909}
910
911func TestDeviceHandler_PacketOut(t *testing.T) {
912 dh1 := newMockDeviceHandler()
913 dh2 := negativeDeviceHandler()
914 acts := []*ofp.OfpAction{
915 fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA))),
916 fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101)),
917 fu.Output(1),
918 }
919 pktout := &ofp.OfpPacketOut{BufferId: 0, InPort: 1, Actions: acts, Data: []byte("AYDCAAAOAODsSE5TiMwCBwQA4OxITlIEBQUwLzUxBgIAFAgEMC81MQoJbG9jYWxob3N0EBwFAawbqqACAAAAoRAxLjMuNi4xLjQuMS40NDEz/gYAgMILAgD+GQCAwgkDAAAAAGQAAAAAAAAAAgICAgICAgL+GQCAwgoDAAAAAGQAAAAAAAAAAgICAgICAgIAAA==")}
920 type args struct {
921 egressPortNo int
922 packet *of.OfpPacketOut
923 }
924 tests := []struct {
925 name string
926 devicehandler *DeviceHandler
927 args args
928 wantErr bool
929 }{
930 // TODO: Add test cases.
931 //{"test1", args{egressPortNo: 0, packet: &ofp.OfpPacketOut{}}, true},
932 {"PacketOut-1", dh1, args{egressPortNo: 0, packet: pktout}, false},
933 {"PacketOut-2", dh2, args{egressPortNo: 1, packet: pktout}, false},
Matteo Scandolo2c0d2742020-06-10 11:28:42 -0700934 {"PacketOut-3", dh2, args{egressPortNo: 4112, packet: pktout}, false},
935 {"PacketOut-4", dh1, args{egressPortNo: 1048577, packet: pktout}, false},
936 {"PacketOut-5", dh2, args{egressPortNo: 1048576, packet: pktout}, false},
kdarapu891693b2019-09-16 12:33:49 +0530937 }
938 for _, tt := range tests {
939 t.Run(tt.name, func(t *testing.T) {
940 dh := tt.devicehandler
npujarec5762e2020-01-01 14:08:48 +0530941 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
942 defer cancel()
943 if err := dh.PacketOut(ctx, tt.args.egressPortNo, tt.args.packet); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530944 t.Errorf("DeviceHandler.PacketOut() error = %v, wantErr %v", err, tt.wantErr)
945 }
946 })
947 }
948}
949
950//
951func TestDeviceHandler_doStateUp(t *testing.T) {
952 dh1 := newMockDeviceHandler()
953 dh2 := newMockDeviceHandler()
954
Thomas Lee S985938d2020-05-04 11:40:41 +0530955 dh2.device.Id = ""
kdarapu891693b2019-09-16 12:33:49 +0530956 dh3 := negativeDeviceHandler()
957
958 tests := []struct {
959 name string
960 devicehandler *DeviceHandler
961 wantErr bool
962 }{
963 {"dostateup-1", dh1, false},
964 {"dostateup-2", dh2, false},
965 {"dostateup-3", dh3, true},
966 }
967 for _, tt := range tests {
968 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +0530969 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
970 defer cancel()
971 if err := tt.devicehandler.doStateUp(ctx); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530972 t.Logf("DeviceHandler.doStateUp() error = %v, wantErr %v", err, tt.wantErr)
973 }
Thomas Lee S85f37312020-04-03 17:06:12 +0530974 tt.devicehandler.stopCollector <- true //stop the stat collector invoked from doStateUp
kdarapu891693b2019-09-16 12:33:49 +0530975 })
976 }
977}
978func TestDeviceHandler_doStateDown(t *testing.T) {
979 dh1 := newMockDeviceHandler()
980 dh2 := negativeDeviceHandler()
981 dh3 := newMockDeviceHandler()
982 dh3.device.OperStatus = voltha.OperStatus_UNKNOWN
983 tests := []struct {
984 name string
985 devicehandler *DeviceHandler
986 wantErr bool
987 }{
988 {"dostatedown-1", dh1, false},
989 {"dostatedown-2", dh2, true},
990 {"dostatedown-2", dh3, true},
991 }
992 for _, tt := range tests {
993 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +0530994 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
995 defer cancel()
996 if err := tt.devicehandler.doStateDown(ctx); (err != nil) != tt.wantErr {
kdarapu891693b2019-09-16 12:33:49 +0530997 t.Logf("DeviceHandler.doStateDown() error = %v", err)
Kent Hagermane6ff1012020-07-14 15:07:53 -0400998 //TODO: should fail this test case (Errorf) if result is not as expected
kdarapu891693b2019-09-16 12:33:49 +0530999 }
1000 })
1001 }
1002}
1003
1004func TestDeviceHandler_GetOfpDeviceInfo(t *testing.T) {
1005 dh1 := newMockDeviceHandler()
1006 dh2 := negativeDeviceHandler()
1007 type args struct {
1008 device *voltha.Device
1009 }
1010 tests := []struct {
1011 name string
1012 devicehandler *DeviceHandler
1013 args args
1014 wantErr bool
1015 }{
1016 // TODO: Add test cases.
1017 {"GetOfpDeviceInfo-1", dh1, args{dh1.device}, false},
1018 {"GetOfpDeviceInfo-2", dh1, args{&voltha.Device{}}, false},
1019 {"GetOfpDeviceInfo-3", dh2, args{dh1.device}, false},
1020 }
1021 for _, tt := range tests {
1022 t.Run(tt.name, func(t *testing.T) {
1023 dh := tt.devicehandler
1024 _, err := dh.GetOfpDeviceInfo(tt.args.device)
1025 if (err != nil) != tt.wantErr {
1026 t.Errorf("DeviceHandler.GetOfpDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
1027 return
1028 }
1029 })
1030 }
1031}
1032
kdarapu891693b2019-09-16 12:33:49 +05301033func TestDeviceHandler_onuDiscIndication(t *testing.T) {
1034
1035 dh1 := newMockDeviceHandler()
Naga Manjunatha8dc9372019-10-31 23:01:18 +05301036 dh1.discOnus = sync.Map{}
1037 dh1.discOnus.Store("onu1", true)
1038 dh1.discOnus.Store("onu2", false)
Thiyagarajan Subramani34a00282020-03-10 20:19:31 +05301039 dh1.discOnus.Store("onu3", true)
1040 dh1.discOnus.Store("onu4", true)
1041 dh1.onus = sync.Map{}
1042 dh1.onus.Store("onu3", NewOnuDevice("onu3", "onu3", "onu3", 3, 3, "onu3", true))
1043 dh1.onus.Store("onu4", NewOnuDevice("onu4", "onu4", "onu4", 4, 4, "onu4", true))
kdarapu891693b2019-09-16 12:33:49 +05301044 dh2 := negativeDeviceHandler()
1045 type args struct {
1046 onuDiscInd *oop.OnuDiscIndication
1047 sn string
1048 }
1049 tests := []struct {
1050 name string
1051 devicehandler *DeviceHandler
1052 args args
1053 }{
1054 // TODO: Add test cases.
1055 {"onuDiscIndication-1", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}},
1056 {"onuDiscIndication-2", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{}}}},
1057 {"onuDiscIndication-3", dh1, args{onuDiscInd: &oop.OnuDiscIndication{SerialNumber: &oop.SerialNumber{}}}},
1058 {"onuDiscIndication-4", dh1, args{onuDiscInd: &oop.OnuDiscIndication{}}},
1059 {"onuDiscIndication-5", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu1"}},
1060 {"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 +05301061 {"onuDiscIndication-7", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 3, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu3"}},
1062 {"onuDiscIndication-8", dh1, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 3, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}, sn: "onu4"}},
1063 {"onuDiscIndication-9", dh2, args{onuDiscInd: &oop.OnuDiscIndication{IntfId: 1, SerialNumber: &oop.SerialNumber{VendorId: []byte("TWSH"), VendorSpecific: []byte("1234")}}}},
kdarapu891693b2019-09-16 12:33:49 +05301064 }
1065 for _, tt := range tests {
1066 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301067 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1068 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001069 _ = tt.devicehandler.onuDiscIndication(ctx, tt.args.onuDiscInd, tt.args.sn)
1070 //TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301071 })
1072 }
1073}
1074
1075func TestDeviceHandler_populateDeviceInfo(t *testing.T) {
1076 dh1 := newMockDeviceHandler()
1077 dh2 := negativeDeviceHandler()
1078 tests := []struct {
1079 name string
1080 devicehandler *DeviceHandler
1081
1082 wantErr bool
1083 }{
1084 // TODO: Add test cases.
1085 {"populateDeviceInfo-1", dh1, false},
1086 {"populateDeviceInfo-2", dh1, true},
1087 {"populateDeviceInfo-3", dh1, true},
1088 {"populateDeviceInfo-4", dh1, true},
1089 {"populateDeviceInfo-5", dh2, true},
1090 }
1091 for _, tt := range tests {
1092 t.Run(tt.name, func(t *testing.T) {
1093
Neha Sharma96b7bf22020-06-15 10:37:32 +00001094 _, err := tt.devicehandler.populateDeviceInfo(context.Background())
kdarapu891693b2019-09-16 12:33:49 +05301095 if (err != nil) != tt.wantErr {
1096 t.Errorf("DeviceHandler.populateDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
1097 return
1098 }
1099
1100 })
1101 }
1102}
1103
1104func TestDeviceHandler_readIndications(t *testing.T) {
1105 dh1 := newMockDeviceHandler()
1106 dh2 := newMockDeviceHandler()
kdarapu891693b2019-09-16 12:33:49 +05301107 dh3 := newMockDeviceHandler()
1108 dh3.device.AdminState = voltha.AdminState_DISABLED
1109 dh4 := negativeDeviceHandler()
1110 tests := []struct {
1111 name string
1112 devicehandler *DeviceHandler
1113 }{
1114 // TODO: Add test cases.
1115 {"readIndications-1", dh1},
1116 {"readIndications-2", dh2},
1117 {"readIndications-3", dh2},
1118 {"readIndications-4", dh2},
1119 {"readIndications-5", dh2},
1120 {"readIndications-6", dh3},
1121 {"readIndications-7", dh3},
1122 {"readIndications-8", dh4},
1123 }
1124 for _, tt := range tests {
1125 t.Run(tt.name, func(t *testing.T) {
npujarec5762e2020-01-01 14:08:48 +05301126 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1127 defer cancel()
Kent Hagermane6ff1012020-07-14 15:07:53 -04001128 _ = tt.devicehandler.readIndications(ctx)
1129 // TODO: actually verify test cases
kdarapu891693b2019-09-16 12:33:49 +05301130 })
1131 }
1132}
Naga Manjunath7615e552019-10-11 22:35:47 +05301133
1134func Test_startCollector(t *testing.T) {
1135 type args struct {
1136 dh *DeviceHandler
1137 }
1138 dh := newMockDeviceHandler()
Kent Hagermanf1db18b2020-07-08 13:38:15 -04001139 dh.coreProxy.(*mocks.MockCoreProxy).DevicePorts[dh.device.Id] = []*voltha.Port{
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301140 {PortNo: 1, Label: "pon", Type: voltha.Port_PON_OLT},
1141 {PortNo: 1048577, Label: "nni", Type: voltha.Port_ETHERNET_NNI},
1142 {PortNo: 1048578, Label: "nni", Type: voltha.Port_ETHERNET_NNI},
1143 }
Naga Manjunath7615e552019-10-11 22:35:47 +05301144 dh.portStats.NorthBoundPort = make(map[uint32]*NniPort)
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301145 dh.portStats.NorthBoundPort[1] = &NniPort{Name: "OLT-1"}
1146 dh.portStats.NorthBoundPort[2] = &NniPort{Name: "OLT-1"}
Naga Manjunath7615e552019-10-11 22:35:47 +05301147 dh.portStats.SouthBoundPort = make(map[uint32]*PonPort)
1148 dh.portStats.Device = dh
1149 for i := 0; i < 16; i++ {
1150 dh.portStats.SouthBoundPort[uint32(i)] = &PonPort{DeviceID: "OLT-1"}
1151 }
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301152 dh1 := newMockDeviceHandler()
Kent Hagermanf1db18b2020-07-08 13:38:15 -04001153 dh1.coreProxy.(*mocks.MockCoreProxy).DevicePorts[dh.device.Id] = []*voltha.Port{}
Naga Manjunath7615e552019-10-11 22:35:47 +05301154 tests := []struct {
1155 name string
1156 args args
1157 }{
1158 // TODO: Add test cases.
1159 {"StartCollector-1", args{dh}},
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301160 {"StartCollector-2", args{dh1}},
Naga Manjunath7615e552019-10-11 22:35:47 +05301161 }
1162 for _, tt := range tests {
1163 t.Run(tt.name, func(t *testing.T) {
1164 go func() {
Kishore Darapuaaf9c102020-05-04 13:06:57 +05301165 time.Sleep(1 * time.Second) // simulated wait time to stop startCollector
Naga Manjunath7615e552019-10-11 22:35:47 +05301166 tt.args.dh.stopCollector <- true
1167 }()
Neha Sharma96b7bf22020-06-15 10:37:32 +00001168 startCollector(context.Background(), tt.args.dh)
Naga Manjunath7615e552019-10-11 22:35:47 +05301169 })
1170 }
1171}