blob: 9a9d2e763ba7ec2834f312a88d8249fd069b2112 [file] [log] [blame]
Chip Boling6e27b352020-02-14 09:10:01 -06001/*
2 * Copyright (c) 2018 - present. Boling Consulting Solutions (bcsw.net)
Andrea Campanella7167ebb2020-02-24 09:56:38 +01003 * Copyright 2020-present Open Networking Foundation
4
Chip Boling6e27b352020-02-14 09:10:01 -06005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Andrea Campanella7167ebb2020-02-24 09:56:38 +01008
Chip Boling6e27b352020-02-14 09:10:01 -06009 * http://www.apache.org/licenses/LICENSE-2.0
Andrea Campanella7167ebb2020-02-24 09:56:38 +010010
Chip Boling6e27b352020-02-14 09:10:01 -060011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Chip Boling6e27b352020-02-14 09:10:01 -060016 */
17package omci_test
18
19import (
20 "encoding/base64"
Chip Boling157c9b92021-04-21 09:58:36 -050021 "encoding/binary"
Chip Boling6e27b352020-02-14 09:10:01 -060022 "fmt"
Chip Boling34ebcb62021-02-02 12:13:58 -060023 "github.com/google/gopacket"
Andrea Campanella7167ebb2020-02-24 09:56:38 +010024 . "github.com/opencord/omci-lib-go"
25 me "github.com/opencord/omci-lib-go/generated"
Chip Boling6e27b352020-02-14 09:10:01 -060026 "github.com/stretchr/testify/assert"
27 "strings"
28 "testing"
29)
30
31var allMsgTypes = [...]me.MsgType{
32 me.Create,
33 me.Delete,
34 me.Set,
35 me.Get,
36 me.GetAllAlarms,
37 me.GetAllAlarmsNext,
38 me.MibUpload,
39 me.MibUploadNext,
40 me.MibReset,
41 me.AlarmNotification,
42 me.AttributeValueChange,
43 me.Test,
44 me.StartSoftwareDownload,
45 me.DownloadSection,
46 me.EndSoftwareDownload,
47 me.ActivateSoftware,
48 me.CommitSoftware,
49 me.SynchronizeTime,
50 me.Reboot,
51 me.GetNext,
52 me.TestResult,
53 me.GetCurrentData,
54 me.SetTable}
55
56var allMessageTypes = [...]MessageType{
57 CreateRequestType,
58 CreateResponseType,
59 DeleteRequestType,
60 DeleteResponseType,
61 SetRequestType,
62 SetResponseType,
63 GetRequestType,
64 GetResponseType,
65 GetAllAlarmsRequestType,
66 GetAllAlarmsResponseType,
67 GetAllAlarmsNextRequestType,
68 GetAllAlarmsNextResponseType,
69 MibUploadRequestType,
70 MibUploadResponseType,
71 MibUploadNextRequestType,
72 MibUploadNextResponseType,
73 MibResetRequestType,
74 MibResetResponseType,
75 TestRequestType,
76 TestResponseType,
77 StartSoftwareDownloadRequestType,
78 StartSoftwareDownloadResponseType,
79 DownloadSectionRequestType,
80 DownloadSectionResponseType,
81 EndSoftwareDownloadRequestType,
82 EndSoftwareDownloadResponseType,
83 ActivateSoftwareRequestType,
84 ActivateSoftwareResponseType,
85 CommitSoftwareRequestType,
86 CommitSoftwareResponseType,
87 SynchronizeTimeRequestType,
88 SynchronizeTimeResponseType,
89 RebootRequestType,
90 RebootResponseType,
91 GetNextRequestType,
92 GetNextResponseType,
93 GetCurrentDataRequestType,
94 GetCurrentDataResponseType,
95 SetTableRequestType,
96 SetTableResponseType,
97 // Autonomous ONU messages
98 AlarmNotificationType,
99 AttributeValueChangeType,
100 TestResultType,
101}
102
Chip Boling157c9b92021-04-21 09:58:36 -0500103var allExtendedMessageTypes = [...]MessageType{
104 GetRequestType,
105 GetResponseType,
106}
107
Chip Boling6e27b352020-02-14 09:10:01 -0600108var allResults = [...]me.Results{
109 me.Success,
110 me.ProcessingError,
111 me.NotSupported,
112 me.ParameterError,
113 me.UnknownEntity,
114 me.UnknownInstance,
115 me.DeviceBusy,
116 me.InstanceExists}
117
118// TestMsgTypeStrings tests that base message types can be printed
119func TestMsgTypeStrings(t *testing.T) {
120 for _, msg := range allMsgTypes {
121 strMsg := msg.String()
122 assert.NotEqual(t, len(strMsg), 0)
123 }
124 unknown := me.MsgType(0xFF)
125 strMsg := unknown.String()
126 assert.NotEqual(t, len(strMsg), 0)
127}
128
129// TestMessageTypeStrings tests that request/response/notification
130// message types can be printed
131func TestMessageTypeStrings(t *testing.T) {
132 for _, msg := range allMessageTypes {
133 strMsg := msg.String()
134 assert.NotEqual(t, len(strMsg), 0)
135 }
136 unknown := MessageType(0xFF)
137 strMsg := unknown.String()
138 assert.NotEqual(t, len(strMsg), 0)
139}
140
141func TestResultsStrings(t *testing.T) {
142 for _, code := range allResults {
143 strMsg := code.String()
144 assert.NotEqual(t, len(strMsg), 0)
145 }
146}
147
148// TestOmciDecode will test for proper error checking of things that
149// are invalid at the OMCI decode layer
150func TestOmciDecode(t *testing.T) {
151 // TID = 0 on autonomous ONU notifications only. Get packet back but ErrorLayer()
152 // returns non-nil
153 tidZeroOnNonNotification := "0000440A010C01000400800003010000" +
154 "00000000000000000000000000000000" +
155 "000000000000000000000028"
156
157 data, err := stringToPacket(tidZeroOnNonNotification)
158 assert.NoError(t, err)
159 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
160 assert.NotNil(t, packet)
161 assert.NotNil(t, packet.ErrorLayer())
162
163 // Only Baseline and Extended Message types allowed
164 invalidMessageType := "000C440F010C01000400800003010000" +
165 "00000000000000000000000000000000" +
166 "000000000000000000000028"
167
168 data, err = stringToPacket(invalidMessageType)
169 assert.NoError(t, err)
170 packet = gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
171 assert.NotNil(t, packet)
172 assert.NotNil(t, packet.ErrorLayer())
173
174 // Bad baseline message length
175 badBaselineMsgLength := "000C440A010C01000400800003010000" +
176 "00000000000000000000000000000000" +
177 "000000000000000000000029"
178
179 data, err = stringToPacket(badBaselineMsgLength)
180 assert.NoError(t, err)
181 packet = gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
182 assert.NotNil(t, packet)
183 assert.NotNil(t, packet.ErrorLayer())
184
185 // Bad extended message length
186 badExtendedMsgLength := "000C440B010C010000290400800003010000" +
187 "00000000000000000000000000000000" +
188 "00000000000000000000"
189
190 data, err = stringToPacket(badExtendedMsgLength)
191 assert.NoError(t, err)
192 packet = gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
193 assert.NotNil(t, packet)
194 assert.NotNil(t, packet.ErrorLayer())
195
196 // Huge extended message length
197 hugeExtendedMsgLength := "000C440B010C010007BD0400800003010000" +
198 "00000000000000000000000000000000" +
199 "00000000000000000000"
200
201 data, err = stringToPacket(hugeExtendedMsgLength)
202 assert.NoError(t, err)
203 packet = gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
204 assert.NotNil(t, packet)
205 assert.NotNil(t, packet.ErrorLayer())
206}
207
208// TestOmciSerialization will test for proper error checking of things that
209// are invalid at the OMCI layer
210func TestOmciSerialization(t *testing.T) {
211 goodMessage := "000C440A010C0100040080000301000000000000000000000000000000000000000000000000000000000028"
212
213 omciLayerDefaults := &OMCI{
214 TransactionID: 0x0c,
215 MessageType: CreateRequestType,
216 // DeviceIdentifier: BaselineIdent, // Optional, defaults to Baseline
217 // Length: 0x28, // Optional, defaults to 40 octets
218 }
219 omciLayerFixed := &OMCI{
220 TransactionID: 0x0c,
221 MessageType: CreateRequestType,
222 DeviceIdentifier: BaselineIdent,
223 Length: 0x28,
224 }
225 request := &CreateRequest{
226 MeBasePacket: MeBasePacket{
227 EntityClass: me.GemPortNetworkCtpClassID,
228 EntityInstance: uint16(0x100),
229 },
230 Attributes: me.AttributeValueMap{
231 "PortId": 0x400,
232 "TContPointer": 0x8000,
233 "Direction": 3,
234 "TrafficManagementPointerForUpstream": 0x100,
235 "TrafficDescriptorProfilePointerForUpstream": 0,
236 "PriorityQueuePointerForDownStream": 0,
237 "TrafficDescriptorProfilePointerForDownstream": 0,
238 "EncryptionKeyRing": 0,
239 },
240 }
241 // Test serialization back to former string (using defaults in the message parts)
242 var options gopacket.SerializeOptions
243 options.FixLengths = true
244
245 buffer := gopacket.NewSerializeBuffer()
246 err := gopacket.SerializeLayers(buffer, options, omciLayerDefaults, request)
247 assert.NoError(t, err)
248
249 outgoingPacket := buffer.Bytes()
250 reconstituted := packetToString(outgoingPacket)
251 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
252
253 // Test serialization back to former string (using explicit values in the message parts)
254 buffer = gopacket.NewSerializeBuffer()
255 err = gopacket.SerializeLayers(buffer, options, omciLayerFixed, request)
256 assert.NoError(t, err)
257
258 outgoingPacket = buffer.Bytes()
259 reconstituted = packetToString(outgoingPacket)
260 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
261}
262
263func TestCreateRequestDecode(t *testing.T) {
264 goodMessage := "000C440A010C01000400800003010000" +
265 "00000000000000000000000000000000" +
266 "000000000000000000000028"
267 data, err := stringToPacket(goodMessage)
268 assert.NoError(t, err)
269
270 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
271 assert.NotNil(t, packet)
272
273 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500274 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600275
276 omciMsg, ok := omciLayer.(*OMCI)
277 assert.True(t, ok)
278 assert.Equal(t, omciMsg.TransactionID, uint16(0xc))
279 assert.Equal(t, omciMsg.MessageType, CreateRequestType)
280 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
281 assert.Equal(t, omciMsg.Length, uint16(40))
282
283 msgLayer := packet.Layer(LayerTypeCreateRequest)
284 assert.NotNil(t, msgLayer)
285
286 request, ok2 := msgLayer.(*CreateRequest)
287 assert.True(t, ok2)
288 assert.Equal(t, request.EntityClass, me.GemPortNetworkCtpClassID)
289 assert.Equal(t, request.EntityInstance, uint16(0x100))
290
291 attributes := request.Attributes
292 assert.NotNil(t, attributes)
293
294 // As this is a create request, gather up all set-by-create attributes
295 // make sure we got them all, and nothing else
296 meDefinition, omciErr := me.LoadManagedEntityDefinition(request.EntityClass)
297 assert.NotNil(t, omciErr)
298 assert.Equal(t, omciErr.StatusCode(), me.Success)
299
300 attrDefs := meDefinition.GetAttributeDefinitions()
301
302 sbcMask := getSbcMask(meDefinition)
303 for index := uint(1); index < uint(len(attrDefs)); index++ {
304 attrName := attrDefs[index].GetName()
305
306 if sbcMask&uint16(1<<(uint)(16-index)) != 0 {
307 _, ok3 := attributes[attrName]
308 assert.True(t, ok3)
309 } else {
310 _, ok3 := attributes[attrName]
311 assert.False(t, ok3)
312 }
313 //fmt.Printf("Name: %v, Value: %v\n", attrName, attributes[attrName])
314 }
315 // Test serialization back to former string
316 var options gopacket.SerializeOptions
317 options.FixLengths = true
318
319 buffer := gopacket.NewSerializeBuffer()
320 err = gopacket.SerializeLayers(buffer, options, omciMsg, request)
321 assert.NoError(t, err)
322
323 outgoingPacket := buffer.Bytes()
324 reconstituted := packetToString(outgoingPacket)
325 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
326
327 // Verify string output for message
328 packetString := packet.String()
329 assert.NotZero(t, len(packetString))
330}
331
332func TestCreateRequestSerialize(t *testing.T) {
333 goodMessage := "000C440A010C0100040080000301000000000000000000000000000000000000000000000000000000000028"
334
335 omciLayer := &OMCI{
336 TransactionID: 0x0c,
337 MessageType: CreateRequestType,
338 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
339 // Length: 0x28, // Optional, defaults to 40 octets
340 }
341 request := &CreateRequest{
342 MeBasePacket: MeBasePacket{
343 EntityClass: me.GemPortNetworkCtpClassID,
344 EntityInstance: uint16(0x100),
345 },
346 Attributes: me.AttributeValueMap{
347 "PortId": 0x400,
348 "TContPointer": 0x8000,
349 "Direction": 3,
350 "TrafficManagementPointerForUpstream": 0x100,
351 "TrafficDescriptorProfilePointerForUpstream": 0,
352 "PriorityQueuePointerForDownStream": 0,
353 "TrafficDescriptorProfilePointerForDownstream": 0,
354 "EncryptionKeyRing": 0,
355 },
356 }
357 // Test serialization back to former string
358 var options gopacket.SerializeOptions
359 options.FixLengths = true
360
361 buffer := gopacket.NewSerializeBuffer()
362 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
363 assert.NoError(t, err)
364
365 outgoingPacket := buffer.Bytes()
366 reconstituted := packetToString(outgoingPacket)
367 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
368}
369
370func TestCreateResponseDecode(t *testing.T) {
371 goodMessage := "0157240a01100001000000000000000000000000000000000000000000000000000000000000000000000028a9ccbeb9"
372 data, err := stringToPacket(goodMessage)
373 assert.NoError(t, err)
374
375 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
376 assert.NotNil(t, packet)
377
378 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500379 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600380
381 omciMsg, ok := omciLayer.(*OMCI)
382 assert.True(t, ok)
383 assert.Equal(t, omciMsg.TransactionID, uint16(0x0157))
384 assert.Equal(t, omciMsg.MessageType, CreateResponseType)
385 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
386 assert.Equal(t, omciMsg.Length, uint16(40))
387
388 msgLayer := packet.Layer(LayerTypeCreateResponse)
389 assert.NotNil(t, msgLayer)
390
391 response, ok2 := msgLayer.(*CreateResponse)
392 assert.True(t, ok2)
393 assert.NotNil(t, response)
394
395 // Verify string output for message
396 packetString := packet.String()
397 assert.NotZero(t, len(packetString))
398}
399
400func TestCreateResponseSerialize(t *testing.T) {
401 goodMessage := "0157240a01100001000000000000000000000000000000000000000000000000000000000000000000000028"
402
403 omciLayer := &OMCI{
404 TransactionID: 0x0157,
405 MessageType: CreateResponseType,
406 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
407 // Length: 0x28, // Optional, defaults to 40 octets
408 }
409 request := &CreateResponse{
410 MeBasePacket: MeBasePacket{
411 EntityClass: me.GalEthernetProfileClassID,
412 EntityInstance: uint16(1),
413 },
414 Result: me.Success,
415 AttributeExecutionMask: uint16(0),
416 }
417 // Test serialization back to former string
418 var options gopacket.SerializeOptions
419 options.FixLengths = true
420
421 buffer := gopacket.NewSerializeBuffer()
422 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
423 assert.NoError(t, err)
424
425 outgoingPacket := buffer.Bytes()
426 reconstituted := packetToString(outgoingPacket)
427 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
428}
429
430func TestDeleteRequestDecode(t *testing.T) {
431 goodMessage := "0211460a00ab0202000000000000000000000000000000000000000000000000000000000000000000000028"
432 data, err := stringToPacket(goodMessage)
433 assert.NoError(t, err)
434
435 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
436 assert.NotNil(t, packet)
437
438 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500439 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600440
441 omciMsg, ok := omciLayer.(*OMCI)
442 assert.True(t, ok)
443 assert.Equal(t, omciMsg.TransactionID, uint16(0x0211))
444 assert.Equal(t, omciMsg.MessageType, DeleteRequestType)
445 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
446 assert.Equal(t, omciMsg.Length, uint16(40))
447
448 msgLayer := packet.Layer(LayerTypeDeleteRequest)
449
450 assert.NotNil(t, msgLayer)
451
452 request, ok2 := msgLayer.(*DeleteRequest)
453 assert.True(t, ok2)
454 assert.NotNil(t, request)
455
456 // Verify string output for message
457 packetString := packet.String()
458 assert.NotZero(t, len(packetString))
459}
460
461func TestDeleteRequestSerialize(t *testing.T) {
462 goodMessage := "0211460a00ab0202000000000000000000000000000000000000000000000000000000000000000000000028"
463
464 omciLayer := &OMCI{
465 TransactionID: 0x0211,
466 MessageType: DeleteRequestType,
467 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
468 // Length: 0x28, // Optional, defaults to 40 octets
469 }
470 request := &DeleteRequest{
471 MeBasePacket: MeBasePacket{
472 EntityClass: me.ExtendedVlanTaggingOperationConfigurationDataClassID,
473 EntityInstance: uint16(0x202),
474 },
475 }
476 // Test serialization back to former string
477 var options gopacket.SerializeOptions
478 options.FixLengths = true
479
480 buffer := gopacket.NewSerializeBuffer()
481 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
482 assert.NoError(t, err)
483
484 outgoingPacket := buffer.Bytes()
485 reconstituted := packetToString(outgoingPacket)
486 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
487}
488
489func TestDeleteResponseDecode(t *testing.T) {
490 goodMessage := "0211260a00ab0202000000000000000000000000000000000000000000000000000000000000000000000028013437fb"
491 data, err := stringToPacket(goodMessage)
492 assert.NoError(t, err)
493
494 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
495 assert.NotNil(t, packet)
496
497 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500498 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600499
500 omciMsg, ok := omciLayer.(*OMCI)
501 assert.True(t, ok)
502 assert.Equal(t, omciMsg.TransactionID, uint16(0x0211))
503 assert.Equal(t, omciMsg.MessageType, DeleteResponseType)
504 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
505 assert.Equal(t, omciMsg.Length, uint16(40))
506
507 msgLayer := packet.Layer(LayerTypeDeleteResponse)
508
509 assert.NotNil(t, msgLayer)
510
511 response, ok2 := msgLayer.(*DeleteResponse)
512 assert.True(t, ok2)
513 assert.NotNil(t, response)
514
515 // Verify string output for message
516 packetString := packet.String()
517 assert.NotZero(t, len(packetString))
518}
519
520func TestDeleteResponseSerialize(t *testing.T) {
521 goodMessage := "0211260a00ab0202000000000000000000000000000000000000000000000000000000000000000000000028"
522
523 omciLayer := &OMCI{
524 TransactionID: 0x0211,
525 MessageType: DeleteResponseType,
526 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
527 // Length: 0x28, // Optional, defaults to 40 octets
528 }
529 request := &DeleteResponse{
530 MeBasePacket: MeBasePacket{
531 EntityClass: me.ExtendedVlanTaggingOperationConfigurationDataClassID,
532 EntityInstance: uint16(0x202),
533 },
534 Result: me.Success,
535 }
536 // Test serialization back to former string
537 var options gopacket.SerializeOptions
538 options.FixLengths = true
539
540 buffer := gopacket.NewSerializeBuffer()
541 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
542 assert.NoError(t, err)
543
544 outgoingPacket := buffer.Bytes()
545 reconstituted := packetToString(outgoingPacket)
546 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
547}
548
549func TestSetRequestDecode(t *testing.T) {
550 goodMessage := "0107480a01000000020000000000000000000000000000000000000000000000000000000000000000000028"
551 data, err := stringToPacket(goodMessage)
552 assert.NoError(t, err)
553
554 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
555 assert.NotNil(t, packet)
556
557 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500558 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600559
560 omciMsg, ok := omciLayer.(*OMCI)
561 assert.True(t, ok)
562 assert.Equal(t, omciMsg.TransactionID, uint16(0x0107))
563 assert.Equal(t, omciMsg.MessageType, SetRequestType)
564 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
565 assert.Equal(t, omciMsg.Length, uint16(40))
566
567 msgLayer := packet.Layer(LayerTypeSetRequest)
568 assert.NotNil(t, msgLayer)
569
570 request, ok2 := msgLayer.(*SetRequest)
571 assert.True(t, ok2)
572 assert.NotNil(t, request)
573
574 // Verify string output for message
575 packetString := packet.String()
576 assert.NotZero(t, len(packetString))
577}
578
579func TestSetRequestSerialize(t *testing.T) {
580 goodMessage := "0107480a01000000020000000000000000000000000000000000000000000000000000000000000000000028"
581
582 omciLayer := &OMCI{
583 TransactionID: 0x0107,
584 MessageType: SetRequestType,
585 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
586 // Length: 0x28, // Optional, defaults to 40 octets
587 }
588 request := &SetRequest{
589 MeBasePacket: MeBasePacket{
590 EntityClass: me.OnuGClassID,
591 EntityInstance: uint16(0),
592 },
593 AttributeMask: uint16(0x200),
594 Attributes: me.AttributeValueMap{"AdministrativeState": byte(0)},
595 }
596 // Test serialization back to former string
597 var options gopacket.SerializeOptions
598 options.FixLengths = true
599
600 buffer := gopacket.NewSerializeBuffer()
601 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
602 assert.NoError(t, err)
603
604 outgoingPacket := buffer.Bytes()
605 reconstituted := packetToString(outgoingPacket)
606 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
607}
608
609func TestSetResponseDecode(t *testing.T) {
610 goodMessage := "0107280a01000000000000000000000000000000000000000000000000000000000000000000000000000028"
611 data, err := stringToPacket(goodMessage)
612 assert.NoError(t, err)
613
614 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
615 assert.NotNil(t, packet)
616
617 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500618 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600619
620 omciMsg, ok := omciLayer.(*OMCI)
621 assert.True(t, ok)
622 assert.Equal(t, omciMsg.TransactionID, uint16(0x0107))
623 assert.Equal(t, omciMsg.MessageType, SetResponseType)
624 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
625 assert.Equal(t, omciMsg.Length, uint16(40))
626
627 msgLayer := packet.Layer(LayerTypeSetResponse)
628 assert.NotNil(t, msgLayer)
629
630 response, ok2 := msgLayer.(*SetResponse)
631 assert.True(t, ok2)
632 assert.NotNil(t, response)
633
634 // Verify string output for message
635 packetString := packet.String()
636 assert.NotZero(t, len(packetString))
637}
638
639func TestSetResponseSerialize(t *testing.T) {
640 goodMessage := "0107280a01000000000000000000000000000000000000000000000000000000000000000000000000000028"
641
642 omciLayer := &OMCI{
643 TransactionID: 0x0107,
644 MessageType: SetResponseType,
645 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
646 // Length: 0x28, // Optional, defaults to 40 octets
647 }
648 request := &SetResponse{
649 MeBasePacket: MeBasePacket{
650 EntityClass: me.OnuGClassID,
651 EntityInstance: uint16(0),
652 },
653 Result: me.Success,
654 }
655 // Test serialization back to former string
656 var options gopacket.SerializeOptions
657 options.FixLengths = true
658
659 buffer := gopacket.NewSerializeBuffer()
660 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
661 assert.NoError(t, err)
662
663 outgoingPacket := buffer.Bytes()
664 reconstituted := packetToString(outgoingPacket)
665 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
666
667}
668
669func TestSetResponseTableFailedAttributesDecode(t *testing.T) {
670 // This is a SET Response with failed and unsupported attributes
671 // TODO:Implement
672}
673
674func TestSetResponseTableFailedAttributesSerialize(t *testing.T) {
675 // This is a SET Response with failed and unsupported attributes
676 // TODO:Implement
677}
678
679func TestGetRequestDecode(t *testing.T) {
680 goodMessage := "035e490a01070000004400000000000000000000000000000000000000000000000000000000000000000028"
681 data, err := stringToPacket(goodMessage)
682 assert.NoError(t, err)
683
684 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
685 assert.NotNil(t, packet)
686
687 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500688 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600689
690 omciMsg, ok := omciLayer.(*OMCI)
691 assert.True(t, ok)
692 assert.Equal(t, omciMsg.TransactionID, uint16(0x035e))
693 assert.Equal(t, omciMsg.MessageType, GetRequestType)
694 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
695 assert.Equal(t, omciMsg.Length, uint16(40))
696
697 msgLayer := packet.Layer(LayerTypeGetRequest)
698 assert.NotNil(t, msgLayer)
699
700 request, ok2 := msgLayer.(*GetRequest)
701 assert.True(t, ok2)
702 assert.NotNil(t, request)
703
704 // Verify string output for message
705 packetString := packet.String()
706 assert.NotZero(t, len(packetString))
707}
708
709func TestGetRequestSerialize(t *testing.T) {
710 goodMessage := "035e490a01070000004400000000000000000000000000000000000000000000000000000000000000000028"
711
712 omciLayer := &OMCI{
713 TransactionID: 0x035e,
714 MessageType: GetRequestType,
715 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
716 // Length: 0x28, // Optional, defaults to 40 octets
717 }
718 request := &GetRequest{
719 MeBasePacket: MeBasePacket{
720 EntityClass: me.AniGClassID,
721 EntityInstance: uint16(0),
722 },
723 AttributeMask: uint16(0x0044),
724 }
725 // Test serialization back to former string
726 var options gopacket.SerializeOptions
727 options.FixLengths = true
728
729 buffer := gopacket.NewSerializeBuffer()
730 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
731 assert.NoError(t, err)
732
733 outgoingPacket := buffer.Bytes()
734 reconstituted := packetToString(outgoingPacket)
735 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
736}
737
738func TestGetResponseDecode(t *testing.T) {
739 goodMessage := "035e290a01070000000044dbcb05f10000000000000000000000000000000000000000000000000000000028"
740 data, err := stringToPacket(goodMessage)
741 assert.NoError(t, err)
742
743 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
744 assert.NotNil(t, packet)
745
746 omciLayer := packet.Layer(LayerTypeOMCI)
747 assert.NotNil(t, omciLayer)
748
749 omciMsg, ok := omciLayer.(*OMCI)
750 assert.True(t, ok)
751 assert.Equal(t, omciMsg.TransactionID, uint16(0x035e))
752 assert.Equal(t, omciMsg.MessageType, GetResponseType)
753 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
754 assert.Equal(t, omciMsg.Length, uint16(40))
755
756 msgLayer := packet.Layer(LayerTypeGetResponse)
757 assert.NotNil(t, msgLayer)
758
759 response, ok2 := msgLayer.(*GetResponse)
760 assert.True(t, ok2)
761 assert.NotNil(t, response)
762 assert.Equal(t, response.Result, me.Success)
763 assert.Equal(t, response.AttributeMask, uint16(0x0044))
764 assert.Equal(t, response.Attributes["TransmitOpticalLevel"], uint16(0x05f1))
765 assert.Equal(t, response.Attributes["OpticalSignalLevel"], uint16(0xdbcb))
766
767 // Verify string output for message
768 packetString := packet.String()
769 assert.NotZero(t, len(packetString))
770}
771
772func TestGetResponseSerialize(t *testing.T) {
773 goodMessage := "035e290a01070000000044dbcb05f10000000000000000000000000000000000000000000000000000000028"
774
775 omciLayer := &OMCI{
776 TransactionID: 0x035e,
777 MessageType: GetResponseType,
778 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
779 // Length: 0x28, // Optional, defaults to 40 octets
780 }
781 request := &GetResponse{
782 MeBasePacket: MeBasePacket{
783 EntityClass: me.AniGClassID,
784 EntityInstance: uint16(0),
785 },
786 Result: 0,
787 AttributeMask: uint16(0x0044),
788 Attributes: me.AttributeValueMap{
789 "TransmitOpticalLevel": uint16(0x05f1),
790 "OpticalSignalLevel": uint16(0xdbcb)},
791 }
792 // Test serialization back to former string
793 var options gopacket.SerializeOptions
794 options.FixLengths = true
795
796 buffer := gopacket.NewSerializeBuffer()
797 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
798 assert.NoError(t, err)
799
800 outgoingPacket := buffer.Bytes()
801 reconstituted := packetToString(outgoingPacket)
802 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
803}
804
805///////////////////////////////////////////////////////////////////////
806// Packet definitions for attributes of various types/sizes
807func toOctets(str string) []byte {
808 data, err := base64.StdEncoding.DecodeString(str)
809 if err != nil {
810 panic(fmt.Sprintf("Invalid Base-64 string: '%v'", str))
811 }
812 return data
813}
814
815func TestGetResponseSerializeTruncationFailure(t *testing.T) {
816 // Too much data and 'fix-length' is not specified. This response has 26
817 // octets in the requested data, but only 25 octets available
818
819 omciLayer := &OMCI{
820 TransactionID: 0x035e,
821 MessageType: GetResponseType,
822 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
823 // Length: 0x28, // Optional, defaults to 40 octets
824 }
825 request := &GetResponse{
826 MeBasePacket: MeBasePacket{
827 EntityClass: me.OnuGClassID,
828 EntityInstance: uint16(0),
829 },
830 Result: 0,
831 AttributeMask: uint16(0xE000),
832 Attributes: me.AttributeValueMap{
833 "VendorId": toOctets("ICAgIA=="),
834 "Version": toOctets("MAAAAAAAAAAAAAAAAAA="),
835 "SerialNumber": toOctets("AAAAAAAAAAA="),
836 },
837 }
838 // Test serialization and verify truncation failure
839 var options gopacket.SerializeOptions
840 options.FixLengths = false
841
842 buffer := gopacket.NewSerializeBuffer()
843 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
844 assert.Error(t, err)
845 assert.IsType(t, &me.MessageTruncatedError{}, err)
846}
847
848func TestGetResponseSerializeTruncationButOkay(t *testing.T) {
849 // Too much data and 'fix-length' is specified so it packs as much as
850 // possible and adjusts the failure masks
851
852 omciLayer := &OMCI{
853 TransactionID: 0x035e,
854 MessageType: GetResponseType,
855 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
856 // Length: 0x28, // Optional, defaults to 40 octets
857 }
858 response := &GetResponse{
859 MeBasePacket: MeBasePacket{
860 EntityClass: me.OnuGClassID,
861 EntityInstance: uint16(0),
862 },
863 Result: 0,
864 AttributeMask: uint16(0xE000),
865 Attributes: me.AttributeValueMap{
866 "VendorId": toOctets("ICAgIA=="),
867 "Version": toOctets("MAAAAAAAAAAAAAAAAAA="),
868 "SerialNumber": toOctets("AAAAAAAAAAA="),
869 },
870 }
871 // Test serialization and verify truncation failure
872 var options gopacket.SerializeOptions
873 options.FixLengths = true
874
875 buffer := gopacket.NewSerializeBuffer()
876 err := gopacket.SerializeLayers(buffer, options, omciLayer, response)
877 assert.NoError(t, err)
878
879 // Now deserialize it and see if we have the proper result (Attribute Failure)
880 // and a non-zero failed mask
881 responsePacket := buffer.Bytes()
882 packet := gopacket.NewPacket(responsePacket, LayerTypeOMCI, gopacket.NoCopy)
883 assert.NotNil(t, packet)
884
885 omciLayer2 := packet.Layer(LayerTypeOMCI)
886 assert.NotNil(t, omciLayer2)
887
888 omciMsg2, ok := omciLayer2.(*OMCI)
889 assert.True(t, ok)
890 assert.Equal(t, omciLayer.TransactionID, omciMsg2.TransactionID)
891 assert.Equal(t, omciLayer.MessageType, GetResponseType)
892 assert.Equal(t, omciLayer.DeviceIdentifier, BaselineIdent)
893 assert.Equal(t, omciLayer.Length, uint16(40))
894
895 msgLayer2 := packet.Layer(LayerTypeGetResponse)
896 assert.NotNil(t, msgLayer2)
897
898 response2, ok2 := msgLayer2.(*GetResponse)
899 assert.True(t, ok2)
900 assert.Equal(t, me.AttributeFailure, response2.Result)
901 assert.NotZero(t, response2.AttributeMask)
902 assert.NotZero(t, response2.FailedAttributeMask)
903 assert.Zero(t, response2.UnsupportedAttributeMask)
904}
905
906func TestGetResponseTableFailedAttributesDecode(t *testing.T) {
907 // This is a GET Response with failed and unsupported attributes
908 // TODO:Implement
909}
910
911func TestGetResponseTableFailedAttributesSerialize(t *testing.T) {
912 // This is a GET Response with failed and unsupported attributes
913 // TODO:Implement
914}
915
916func TestGetResponseTableAttributeDecode(t *testing.T) {
917 // This is a GET Response for a table attribute. It should return the attribute
918 // size as a uint16.
919 // TODO:Implement
920}
921
922func TestGetResponseTableAttributeSerialize(t *testing.T) {
923 // This is a GET Response for a table attribute. It should return the attribute
924 // size as a uint16.
925 // TODO:Implement
926}
927
928func TestGetAllAlarmsRequestDecode(t *testing.T) {
929 goodMessage := "04454b0a00020000000000000000000000000000000000000000000000000000000000000000000000000028"
930 data, err := stringToPacket(goodMessage)
931 assert.NoError(t, err)
932
933 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
934 assert.NotNil(t, packet)
935
936 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500937 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600938
939 omciMsg, ok := omciLayer.(*OMCI)
940 assert.True(t, ok)
941 assert.Equal(t, omciMsg.TransactionID, uint16(0x0445))
942 assert.Equal(t, omciMsg.MessageType, GetAllAlarmsRequestType)
943 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
944 assert.Equal(t, omciMsg.Length, uint16(40))
945
946 msgLayer := packet.Layer(LayerTypeGetAllAlarmsRequest)
947 assert.NotNil(t, msgLayer)
948
949 request, ok2 := msgLayer.(*GetAllAlarmsRequest)
950 assert.True(t, ok2)
951 assert.NotNil(t, request)
952 assert.Equal(t, request.AlarmRetrievalMode, byte(0))
953
954 // Verify string output for message
955 packetString := packet.String()
956 assert.NotZero(t, len(packetString))
957}
958
959func TestGetAllAlarmsRequestSerialize(t *testing.T) {
960 goodMessage := "04454b0a00020000010000000000000000000000000000000000000000000000000000000000000000000028"
961
962 omciLayer := &OMCI{
963 TransactionID: 0x0445,
964 MessageType: GetAllAlarmsRequestType,
965 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
966 // Length: 0x28, // Optional, defaults to 40 octets
967 }
968 request := &GetAllAlarmsRequest{
969 MeBasePacket: MeBasePacket{
970 EntityClass: me.OnuDataClassID,
971 EntityInstance: uint16(0),
972 },
973 AlarmRetrievalMode: byte(1),
974 }
975 // Test serialization back to former string
976 var options gopacket.SerializeOptions
977 options.FixLengths = true
978
979 buffer := gopacket.NewSerializeBuffer()
980 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
981 assert.NoError(t, err)
982
983 outgoingPacket := buffer.Bytes()
984 reconstituted := packetToString(outgoingPacket)
985 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
986}
987
988func TestGetAllAlarmsResponseDecode(t *testing.T) {
989 goodMessage := "04452b0a00020000000300000000000000000000000000000000000000000000000000000000000000000028"
990 data, err := stringToPacket(goodMessage)
991 assert.NoError(t, err)
992
993 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
994 assert.NotNil(t, packet)
995
996 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -0500997 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -0600998
999 omciMsg, ok := omciLayer.(*OMCI)
1000 assert.True(t, ok)
1001 assert.Equal(t, omciMsg.TransactionID, uint16(0x0445))
1002 assert.Equal(t, omciMsg.MessageType, GetAllAlarmsResponseType)
1003 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1004 assert.Equal(t, omciMsg.Length, uint16(40))
1005
1006 msgLayer := packet.Layer(LayerTypeGetAllAlarmsResponse)
1007 assert.NotNil(t, msgLayer)
1008
1009 response, ok2 := msgLayer.(*GetAllAlarmsResponse)
1010 assert.True(t, ok2)
1011 assert.NotNil(t, response)
1012 assert.Equal(t, response.NumberOfCommands, uint16(3))
1013
1014 // Verify string output for message
1015 packetString := packet.String()
1016 assert.NotZero(t, len(packetString))
1017}
1018
1019func TestGetAllAlarmsResponseSerialize(t *testing.T) {
1020 goodMessage := "04452b0a00020000000300000000000000000000000000000000000000000000000000000000000000000028"
1021
1022 omciLayer := &OMCI{
1023 TransactionID: 0x0445,
1024 MessageType: GetAllAlarmsResponseType,
1025 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1026 // Length: 0x28, // Optional, defaults to 40 octets
1027 }
1028 request := &GetAllAlarmsResponse{
1029 MeBasePacket: MeBasePacket{
1030 EntityClass: me.OnuDataClassID,
1031 EntityInstance: uint16(0),
1032 },
1033 NumberOfCommands: uint16(3),
1034 }
1035 // Test serialization back to former string
1036 var options gopacket.SerializeOptions
1037 options.FixLengths = true
1038
1039 buffer := gopacket.NewSerializeBuffer()
1040 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1041 assert.NoError(t, err)
1042
1043 outgoingPacket := buffer.Bytes()
1044 reconstituted := packetToString(outgoingPacket)
1045 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1046}
1047
1048func TestGetAllAlarmsNextRequestDecode(t *testing.T) {
1049 goodMessage := "02344c0a00020000000000000000000000000000000000000000000000000000000000000000000000000028"
1050
1051 data, err := stringToPacket(goodMessage)
1052 assert.NoError(t, err)
1053
1054 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1055 assert.NotNil(t, packet)
1056
1057 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001058 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06001059
1060 omciMsg, ok := omciLayer.(*OMCI)
1061 assert.True(t, ok)
1062 assert.Equal(t, omciMsg.TransactionID, uint16(0x0234))
1063 assert.Equal(t, omciMsg.MessageType, GetAllAlarmsNextRequestType)
1064 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1065 assert.Equal(t, omciMsg.Length, uint16(40))
1066
1067 msgLayer := packet.Layer(LayerTypeGetAllAlarmsNextRequest)
1068 assert.NotNil(t, msgLayer)
1069
1070 request, ok2 := msgLayer.(*GetAllAlarmsNextRequest)
1071 assert.True(t, ok2)
1072 assert.NotNil(t, request)
1073
1074 // Verify string output for message
1075 packetString := packet.String()
1076 assert.NotZero(t, len(packetString))
1077}
1078
1079func TestGetAllAlarmsNextRequestSerialize(t *testing.T) {
1080 goodMessage := "02344c0a00020000000000000000000000000000000000000000000000000000000000000000000000000028"
1081
1082 omciLayer := &OMCI{
1083 TransactionID: 0x0234,
1084 MessageType: GetAllAlarmsNextRequestType,
1085 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1086 // Length: 0x28, // Optional, defaults to 40 octets
1087 }
1088 request := &GetAllAlarmsNextRequest{
1089 MeBasePacket: MeBasePacket{
1090 EntityClass: me.OnuDataClassID,
1091 EntityInstance: uint16(0),
1092 },
1093 CommandSequenceNumber: uint16(0),
1094 }
1095 // Test serialization back to former string
1096 var options gopacket.SerializeOptions
1097 options.FixLengths = true
1098
1099 buffer := gopacket.NewSerializeBuffer()
1100 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1101 assert.NoError(t, err)
1102
1103 outgoingPacket := buffer.Bytes()
1104 reconstituted := packetToString(outgoingPacket)
1105 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1106}
1107
1108func TestGetAllAlarmsNextResponseDecode(t *testing.T) {
1109 goodMessage := "02342c0a00020000000b01028000000000000000000000000000000000000000000000000000000000000028f040fc87"
1110 data, err := stringToPacket(goodMessage)
1111 assert.NoError(t, err)
1112
1113 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1114 assert.NotNil(t, packet)
1115
1116 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001117 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06001118
1119 omciMsg, ok := omciLayer.(*OMCI)
1120 assert.True(t, ok)
1121 assert.Equal(t, omciMsg.TransactionID, uint16(0x0234))
1122 assert.Equal(t, omciMsg.MessageType, GetAllAlarmsNextResponseType)
1123 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1124 assert.Equal(t, omciMsg.Length, uint16(40))
1125
1126 msgLayer := packet.Layer(LayerTypeGetAllAlarmsNextResponse)
1127 assert.NotNil(t, msgLayer)
1128
1129 response, ok2 := msgLayer.(*GetAllAlarmsNextResponse)
1130 assert.True(t, ok2)
1131 assert.NotNil(t, response)
1132
1133 var alarms [224 / 8]byte
1134 alarms[0] = 0x80
1135 assert.Equal(t, response.AlarmEntityClass, me.PhysicalPathTerminationPointEthernetUniClassID)
1136 assert.Equal(t, response.AlarmEntityInstance, uint16(0x102))
1137 assert.Equal(t, response.AlarmBitMap, alarms)
1138
1139 // Verify string output for message
1140 packetString := packet.String()
1141 assert.NotZero(t, len(packetString))
1142}
1143
1144func TestGetAllAlarmsNextResponseSerialize(t *testing.T) {
1145 goodMessage := "02342c0a00020000000b01028000000000000000000000000000000000000000000000000000000000000028"
1146
1147 omciLayer := &OMCI{
1148 TransactionID: 0x0234,
1149 MessageType: GetAllAlarmsNextResponseType,
1150 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1151 // Length: 0x28, // Optional, defaults to 40 octets
1152 }
1153 var alarms [224 / 8]byte
1154 alarms[0] = 0x80
1155
1156 request := &GetAllAlarmsNextResponse{
1157 MeBasePacket: MeBasePacket{
1158 EntityClass: me.OnuDataClassID,
1159 EntityInstance: uint16(0),
1160 },
1161 AlarmEntityClass: me.PhysicalPathTerminationPointEthernetUniClassID,
1162 AlarmEntityInstance: uint16(0x102),
1163 AlarmBitMap: alarms,
1164 }
1165 // Test serialization back to former string
1166 var options gopacket.SerializeOptions
1167 options.FixLengths = true
1168
1169 buffer := gopacket.NewSerializeBuffer()
1170 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1171 assert.NoError(t, err)
1172
1173 outgoingPacket := buffer.Bytes()
1174 reconstituted := packetToString(outgoingPacket)
1175 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1176}
1177
1178func TestGetAllAlarmsNextResponseBadCommandNumberDecode(t *testing.T) {
1179 // Test of a GetNext Response that results when an invalid command number
1180 // is requested. In the case where the ONU receives a get all alarms next
1181 // request message in which the command sequence number is out of range,
1182 // the ONU should respond with a message in which bytes 9 to 40 are all
1183 // set to 0. This corresponds to a response with entity class 0, entity
1184 // instance 0, and bit map all 0s.
1185 //TODO: Implement
1186}
1187
1188func TestGetAllAlarmsNextResponseBadCommandNumberSerialize(t *testing.T) {
1189 // Test of a GetNext Response that results when an invalid command number
1190 // is requested.
1191 //TODO: Implement
1192}
1193
1194func TestMibUploadRequestDecode(t *testing.T) {
1195 goodMessage := "03604d0a00020000000000000000000000000000000000000000000000000000000000000000000000000028"
1196 data, err := stringToPacket(goodMessage)
1197 assert.NoError(t, err)
1198
1199 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1200 assert.NotNil(t, packet)
1201
1202 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001203 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06001204
1205 omciMsg, ok := omciLayer.(*OMCI)
1206 assert.True(t, ok)
1207 assert.Equal(t, omciMsg.TransactionID, uint16(0x0360))
1208 assert.Equal(t, omciMsg.MessageType, MibUploadRequestType)
1209 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1210 assert.Equal(t, omciMsg.Length, uint16(40))
1211 msgLayer := packet.Layer(LayerTypeMibUploadRequest)
1212
1213 assert.NotNil(t, msgLayer)
1214
1215 request, ok2 := msgLayer.(*MibUploadRequest)
1216 assert.True(t, ok2)
1217 assert.NotNil(t, request)
1218
1219 // Verify string output for message
1220 packetString := packet.String()
1221 assert.NotZero(t, len(packetString))
1222}
1223
1224func TestMibUploadRequestSerialize(t *testing.T) {
1225 goodMessage := "03604d0a00020000000000000000000000000000000000000000000000000000000000000000000000000028"
1226
1227 omciLayer := &OMCI{
1228 TransactionID: 0x0360,
1229 MessageType: MibUploadRequestType,
1230 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1231 // Length: 0x28, // Optional, defaults to 40 octets
1232 }
1233 var alarms [224 / 8]byte
1234 alarms[0] = 0x80
1235
1236 request := &MibUploadRequest{
1237 MeBasePacket: MeBasePacket{
1238 EntityClass: me.OnuDataClassID,
1239 EntityInstance: uint16(0),
1240 },
1241 }
1242 // Test serialization back to former string
1243 var options gopacket.SerializeOptions
1244 options.FixLengths = true
1245
1246 buffer := gopacket.NewSerializeBuffer()
1247 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1248 assert.NoError(t, err)
1249
1250 outgoingPacket := buffer.Bytes()
1251 reconstituted := packetToString(outgoingPacket)
1252 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1253}
1254
1255func TestMibUploadResponse(t *testing.T) {
1256 goodMessage := "03602d0a00020000011200000000000000000000000000000000000000000000000000000000000000000028"
1257 data, err := stringToPacket(goodMessage)
1258 assert.NoError(t, err)
1259
1260 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1261 assert.NotNil(t, packet)
1262
1263 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001264 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06001265
1266 omciMsg, ok := omciLayer.(*OMCI)
1267 assert.True(t, ok)
1268 assert.Equal(t, omciMsg.TransactionID, uint16(0x0360))
1269 assert.Equal(t, omciMsg.MessageType, MibUploadResponseType)
1270 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1271 assert.Equal(t, omciMsg.Length, uint16(40))
1272
1273 msgLayer := packet.Layer(LayerTypeMibUploadResponse)
1274 assert.NotNil(t, msgLayer)
1275
1276 response, ok2 := msgLayer.(*MibUploadResponse)
1277 assert.True(t, ok2)
1278 assert.NotNil(t, response)
1279 assert.Equal(t, response.NumberOfCommands, uint16(0x112))
1280}
1281
1282func TestMibUploadResponseSerialize(t *testing.T) {
1283 goodMessage := "03602d0a00020000011200000000000000000000000000000000000000000000000000000000000000000028"
1284
1285 omciLayer := &OMCI{
1286 TransactionID: 0x0360,
1287 MessageType: MibUploadResponseType,
1288 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1289 // Length: 0x28, // Optional, defaults to 40 octets
1290 }
1291 var alarms [224 / 8]byte
1292 alarms[0] = 0x80
1293
1294 request := &MibUploadResponse{
1295 MeBasePacket: MeBasePacket{
1296 EntityClass: me.OnuDataClassID,
1297 EntityInstance: uint16(0),
1298 },
1299 NumberOfCommands: uint16(0x112),
1300 }
1301 // Test serialization back to former string
1302 var options gopacket.SerializeOptions
1303 options.FixLengths = true
1304
1305 buffer := gopacket.NewSerializeBuffer()
1306 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1307 assert.NoError(t, err)
1308
1309 outgoingPacket := buffer.Bytes()
1310 reconstituted := packetToString(outgoingPacket)
1311 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1312}
1313
1314func TestMibUploadNextRequestDecode(t *testing.T) {
1315 goodMessage := "02864e0a00020000003a00000000000000000000000000000000000000000000000000000000000000000028"
1316 data, err := stringToPacket(goodMessage)
1317 assert.NoError(t, err)
1318
1319 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1320 assert.NotNil(t, packet)
1321
1322 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001323 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06001324
1325 omciMsg, ok := omciLayer.(*OMCI)
1326 assert.True(t, ok)
1327 assert.Equal(t, omciMsg.TransactionID, uint16(0x0286))
1328 assert.Equal(t, omciMsg.MessageType, MibUploadNextRequestType)
1329 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1330 assert.Equal(t, omciMsg.Length, uint16(40))
1331
1332 msgLayer := packet.Layer(LayerTypeMibUploadNextRequest)
1333 assert.NotNil(t, msgLayer)
1334
1335 request, ok2 := msgLayer.(*MibUploadNextRequest)
1336 assert.True(t, ok2)
1337 assert.NotNil(t, request)
1338 assert.Equal(t, request.CommandSequenceNumber, uint16(0x3a))
1339
1340 // Verify string output for message
1341 packetString := packet.String()
1342 assert.NotZero(t, len(packetString))
1343}
1344
1345func TestMibUploadNextRequestSerialize(t *testing.T) {
1346 goodMessage := "02864e0a00020000003a00000000000000000000000000000000000000000000000000000000000000000028"
1347
1348 omciLayer := &OMCI{
1349 TransactionID: 0x0286,
1350 MessageType: MibUploadNextRequestType,
1351 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1352 // Length: 0x28, // Optional, defaults to 40 octets
1353 }
1354 request := &MibUploadNextRequest{
1355 MeBasePacket: MeBasePacket{
1356 EntityClass: me.OnuDataClassID,
1357 EntityInstance: uint16(0),
1358 },
1359 CommandSequenceNumber: uint16(0x3a),
1360 }
1361 // Test serialization back to former string
1362 var options gopacket.SerializeOptions
1363 options.FixLengths = true
1364
1365 buffer := gopacket.NewSerializeBuffer()
1366 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1367 assert.NoError(t, err)
1368
1369 outgoingPacket := buffer.Bytes()
1370 reconstituted := packetToString(outgoingPacket)
1371 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1372}
1373
1374func TestMibUploadNextResponseDecode(t *testing.T) {
1375 goodMessage := "02862e0a0002000001150000fff0000000000000000000010100000000010000000000000000000000000028"
1376 data, err := stringToPacket(goodMessage)
1377 assert.NoError(t, err)
1378
1379 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1380 assert.NotNil(t, packet)
1381
1382 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001383 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06001384
1385 omciMsg, ok := omciLayer.(*OMCI)
1386 assert.True(t, ok)
1387 assert.Equal(t, omciMsg.TransactionID, uint16(0x0286))
1388 assert.Equal(t, omciMsg.MessageType, MibUploadNextResponseType)
1389 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1390 assert.Equal(t, omciMsg.Length, uint16(40))
1391
1392 msgLayer := packet.Layer(LayerTypeMibUploadNextResponse)
1393 assert.NotNil(t, msgLayer)
1394
1395 response, ok2 := msgLayer.(*MibUploadNextResponse)
1396 assert.True(t, ok2)
1397 assert.NotNil(t, response)
1398 assert.Equal(t, response.ReportedME.GetClassID(), me.PriorityQueueClassID)
1399 assert.Equal(t, response.ReportedME.GetEntityID(), uint16(0))
1400
1401 attributes := me.AttributeValueMap{
1402 "QueueConfigurationOption": byte(0),
1403 "MaximumQueueSize": uint16(0),
1404 "AllocatedQueueSize": uint16(0),
1405 "DiscardBlockCounterResetInterval": uint16(0),
1406 "ThresholdValueForDiscardedBlocksDueToBufferOverflow": uint16(0),
1407 "RelatedPort": uint32(16842752),
1408 "TrafficSchedulerPointer": uint16(0),
1409 "Weight": byte(1),
1410 "BackPressureOperation": uint16(0),
1411 "BackPressureTime": uint32(0),
1412 "BackPressureOccurQueueThreshold": uint16(0),
1413 "BackPressureClearQueueThreshold": uint16(0),
1414 }
1415 for name, value := range attributes {
1416 pktValue, err := response.ReportedME.GetAttribute(name)
1417 assert.Nil(t, err)
1418 assert.Equal(t, pktValue, value)
1419 }
1420 // Verify string output for message
1421 packetString := packet.String()
1422 assert.NotZero(t, len(packetString))
1423}
1424
1425func TestMibUploadNextResponseSerialize(t *testing.T) {
1426 goodMessage := "02862e0a0002000001150000fff0000000000000000000010100000000010000000000000000000000000028"
1427
1428 omciLayer := &OMCI{
1429 TransactionID: 0x0286,
1430 MessageType: MibUploadNextResponseType,
1431 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1432 // Length: 0x28, // Optional, defaults to 40 octets
1433 }
1434 paramData := me.ParamData{
1435 EntityID: uint16(0),
1436 Attributes: me.AttributeValueMap{
1437 "QueueConfigurationOption": byte(0),
1438 "MaximumQueueSize": uint16(0),
1439 "AllocatedQueueSize": uint16(0),
1440 "DiscardBlockCounterResetInterval": uint16(0),
1441 "ThresholdValueForDiscardedBlocksDueToBufferOverflow": uint16(0),
1442 "RelatedPort": uint32(16842752),
1443 "TrafficSchedulerPointer": uint16(0),
1444 "Weight": byte(1),
1445 "BackPressureOperation": uint16(0),
1446 "BackPressureTime": uint32(0),
1447 "BackPressureOccurQueueThreshold": uint16(0),
1448 "BackPressureClearQueueThreshold": uint16(0),
1449 },
1450 }
1451 reportedME, err := me.NewPriorityQueue(paramData)
1452 assert.NotNil(t, err)
1453 assert.Equal(t, err.StatusCode(), me.Success)
1454
1455 request := &MibUploadNextResponse{
1456 MeBasePacket: MeBasePacket{
1457 EntityClass: me.OnuDataClassID,
1458 EntityInstance: uint16(0),
1459 },
1460 ReportedME: *reportedME,
1461 }
1462 // Test serialization back to former string
1463 var options gopacket.SerializeOptions
1464 options.FixLengths = true
1465
1466 buffer := gopacket.NewSerializeBuffer()
1467 omciErr := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1468 assert.NoError(t, omciErr)
1469
1470 outgoingPacket := buffer.Bytes()
1471 reconstituted := packetToString(outgoingPacket)
1472 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1473}
1474
1475func TestMibUploadNextResponseBadCommandNumberDecode(t *testing.T) {
1476 // Test of a MIB Upload next Response that results when an invalid command number.
1477 // Note that if all attributes of a managed entity do not fit within one MIB
1478 // upload next response message, the attributes will be split over several
1479 // messages. The OLT can use the information in the attribute mask to determine
1480 // which attribute values are reported in which MIB upload next response message.
1481 //TODO: Implement
1482}
1483
1484func TestMibUploadNextResponseBadCommandNumberSerialize(t *testing.T) {
1485 // Test of a MIB Upload next Response that results when an invalid command number
1486 // is requested.
1487 //TODO: Implement
1488}
1489
1490// TODO: Create request/response tests for all of the following types
1491//Test,
Chip Boling8c8018e2021-02-22 15:56:00 -06001492// 1 2 3 4
1493// 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
1494// 0004530a00070001ff000f424001000100000000000000000000000000000000000000000000000000000028
1495// 0004530a
1496// 00070001 - ONU-G instance 0001
1497// ff - window size - 1
1498// 000f4240 - image size
1499// 01
1500// 000100000000000000000000000000000000000000000000000000000028
Chip Boling6e27b352020-02-14 09:10:01 -06001501func TestStartSoftwareDownloadRequestDecode(t *testing.T) {
Chip Boling8c8018e2021-02-22 15:56:00 -06001502 goodMessage := "0004530a00070001ff000f424001000100000000000000000000000000000000000000000000000000000028"
1503 data, err := stringToPacket(goodMessage)
1504 assert.NoError(t, err)
1505
1506 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1507 assert.NotNil(t, packet)
1508
1509 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001510 assert.NotNil(t, omciLayer)
Chip Boling8c8018e2021-02-22 15:56:00 -06001511
1512 omciMsg, ok := omciLayer.(*OMCI)
1513 assert.True(t, ok)
1514 assert.Equal(t, uint16(0x0004), omciMsg.TransactionID)
1515 assert.Equal(t, StartSoftwareDownloadRequestType, omciMsg.MessageType)
1516 assert.True(t, omciMsg.ResponseExpected)
1517 assert.Equal(t, BaselineIdent, omciMsg.DeviceIdentifier)
1518 assert.Equal(t, uint16(40), omciMsg.Length)
1519
1520 msgLayer := packet.Layer(LayerTypeStartSoftwareDownloadRequest)
1521 assert.NotNil(t, msgLayer)
1522
1523 request, ok2 := msgLayer.(*StartSoftwareDownloadRequest)
1524 assert.True(t, ok2)
1525 assert.NotNil(t, request)
1526 assert.Equal(t, uint8(0xff), request.WindowSize)
1527 assert.Equal(t, uint32(0x000f4240), request.ImageSize)
1528
1529 // Verify string output for message
1530 packetString := packet.String()
1531 assert.NotZero(t, len(packetString))
Chip Boling6e27b352020-02-14 09:10:01 -06001532}
1533
1534func TestStartSoftwareDownloadRequestSerialize(t *testing.T) {
1535 //// TODO: Need to complete implementation & debug this
1536 //goodMessage := "0000530a0007000113000f424001000100000000000000000000000000000000000000000000000000000028"
1537 //
1538 //omciLayer := &OMCI{
1539 // TransactionID: 0x01,
1540 // MessageType: StartSoftwareDownloadRequestType,
1541 // // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1542 // // Length: 0x28, // Optional, defaults to 40 octets
1543 //}
1544 //request := &StartSoftwareDownloadRequest{
1545 // MeBasePacket: MeBasePacket{
1546 // EntityClass: OnuDataClassID,
1547 // // Default Instance ID is 0
1548 // },
1549 //}
1550 //// Test serialization back to former string
1551 //var options gopacket.SerializeOptions
1552 //options.FixLengths = true
1553 //
1554 //buffer := gopacket.NewSerializeBuffer()
1555 //err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1556 //assert.NoError(t, err)
1557 //
1558 //outgoingPacket := buffer.Bytes()
1559 //reconstituted := packetToString(outgoingPacket)
1560 //assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1561}
1562
1563func TestStartSoftwareDownloadResponseDecode(t *testing.T) {
1564 // TODO: Need to complete implementation & debug this
1565 //goodMessage := ""
1566 //data, err := stringToPacket(goodMessage)
1567 //assert.NoError(t, err)
1568 //
1569 //packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1570 //assert.NotNil(t, packet)
1571 //
1572 //omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001573 //assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06001574 //
1575 //omciMsg, ok := omciLayer.(*OMCI)
1576 //assert.True(t, ok)
1577 //assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
1578 //assert.Equal(t, omciMsg.MessageType, StartSoftwareDownloadResponseType)
1579 //assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1580 //assert.Equal(t, omciMsg.Length, uint16(40))
1581 //
1582 //msgLayer := packet.Layer(LayerTypeStartSoftwareDownloadResponse)
1583 //
1584 //assert.NotNil(t, msgLayer)
1585 //
1586 //response, ok2 := msgLayer.(*StartSoftwareDownloadResponse)
1587 //assert.True(t, ok2)
1588 //assert.NotNil(t, response)
1589 //
1590 //// Verify string output for message
1591 //packetString := packet.String()
1592 //assert.NotZero(t, len(packetString))
1593}
1594
1595func TestStartSoftwareDownloadResponseSerialize(t *testing.T) {
1596 // TODO: Need to complete implementation & debug this
1597 //goodMessage := ""
1598 //
1599 //omciLayer := &OMCI{
1600 // TransactionID: 0x01,
1601 // MessageType: StartSoftwareDownloadResponseType,
1602 // // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1603 // // Length: 0x28, // Optional, defaults to 40 octets
1604 //}
1605 //request := &StartSoftwareDownloadResponse{
1606 // MeBasePacket: MeBasePacket{
1607 // EntityClass: OnuDataClassID,
1608 // // Default Instance ID is 0
1609 // },
1610 //}
1611 //// Test serialization back to former string
1612 //var options gopacket.SerializeOptions
1613 //options.FixLengths = true
1614 //
1615 //buffer := gopacket.NewSerializeBuffer()
1616 //err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1617 //assert.NoError(t, err)
1618 //
1619 //outgoingPacket := buffer.Bytes()
1620 //reconstituted := packetToString(outgoingPacket)
1621 //assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1622}
1623
Chip Boling8c8018e2021-02-22 15:56:00 -06001624// 1 2 3 4
1625// 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
1626// 0008140a00070001 - Download section, AR=0
1627// cc - Section 0xcc
1628// 01020304050607080910111213141516171819202122232425262728293031
1629// 00000028
1630
1631func TestDownloadSectionRequestDecodeNoResponseExpected(t *testing.T) {
1632 goodMessage := "0008140a00070001cc0102030405060708091011121314151617181920212223242526272829303100000028"
1633 data, err := stringToPacket(goodMessage)
1634 assert.NoError(t, err)
1635
1636 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1637 assert.NotNil(t, packet)
1638
1639 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001640 assert.NotNil(t, omciLayer)
Chip Boling8c8018e2021-02-22 15:56:00 -06001641
1642 omciMsg, ok := omciLayer.(*OMCI)
1643 assert.True(t, ok)
1644 assert.Equal(t, uint16(0x0008), omciMsg.TransactionID)
1645 assert.Equal(t, DownloadSectionRequestType, omciMsg.MessageType)
1646 assert.False(t, omciMsg.ResponseExpected)
1647 assert.Equal(t, BaselineIdent, omciMsg.DeviceIdentifier)
1648 assert.Equal(t, uint16(40), omciMsg.Length)
1649
1650 msgLayer := packet.Layer(LayerTypeDownloadSectionRequest)
1651 assert.NotNil(t, msgLayer)
1652
1653 request, ok2 := msgLayer.(*DownloadSectionRequest)
1654 assert.True(t, ok2)
1655 assert.NotNil(t, request)
1656 assert.Equal(t, uint8(0xcc), request.SectionNumber)
1657 assert.Equal(t, 31, len(request.SectionData))
1658
1659 sectionData, genErr := stringToPacket("01020304050607080910111213141516171819202122232425262728293031")
1660 assert.Nil(t, genErr)
1661 assert.NotNil(t, sectionData)
1662 assert.Equal(t, 31, len(sectionData))
1663 assert.Equal(t, sectionData, request.SectionData[:])
1664
1665 // Verify string output for message
1666 packetString := packet.String()
1667 assert.NotZero(t, len(packetString))
Chip Boling6e27b352020-02-14 09:10:01 -06001668}
1669
Chip Boling8c8018e2021-02-22 15:56:00 -06001670func TestDownloadSectionRequestDecodeResponseExpected(t *testing.T) {
1671 goodMessage := "0008540a00070001cc0102030405060708091011121314151617181920212223242526272829303100000028"
1672 data, err := stringToPacket(goodMessage)
1673 assert.NoError(t, err)
1674
1675 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1676 assert.NotNil(t, packet)
1677
1678 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001679 assert.NotNil(t, omciLayer)
Chip Boling8c8018e2021-02-22 15:56:00 -06001680
1681 omciMsg, ok := omciLayer.(*OMCI)
1682 assert.True(t, ok)
1683 assert.Equal(t, uint16(0x0008), omciMsg.TransactionID)
1684 assert.Equal(t, DownloadSectionRequestWithResponseType, omciMsg.MessageType)
1685 assert.True(t, omciMsg.ResponseExpected)
1686 assert.Equal(t, BaselineIdent, omciMsg.DeviceIdentifier)
1687 assert.Equal(t, uint16(40), omciMsg.Length)
1688
1689 msgLayer := packet.Layer(LayerTypeDownloadSectionRequest)
1690 assert.NotNil(t, msgLayer)
1691
1692 request, ok2 := msgLayer.(*DownloadSectionRequest)
1693 assert.True(t, ok2)
1694 assert.NotNil(t, request)
1695 assert.Equal(t, uint8(0xcc), request.SectionNumber)
1696 assert.Equal(t, 31, len(request.SectionData))
1697
1698 sectionData, genErr := stringToPacket("01020304050607080910111213141516171819202122232425262728293031")
1699 assert.Nil(t, genErr)
1700 assert.NotNil(t, sectionData)
1701 assert.Equal(t, 31, len(sectionData))
1702 assert.Equal(t, sectionData, request.SectionData[:])
1703
1704 // Verify string output for message
1705 packetString := packet.String()
1706 assert.NotZero(t, len(packetString))
1707}
1708
1709func TestDownloadSectionRequestSerializeNoResponseExpected(t *testing.T) {
1710 goodMessage := "0123140a00070000cc0102030405060708091011121314151617181920212223242526272829303100000028"
1711
1712 omciLayer := &OMCI{
1713 TransactionID: 0x0123,
1714 MessageType: DownloadSectionRequestType,
1715 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1716 // Length: 0x28, // Optional, defaults to 40 octets
1717 }
1718 sectionData, genErr := stringToPacket("01020304050607080910111213141516171819202122232425262728293031")
1719 assert.Nil(t, genErr)
1720 assert.NotNil(t, sectionData)
1721 assert.Equal(t, 31, len(sectionData))
1722
1723 request := &DownloadSectionRequest{
1724 MeBasePacket: MeBasePacket{
1725 EntityClass: me.SoftwareImageClassID,
1726 // Default Instance ID is 0
1727 },
1728 SectionNumber: 0xcc,
1729 }
1730 copy(request.SectionData[:], sectionData)
1731
1732 // Test serialization back to former string
1733 var options gopacket.SerializeOptions
1734 options.FixLengths = true
1735
1736 buffer := gopacket.NewSerializeBuffer()
1737 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1738 assert.NoError(t, err)
1739
1740 outgoingPacket := buffer.Bytes()
1741 reconstituted := packetToString(outgoingPacket)
1742 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1743}
1744
1745func TestDownloadSectionRequestSerializeResponseExpectedMethod1(t *testing.T) {
1746 goodMessage := "2468540a00070000cc0102030405060708091011121314151617181920212223242526272829303100000028"
1747
1748 omciLayer := &OMCI{
Chip Boling2ccec852021-02-24 11:18:02 -06001749 TransactionID: 0x2468,
1750 MessageType: DownloadSectionRequestType, // or DownloadSectionRequestWithResponseType
Chip Boling8c8018e2021-02-22 15:56:00 -06001751 ResponseExpected: true,
1752 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1753 // Length: 0x28, // Optional, defaults to 40 octets
1754 }
1755 sectionData, genErr := stringToPacket("01020304050607080910111213141516171819202122232425262728293031")
1756 assert.Nil(t, genErr)
1757 assert.NotNil(t, sectionData)
1758 assert.Equal(t, 31, len(sectionData))
1759
1760 request := &DownloadSectionRequest{
1761 MeBasePacket: MeBasePacket{
1762 EntityClass: me.SoftwareImageClassID,
1763 // Default Instance ID is 0
1764 },
1765 SectionNumber: 0xcc,
1766 }
1767 copy(request.SectionData[:], sectionData)
1768
1769 // Test serialization back to former string
1770 var options gopacket.SerializeOptions
1771 options.FixLengths = true
1772
1773 buffer := gopacket.NewSerializeBuffer()
1774 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1775 assert.NoError(t, err)
1776
1777 outgoingPacket := buffer.Bytes()
1778 reconstituted := packetToString(outgoingPacket)
1779 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
1780}
1781
1782func TestDownloadSectionRequestSerializeResponseExpectedMethod2(t *testing.T) {
1783 goodMessage := "2468540a00070001cc0102030405060708091011121314151617181920212223242526272829303100000028"
1784
1785 // In this case, just use the request type with AR response requested already encoded
1786 omciLayer := &OMCI{
1787 TransactionID: 0x2468,
1788 MessageType: DownloadSectionRequestWithResponseType,
1789 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1790 // Length: 0x28, // Optional, defaults to 40 octets
1791 }
1792 sectionData, genErr := stringToPacket("01020304050607080910111213141516171819202122232425262728293031")
1793 assert.Nil(t, genErr)
1794 assert.NotNil(t, sectionData)
1795 assert.Equal(t, 31, len(sectionData))
1796
1797 request := &DownloadSectionRequest{
1798 MeBasePacket: MeBasePacket{
Chip Boling2ccec852021-02-24 11:18:02 -06001799 EntityClass: me.SoftwareImageClassID,
1800 EntityInstance: 0x0001, // Default is zero, here we want image 1
Chip Boling8c8018e2021-02-22 15:56:00 -06001801 },
1802 SectionNumber: 0xcc,
1803 }
1804 copy(request.SectionData[:], sectionData)
1805
1806 // Test serialization back to former string
1807 var options gopacket.SerializeOptions
1808 options.FixLengths = true
1809
1810 buffer := gopacket.NewSerializeBuffer()
1811 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1812 assert.NoError(t, err)
1813
1814 outgoingPacket := buffer.Bytes()
1815 reconstituted := packetToString(outgoingPacket)
1816 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
Chip Boling6e27b352020-02-14 09:10:01 -06001817}
1818
1819func TestDownloadSectionResponseDecode(t *testing.T) {
Chip Boling588d9702021-02-26 09:48:07 -06001820 goodMessage := "0022340a00070001061f00000000000000000000000000000000000000000000000000000000000000000028"
1821 data, err := stringToPacket(goodMessage)
1822 assert.NoError(t, err)
1823
1824 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1825 assert.NotNil(t, packet)
1826
1827 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001828 assert.NotNil(t, omciLayer)
Chip Boling588d9702021-02-26 09:48:07 -06001829
1830 omciMsg, ok := omciLayer.(*OMCI)
1831 assert.True(t, ok)
1832 assert.Equal(t, omciMsg.TransactionID, uint16(0x0022))
1833 assert.Equal(t, omciMsg.MessageType, DownloadSectionResponseType)
1834 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1835 assert.Equal(t, omciMsg.Length, uint16(40))
1836
1837 msgLayer := packet.Layer(LayerTypeDownloadSectionResponse)
1838
1839 assert.NotNil(t, msgLayer)
1840
1841 response, ok2 := msgLayer.(*DownloadSectionResponse)
1842 assert.True(t, ok2)
1843 assert.NotNil(t, response)
1844 assert.Equal(t, me.DeviceBusy, response.Result)
1845 assert.Equal(t, byte(0x1f), response.SectionNumber)
1846
1847 // Verify string output for message
1848 packetString := packet.String()
1849 assert.NotZero(t, len(packetString))
Chip Boling6e27b352020-02-14 09:10:01 -06001850}
1851
1852func TestDownloadSectionResponseSerialize(t *testing.T) {
Chip Boling588d9702021-02-26 09:48:07 -06001853 goodMessage := "0022340a00070001061f00000000000000000000000000000000000000000000000000000000000000000028"
1854
1855 omciLayer := &OMCI{
1856 TransactionID: 0x0022,
1857 MessageType: DownloadSectionResponseType,
1858 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1859 // Length: 0x28, // Optional, defaults to 40 octets
1860 }
1861 request := &DownloadSectionResponse{
1862 MeBasePacket: MeBasePacket{
1863 EntityClass: me.SoftwareImageClassID,
1864 EntityInstance: 1,
1865 },
1866 Result: me.DeviceBusy,
1867 SectionNumber: 0x1f,
1868 }
1869 // Test serialization back to former string
1870 var options gopacket.SerializeOptions
1871 options.FixLengths = true
1872
1873 buffer := gopacket.NewSerializeBuffer()
1874 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1875 assert.NoError(t, err)
1876
1877 outgoingPacket := buffer.Bytes()
1878 reconstituted := packetToString(outgoingPacket)
1879 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
Chip Boling6e27b352020-02-14 09:10:01 -06001880}
1881
1882func TestEndSoftwareDownloadRequestDecode(t *testing.T) {
Chip Boling6e27b352020-02-14 09:10:01 -06001883 //
Chip Boling2ccec852021-02-24 11:18:02 -06001884 // 8100 55 0a 0007 0001 ff92a226 000f4240 01 0001 00000000000000000000000000000000000000000000000028
Chip Boling6e27b352020-02-14 09:10:01 -06001885 //
Chip Boling2ccec852021-02-24 11:18:02 -06001886 goodMessage := "8100550a00070001ff92a226000f424001000100000000000000000000000000000000000000000000000028"
1887 data, err := stringToPacket(goodMessage)
1888 assert.NoError(t, err)
1889
1890 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1891 assert.NotNil(t, packet)
1892
1893 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001894 assert.NotNil(t, omciLayer)
Chip Boling2ccec852021-02-24 11:18:02 -06001895
1896 omciMsg, ok := omciLayer.(*OMCI)
1897 assert.True(t, ok)
1898 assert.Equal(t, omciMsg.TransactionID, uint16(0x8100))
1899 assert.Equal(t, omciMsg.MessageType, EndSoftwareDownloadRequestType)
1900 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1901 assert.Equal(t, omciMsg.Length, uint16(40))
1902
1903 msgLayer := packet.Layer(LayerTypeEndSoftwareDownloadRequest)
1904 assert.NotNil(t, msgLayer)
1905
1906 request, ok2 := msgLayer.(*EndSoftwareDownloadRequest)
1907 assert.True(t, ok2)
1908 assert.NotNil(t, request)
1909 assert.Equal(t, uint32(0xff92a226), request.CRC32)
1910 assert.Equal(t, uint32(0x000f4240), request.ImageSize)
1911 assert.Equal(t, byte(1), request.NumberOfInstances)
1912 assert.Equal(t, 1, len(request.ImageInstances))
1913 assert.Equal(t, uint16(1), request.ImageInstances[0])
1914
1915 // Verify string output for message
1916 packetString := packet.String()
1917 assert.NotZero(t, len(packetString))
Chip Boling6e27b352020-02-14 09:10:01 -06001918}
1919
1920func TestEndSoftwareDownloadRequestSerialize(t *testing.T) {
Chip Boling2ccec852021-02-24 11:18:02 -06001921 // 8100 55 0a 0007 0001 ff92a226 000f4240 01 0001 00000000000000000000000000000000000000000000000028
1922 goodMessage := "8100550a00070001ff92a226000f424001000100000000000000000000000000000000000000000000000028"
1923
1924 omciLayer := &OMCI{
1925 TransactionID: 0x8100,
1926 MessageType: EndSoftwareDownloadRequestType,
1927 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1928 // Length: 0x28, // Optional, defaults to 40 octets
1929 }
1930 request := &EndSoftwareDownloadRequest{
1931 MeBasePacket: MeBasePacket{
1932 EntityClass: me.SoftwareImageClassID,
1933 EntityInstance: 0x0001, // Default is zero, here we want image 1
1934 },
1935 CRC32: 0xff92a226,
1936 ImageSize: 1000000,
1937 NumberOfInstances: 1,
1938 ImageInstances: []uint16{1},
1939 }
1940 // Test serialization back to former string
1941 var options gopacket.SerializeOptions
1942 options.FixLengths = true
1943
1944 buffer := gopacket.NewSerializeBuffer()
1945 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
1946 assert.NoError(t, err)
1947
1948 outgoingPacket := buffer.Bytes()
1949 reconstituted := packetToString(outgoingPacket)
1950 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
Chip Boling6e27b352020-02-14 09:10:01 -06001951}
1952
1953func TestEndSoftwareDownloadResponseDecode(t *testing.T) {
Chip Boling2ccec852021-02-24 11:18:02 -06001954 // 8123 35 0a 0007 0001 06 0000000000000000000000000000000000000000000000000000000000000000000028
1955 goodMessage := "8123350a00070001060000000000000000000000000000000000000000000000000000000000000000000028"
1956 data, err := stringToPacket(goodMessage)
1957 assert.NoError(t, err)
1958
1959 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
1960 assert.NotNil(t, packet)
1961
1962 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05001963 assert.NotNil(t, omciLayer)
Chip Boling2ccec852021-02-24 11:18:02 -06001964
1965 omciMsg, ok := omciLayer.(*OMCI)
1966 assert.True(t, ok)
1967 assert.Equal(t, omciMsg.TransactionID, uint16(0x8123))
1968 assert.Equal(t, omciMsg.MessageType, EndSoftwareDownloadResponseType)
1969 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
1970 assert.Equal(t, omciMsg.Length, uint16(40))
1971
1972 msgLayer := packet.Layer(LayerTypeEndSoftwareDownloadResponse)
1973 assert.NotNil(t, msgLayer)
1974
1975 response, ok2 := msgLayer.(*EndSoftwareDownloadResponse)
1976 assert.True(t, ok2)
1977 assert.NotNil(t, response)
1978 assert.Equal(t, me.DeviceBusy, response.Result)
1979 assert.Equal(t, byte(0), response.NumberOfInstances)
1980 assert.Nil(t, response.MeResults)
1981
1982 // Verify string output for message
1983 packetString := packet.String()
1984 assert.NotZero(t, len(packetString))
Chip Boling6e27b352020-02-14 09:10:01 -06001985}
1986
1987func TestEndSoftwareDownloadResponseSerialize(t *testing.T) {
Chip Boling2ccec852021-02-24 11:18:02 -06001988 goodMessage := "8456350a00070000010000000000000000000000000000000000000000000000000000000000000000000028"
1989
1990 omciLayer := &OMCI{
1991 TransactionID: 0x8456,
1992 MessageType: EndSoftwareDownloadResponseType,
1993 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1994 // Length: 0x28, // Optional, defaults to 40 octets
1995 }
1996 request := &EndSoftwareDownloadResponse{
1997 MeBasePacket: MeBasePacket{
1998 EntityClass: me.SoftwareImageClassID,
1999 // Default is zero
2000 },
2001 Result: me.ProcessingError,
2002 NumberOfInstances: 0,
2003 }
2004 // Test serialization back to former string
2005 var options gopacket.SerializeOptions
2006 options.FixLengths = true
2007
2008 buffer := gopacket.NewSerializeBuffer()
2009 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2010 assert.NoError(t, err)
2011
2012 outgoingPacket := buffer.Bytes()
2013 reconstituted := packetToString(outgoingPacket)
2014 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
Chip Boling6e27b352020-02-14 09:10:01 -06002015}
2016
2017func TestActivateSoftwareRequestDecode(t *testing.T) {
2018 // TODO: Need to complete implementation & debug this
2019 //goodMessage := "0000560a00070001000000000000000000000000000000000000000000000000000000000000000000000028"
2020 //data, err := stringToPacket(goodMessage)
2021 //assert.NoError(t, err)
2022 //
2023 //packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2024 //assert.NotNil(t, packet)
2025 //
2026 //omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002027 //assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002028 //
2029 //omciMsg, ok := omciLayer.(*OMCI)
2030 //assert.True(t, ok)
2031 //assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
2032 //assert.Equal(t, omciMsg.MessageType, ActivateSoftwareRequestType)
2033 //assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2034 //assert.Equal(t, omciMsg.Length, uint16(40))
2035 //
2036 //msgLayer := packet.Layer(LayerTypeActivateSoftwareRequest)
2037 //assert.NotNil(t, msgLayer)
2038 //
2039 //request, ok2 := msgLayer.(*ActivateSoftwareRequest)
2040 //assert.True(t, ok2)
2041 //assert.NotNil(t, request)
2042 //
2043 //// Verify string output for message
2044 //packetString := packet.String()
2045 //assert.NotZero(t, len(packetString))
2046}
2047
2048func TestActivateSoftwareRequestSerialize(t *testing.T) {
2049 // TODO: Need to complete implementation & debug this
2050 //goodMessage := "0000560a00070001000000000000000000000000000000000000000000000000000000000000000000000028"
2051 //
2052 //omciLayer := &OMCI{
2053 // TransactionID: 0x01,
2054 // MessageType: ActivateSoftwareRequestType,
2055 // // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2056 // // Length: 0x28, // Optional, defaults to 40 octets
2057 //}
2058 //request := &ActivateSoftwareRequest{
2059 // MeBasePacket: MeBasePacket{
2060 // EntityClass: OnuDataClassID,
2061 // // Default Instance ID is 0
2062 // },
2063 //}
2064 //// Test serialization back to former string
2065 //var options gopacket.SerializeOptions
2066 //options.FixLengths = true
2067 //
2068 //buffer := gopacket.NewSerializeBuffer()
2069 //err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2070 //assert.NoError(t, err)
2071 //
2072 //outgoingPacket := buffer.Bytes()
2073 //reconstituted := packetToString(outgoingPacket)
2074 //assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2075}
2076
2077func TestActivateSoftwareResponseDecode(t *testing.T) {
2078 // TODO: Need to complete implementation & debug this
2079 //goodMessage := ""
2080 //data, err := stringToPacket(goodMessage)
2081 //assert.NoError(t, err)
2082 //
2083 //packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2084 //assert.NotNil(t, packet)
2085 //
2086 //omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002087 //assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002088 //
2089 //omciMsg, ok := omciLayer.(*OMCI)
2090 //assert.True(t, ok)
2091 //assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
2092 //assert.Equal(t, omciMsg.MessageType, ActivateSoftwareResponseType)
2093 //assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2094 //assert.Equal(t, omciMsg.Length, uint16(40))
2095 //
2096 //msgLayer := packet.Layer(LayerTypeActivateSoftwareResponse)
2097 //
2098 //assert.NotNil(t, msgLayer)
2099 //
2100 //response, ok2 := msgLayer.(*ActivateSoftwareResponse)
2101 //assert.True(t, ok2)
2102 //assert.NotNil(t, response)
2103 //
2104 //// Verify string output for message
2105 //packetString := packet.String()
2106 //assert.NotZero(t, len(packetString))
2107}
2108
2109func TestActivateSoftwareResponseSerialize(t *testing.T) {
2110 // TODO: Need to complete implementation & debug this
2111 //goodMessage := ""
2112 //
2113 //omciLayer := &OMCI{
2114 // TransactionID: 0x01,
2115 // MessageType: ActivateSoftwareResponseType,
2116 // // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2117 // // Length: 0x28, // Optional, defaults to 40 octets
2118 //}
2119 //request := &ActivateSoftwareResponse{
2120 // MeBasePacket: MeBasePacket{
2121 // EntityClass: OnuDataClassID,
2122 // // Default Instance ID is 0
2123 // },
2124 //}
2125 //// Test serialization back to former string
2126 //var options gopacket.SerializeOptions
2127 //options.FixLengths = true
2128 //
2129 //buffer := gopacket.NewSerializeBuffer()
2130 //err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2131 //assert.NoError(t, err)
2132 //
2133 //outgoingPacket := buffer.Bytes()
2134 //reconstituted := packetToString(outgoingPacket)
2135 //assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2136}
2137
2138func TestCommitSoftwareRequestDecode(t *testing.T) {
Chip Boling58fc4d22021-03-10 13:23:53 -06002139 goodMessage := "0011570a00070001000000000000000000000000000000000000000000000000000000000000000000000028"
2140 data, err := stringToPacket(goodMessage)
2141 assert.NoError(t, err)
2142
2143 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2144 assert.NotNil(t, packet)
2145
2146 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002147 assert.NotNil(t, omciLayer)
Chip Boling58fc4d22021-03-10 13:23:53 -06002148
2149 omciMsg, ok := omciLayer.(*OMCI)
2150 assert.True(t, ok)
2151 assert.Equal(t, omciMsg.TransactionID, uint16(0x11))
2152 assert.Equal(t, omciMsg.MessageType, CommitSoftwareRequestType)
2153 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2154 assert.Equal(t, omciMsg.Length, uint16(40))
2155
2156 msgLayer := packet.Layer(LayerTypeCommitSoftwareRequest)
2157 assert.NotNil(t, msgLayer)
2158
2159 request, ok2 := msgLayer.(*CommitSoftwareRequest)
2160 assert.True(t, ok2)
2161 assert.NotNil(t, request)
2162 assert.Equal(t, uint16(1), request.MeBasePacket.EntityInstance)
2163
2164 // Verify string output for message
2165 packetString := packet.String()
2166 assert.NotZero(t, len(packetString))
Chip Boling6e27b352020-02-14 09:10:01 -06002167}
2168
2169func TestCommitSoftwareRequestSerialize(t *testing.T) {
Chip Boling58fc4d22021-03-10 13:23:53 -06002170 goodMessage := "0044570a00070001000000000000000000000000000000000000000000000000000000000000000000000028"
2171
2172 omciLayer := &OMCI{
2173 TransactionID: 0x44,
2174 MessageType: CommitSoftwareRequestType,
2175 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2176 // Length: 0x28, // Optional, defaults to 40 octets
2177 }
2178 request := &CommitSoftwareRequest{
2179 MeBasePacket: MeBasePacket{
2180 EntityClass: me.SoftwareImageClassID,
2181 EntityInstance: 1, // Default Instance ID is 0
2182 },
2183 }
2184 // Test serialization back to former string
2185 var options gopacket.SerializeOptions
2186 options.FixLengths = true
2187
2188 buffer := gopacket.NewSerializeBuffer()
2189 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2190 assert.NoError(t, err)
2191
2192 outgoingPacket := buffer.Bytes()
2193 reconstituted := packetToString(outgoingPacket)
2194 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
Chip Boling6e27b352020-02-14 09:10:01 -06002195}
2196
2197func TestCommitSoftwareResponseDecode(t *testing.T) {
Chip Boling58fc4d22021-03-10 13:23:53 -06002198 goodMessage := "00aa370a00070001060000000000000000000000000000000000000000000000000000000000000000000028"
2199 data, err := stringToPacket(goodMessage)
2200 assert.NoError(t, err)
2201
2202 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2203 assert.NotNil(t, packet)
2204
2205 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002206 assert.NotNil(t, omciLayer)
Chip Boling58fc4d22021-03-10 13:23:53 -06002207
2208 omciMsg, ok := omciLayer.(*OMCI)
2209 assert.True(t, ok)
2210 assert.Equal(t, omciMsg.TransactionID, uint16(0xaa))
2211 assert.Equal(t, omciMsg.MessageType, CommitSoftwareResponseType)
2212 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2213 assert.Equal(t, omciMsg.Length, uint16(40))
2214
2215 msgLayer := packet.Layer(LayerTypeCommitSoftwareResponse)
2216
2217 assert.NotNil(t, msgLayer)
2218
2219 response, ok2 := msgLayer.(*CommitSoftwareResponse)
2220 assert.True(t, ok2)
2221 assert.NotNil(t, response)
2222 assert.Equal(t, uint16(1), response.MeBasePacket.EntityInstance)
2223 assert.Equal(t, me.DeviceBusy, response.Result)
2224
2225 // Verify string output for message
2226 packetString := packet.String()
2227 assert.NotZero(t, len(packetString))
Chip Boling6e27b352020-02-14 09:10:01 -06002228}
2229
2230func TestCommitSoftwareResponseSerialize(t *testing.T) {
Chip Boling58fc4d22021-03-10 13:23:53 -06002231 goodMessage := "8001370a00070001060000000000000000000000000000000000000000000000000000000000000000000028"
2232
2233 omciLayer := &OMCI{
2234 TransactionID: 0x8001,
2235 MessageType: CommitSoftwareResponseType,
2236 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2237 // Length: 0x28, // Optional, defaults to 40 octets
2238 }
2239 request := &CommitSoftwareResponse{
2240 MeBasePacket: MeBasePacket{
2241 EntityClass: me.SoftwareImageClassID,
2242 EntityInstance: 1, // Default Instance ID is 0
2243 },
2244 Result: me.DeviceBusy,
2245 }
2246 // Test serialization back to former string
2247 var options gopacket.SerializeOptions
2248 options.FixLengths = true
2249
2250 buffer := gopacket.NewSerializeBuffer()
2251 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2252 assert.NoError(t, err)
2253
2254 outgoingPacket := buffer.Bytes()
2255 reconstituted := packetToString(outgoingPacket)
2256 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
Chip Boling6e27b352020-02-14 09:10:01 -06002257}
2258
2259func TestMibResetResponseDecode(t *testing.T) {
2260 goodMessage := "00012F0A00020000000000000000000000000000000000000000000000000000000000000000000000000028"
2261 data, err := stringToPacket(goodMessage)
2262 assert.NoError(t, err)
2263
2264 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2265 assert.NotNil(t, packet)
2266
2267 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002268 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002269
2270 omciMsg, ok := omciLayer.(*OMCI)
2271 assert.True(t, ok)
2272 assert.Equal(t, omciMsg.MessageType, MibResetResponseType)
2273 assert.Equal(t, omciMsg.Length, uint16(40))
2274
2275 msgLayer := packet.Layer(LayerTypeMibResetResponse)
2276
2277 assert.NotNil(t, msgLayer)
2278
2279 response, ok2 := msgLayer.(*MibResetResponse)
2280 assert.True(t, ok2)
2281 assert.NotNil(t, response)
2282
2283 // Verify string output for message
2284 packetString := packet.String()
2285 assert.NotZero(t, len(packetString))
2286}
2287
2288func TestMibResetResponseSerialize(t *testing.T) {
2289 goodMessage := "00012F0A00020000000000000000000000000000000000000000000000000000000000000000000000000028"
2290
2291 omciLayer := &OMCI{
2292 TransactionID: 0x01,
2293 MessageType: MibResetResponseType,
2294 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2295 // Length: 0x28, // Optional, defaults to 40 octets
2296 }
2297 request := &MibResetResponse{
2298 MeBasePacket: MeBasePacket{
2299 EntityClass: me.OnuDataClassID,
2300 // Default Instance ID is 0
2301 },
2302 }
2303 // Test serialization back to former string
2304 var options gopacket.SerializeOptions
2305 options.FixLengths = true
2306
2307 buffer := gopacket.NewSerializeBuffer()
2308 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2309 assert.NoError(t, err)
2310
2311 outgoingPacket := buffer.Bytes()
2312 reconstituted := packetToString(outgoingPacket)
2313 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2314}
2315
2316func TestSynchronizeTimeRequestDecode(t *testing.T) {
2317 goodMessage := "0109580a0100000007e20c0101301b0000000000000000000000000000000000000000000000000000000028"
2318 data, err := stringToPacket(goodMessage)
2319 assert.NoError(t, err)
2320
2321 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2322 assert.NotNil(t, packet)
2323
2324 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002325 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002326
2327 omciMsg, ok := omciLayer.(*OMCI)
2328 assert.True(t, ok)
2329 assert.Equal(t, omciMsg.MessageType, SynchronizeTimeRequestType)
2330 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2331 assert.Equal(t, omciMsg.Length, uint16(40))
2332
2333 msgLayer := packet.Layer(LayerTypeSynchronizeTimeRequest)
2334 assert.NotNil(t, msgLayer)
2335
2336 request, ok2 := msgLayer.(*SynchronizeTimeRequest)
2337 assert.True(t, ok2)
2338 assert.NotNil(t, request)
2339 assert.Equal(t, request.Year, uint16(2018))
2340 assert.Equal(t, request.Month, uint8(12))
2341 assert.Equal(t, request.Day, uint8(1))
2342 assert.Equal(t, request.Hour, uint8(01))
2343 assert.Equal(t, request.Minute, uint8(48))
2344 assert.Equal(t, request.Second, uint8(27))
2345
2346 // Verify string output for message
2347 packetString := packet.String()
2348 assert.NotZero(t, len(packetString))
2349}
2350
2351func TestSynchronizeTimeRequestSerialize(t *testing.T) {
2352 goodMessage := "0109580a0100000007e20c0101301b0000000000000000000000000000000000000000000000000000000028"
2353
2354 omciLayer := &OMCI{
2355 TransactionID: 0x0109,
2356 MessageType: SynchronizeTimeRequestType,
2357 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2358 // Length: 0x28, // Optional, defaults to 40 octets
2359 }
2360 request := &SynchronizeTimeRequest{
2361 MeBasePacket: MeBasePacket{
2362 EntityClass: me.OnuGClassID,
2363 // Default Instance ID is 0
2364 },
2365 Year: uint16(2018),
2366 Month: uint8(12),
2367 Day: uint8(1),
2368 Hour: uint8(01),
2369 Minute: uint8(48),
2370 Second: uint8(27),
2371 }
2372 // Test serialization back to former string
2373 var options gopacket.SerializeOptions
2374 options.FixLengths = true
2375
2376 buffer := gopacket.NewSerializeBuffer()
2377 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2378 assert.NoError(t, err)
2379
2380 outgoingPacket := buffer.Bytes()
2381 reconstituted := packetToString(outgoingPacket)
2382 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2383}
2384
2385func TestSynchronizeTimeResponseDecode(t *testing.T) {
2386 goodMessage := "0109380a01000000000000000000000000000000000000000000000000000000000000000000000000000028"
2387 data, err := stringToPacket(goodMessage)
2388 assert.NoError(t, err)
2389
2390 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2391 assert.NotNil(t, packet)
2392
2393 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002394 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002395
2396 omciMsg, ok := omciLayer.(*OMCI)
2397 assert.True(t, ok)
2398 assert.Equal(t, omciMsg.MessageType, SynchronizeTimeResponseType)
2399 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2400 assert.Equal(t, omciMsg.Length, uint16(40))
2401
2402 msgLayer := packet.Layer(LayerTypeSynchronizeTimeResponse)
2403 assert.NotNil(t, msgLayer)
2404
2405 response, ok2 := msgLayer.(*SynchronizeTimeResponse)
2406 assert.True(t, ok2)
2407 assert.NotNil(t, response)
2408
2409 // Verify string output for message
2410 packetString := packet.String()
2411 assert.NotZero(t, len(packetString))
2412}
2413
2414func TestSynchronizeTimeResponseSerialize(t *testing.T) {
2415 goodMessage := "0109380a01000000000000000000000000000000000000000000000000000000000000000000000000000028"
2416
2417 omciLayer := &OMCI{
2418 TransactionID: 0x0109,
2419 MessageType: SynchronizeTimeResponseType,
2420 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2421 // Length: 0x28, // Optional, defaults to 40 octets
2422 }
2423 request := &SynchronizeTimeResponse{
2424 MeBasePacket: MeBasePacket{
2425 EntityClass: me.OnuGClassID,
2426 EntityInstance: uint16(0),
2427 },
2428 Result: me.Success,
2429 SuccessResults: uint8(0),
2430 }
2431 // Test serialization back to former string
2432 var options gopacket.SerializeOptions
2433 options.FixLengths = true
2434
2435 buffer := gopacket.NewSerializeBuffer()
2436 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2437 assert.NoError(t, err)
2438
2439 outgoingPacket := buffer.Bytes()
2440 reconstituted := packetToString(outgoingPacket)
2441 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2442}
2443
2444func TestRebootRequestDecode(t *testing.T) {
2445 goodMessage := "0001590a01000000010000000000000000000000000000000000000000000000000000000000000000000028"
2446 data, err := stringToPacket(goodMessage)
2447 assert.NoError(t, err)
2448
2449 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2450 assert.NotNil(t, packet)
2451
2452 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002453 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002454
2455 omciMsg, ok := omciLayer.(*OMCI)
2456 assert.True(t, ok)
2457 assert.Equal(t, omciMsg.TransactionID, uint16(0x0001))
2458 assert.Equal(t, omciMsg.MessageType, RebootRequestType)
2459 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2460 assert.Equal(t, omciMsg.Length, uint16(40))
2461
2462 msgLayer := packet.Layer(LayerTypeRebootRequest)
2463 assert.NotNil(t, msgLayer)
2464
2465 request, ok2 := msgLayer.(*RebootRequest)
2466 assert.True(t, ok2)
2467 assert.NotNil(t, request)
2468 assert.Equal(t, request.EntityClass, me.OnuGClassID)
2469 assert.Equal(t, request.EntityInstance, uint16(0))
2470 assert.Equal(t, request.RebootCondition, uint8(1))
2471
2472 // Verify string output for message
2473 packetString := packet.String()
2474 assert.NotZero(t, len(packetString))
2475}
2476
2477func TestRebootRequestSerialize(t *testing.T) {
2478 goodMessage := "0001590a01000000020000000000000000000000000000000000000000000000000000000000000000000028"
2479
2480 omciLayer := &OMCI{
2481 TransactionID: 0x0001,
2482 MessageType: RebootRequestType,
2483 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2484 // Length: 0x28, // Optional, defaults to 40 octets
2485 }
2486 request := &RebootRequest{
2487 MeBasePacket: MeBasePacket{
2488 EntityClass: me.OnuGClassID,
2489 // Default Instance ID is 0
2490 },
2491 RebootCondition: uint8(2),
2492 }
2493 // Test serialization back to former string
2494 var options gopacket.SerializeOptions
2495 options.FixLengths = true
2496
2497 buffer := gopacket.NewSerializeBuffer()
2498 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2499 assert.NoError(t, err)
2500
2501 outgoingPacket := buffer.Bytes()
2502 reconstituted := packetToString(outgoingPacket)
2503 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2504}
2505
2506func TestRebootResponseDecode(t *testing.T) {
2507 goodMessage := "023c390a01000000000000000000000000000000000000000000000000000000000000000000000000000028"
2508 data, err := stringToPacket(goodMessage)
2509 assert.NoError(t, err)
2510
2511 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2512 assert.NotNil(t, packet)
2513
2514 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002515 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002516
2517 omciMsg, ok := omciLayer.(*OMCI)
2518 assert.True(t, ok)
2519 assert.Equal(t, omciMsg.TransactionID, uint16(0x023c))
2520 assert.Equal(t, omciMsg.MessageType, RebootResponseType)
2521 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2522 assert.Equal(t, omciMsg.Length, uint16(40))
2523
2524 msgLayer := packet.Layer(LayerTypeRebootResponse)
2525 assert.NotNil(t, msgLayer)
2526
2527 response, ok2 := msgLayer.(*RebootResponse)
2528 assert.True(t, ok2)
2529 assert.NotNil(t, response)
2530 assert.Equal(t, response.EntityClass, me.OnuGClassID)
2531 assert.Equal(t, response.EntityInstance, uint16(0))
2532 assert.Equal(t, response.Result, me.Success)
2533
2534 // Verify string output for message
2535 packetString := packet.String()
2536 assert.NotZero(t, len(packetString))
2537}
2538
2539func TestRebootResponseSerialize(t *testing.T) {
2540 goodMessage := "023c390a01000000060000000000000000000000000000000000000000000000000000000000000000000028"
2541
2542 omciLayer := &OMCI{
2543 TransactionID: 0x023c,
2544 MessageType: RebootResponseType,
2545 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2546 // Length: 0x28, // Optional, defaults to 40 octets
2547 }
2548 request := &RebootResponse{
2549 MeBasePacket: MeBasePacket{
2550 EntityClass: me.OnuGClassID,
2551 EntityInstance: uint16(0),
2552 },
2553 Result: me.DeviceBusy,
2554 }
2555 // Test serialization back to former string
2556 var options gopacket.SerializeOptions
2557 options.FixLengths = true
2558
2559 buffer := gopacket.NewSerializeBuffer()
2560 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2561 assert.NoError(t, err)
2562
2563 outgoingPacket := buffer.Bytes()
2564 reconstituted := packetToString(outgoingPacket)
2565 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2566}
2567
2568func TestGetNextRequestDecode(t *testing.T) {
2569 goodMessage := "285e5a0a00ab0202040000010000000000000000000000000000000000000000000000000000000000000028"
2570 data, err := stringToPacket(goodMessage)
2571 assert.NoError(t, err)
2572
2573 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2574 assert.NotNil(t, packet)
2575
2576 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002577 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002578
2579 omciMsg, ok := omciLayer.(*OMCI)
2580 assert.True(t, ok)
2581 assert.Equal(t, omciMsg.TransactionID, uint16(0x285e))
2582 assert.Equal(t, omciMsg.MessageType, GetNextRequestType)
2583 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2584 assert.Equal(t, omciMsg.Length, uint16(40))
2585
2586 msgLayer := packet.Layer(LayerTypeGetNextRequest)
2587 assert.NotNil(t, msgLayer)
2588
2589 request, ok2 := msgLayer.(*GetNextRequest)
2590 assert.True(t, ok2)
2591 assert.NotNil(t, request)
2592 assert.Equal(t, request.EntityClass, me.ExtendedVlanTaggingOperationConfigurationDataClassID)
2593 assert.Equal(t, request.EntityInstance, uint16(0x0202))
2594 assert.Equal(t, request.AttributeMask, uint16(0x0400))
2595 assert.Equal(t, request.SequenceNumber, uint16(1))
2596
2597 // Verify string output for message
2598 packetString := packet.String()
2599 assert.NotZero(t, len(packetString))
2600}
2601
2602func TestGetNextRequestSerialize(t *testing.T) {
2603 goodMessage := "285e5a0a00ab0202040000010000000000000000000000000000000000000000000000000000000000000028"
2604
2605 omciLayer := &OMCI{
2606 TransactionID: 0x285e,
2607 MessageType: GetNextRequestType,
2608 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2609 // Length: 0x28, // Optional, defaults to 40 octets
2610 }
2611 request := &GetNextRequest{
2612 MeBasePacket: MeBasePacket{
2613 EntityClass: me.ExtendedVlanTaggingOperationConfigurationDataClassID,
2614 EntityInstance: uint16(0x0202),
2615 },
2616 AttributeMask: uint16(0x0400),
2617 SequenceNumber: uint16(1),
2618 }
2619 // Test serialization back to former string
2620 var options gopacket.SerializeOptions
2621 options.FixLengths = true
2622
2623 buffer := gopacket.NewSerializeBuffer()
2624 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2625 assert.NoError(t, err)
2626
2627 outgoingPacket := buffer.Bytes()
2628 reconstituted := packetToString(outgoingPacket)
2629 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2630}
2631
2632func TestGetNextResponseDecode(t *testing.T) {
2633 goodMessage := "285e3a0a00ab0202000400080334000000000000000000000000000000000000000000000000000000000028"
2634
2635 data, err := stringToPacket(goodMessage)
2636 assert.NoError(t, err)
2637
2638 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2639 assert.NotNil(t, packet)
2640
2641 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002642 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002643
2644 omciMsg, ok := omciLayer.(*OMCI)
2645 assert.True(t, ok)
2646 assert.Equal(t, omciMsg.TransactionID, uint16(0x285e))
2647 assert.Equal(t, omciMsg.MessageType, GetNextResponseType)
2648 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2649 assert.Equal(t, omciMsg.Length, uint16(40))
2650
2651 msgLayer := packet.Layer(LayerTypeGetNextResponse)
2652 assert.NotNil(t, msgLayer)
2653
2654 vlanOpTable := []byte{0x08, 0x03, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
2655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
2656
2657 response, ok2 := msgLayer.(*GetNextResponse)
2658 assert.True(t, ok2)
2659 assert.NotNil(t, response)
2660 assert.Equal(t, me.ExtendedVlanTaggingOperationConfigurationDataClassID, response.EntityClass)
2661 assert.Equal(t, uint16(0x0202), response.EntityInstance)
2662 assert.Equal(t, me.Success, response.Result)
2663 assert.Equal(t, uint16(0x0400), response.AttributeMask)
2664
2665 // For GetNextResponse frames, caller is responsible for trimming last packet to remaining
2666 // size
2667 expectedOctets := 16
2668 value := response.Attributes["ReceivedFrameVlanTaggingOperationTable"]
2669 assert.Equal(t, vlanOpTable, value.([]byte)[:expectedOctets])
2670
2671 // Verify string output for message
2672 packetString := packet.String()
2673 assert.NotZero(t, len(packetString))
2674}
2675
2676func TestGetNextResponseSerialize(t *testing.T) {
2677 goodMessage := "285e3a0a00ab0202000400080334000000000000000000000000000000000000000000000000000000000028"
2678
2679 omciLayer := &OMCI{
2680 TransactionID: 0x285e,
2681 MessageType: GetNextResponseType,
2682 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2683 // Length: 0x28, // Optional, defaults to 40 octets
2684 }
2685 vlanOpTable := []byte{0x08, 0x03, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
2686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
2687
2688 request := &GetNextResponse{
2689 MeBasePacket: MeBasePacket{
2690 EntityClass: me.ExtendedVlanTaggingOperationConfigurationDataClassID,
2691 EntityInstance: uint16(0x0202),
2692 },
2693 Result: me.Success,
2694 AttributeMask: uint16(0x0400),
2695 Attributes: me.AttributeValueMap{"ReceivedFrameVlanTaggingOperationTable": vlanOpTable},
2696 }
2697 // Test serialization back to former string
2698 var options gopacket.SerializeOptions
2699 options.FixLengths = true
2700
2701 buffer := gopacket.NewSerializeBuffer()
2702 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2703 assert.NoError(t, err)
2704
2705 outgoingPacket := buffer.Bytes()
2706 reconstituted := packetToString(outgoingPacket)
2707 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2708}
2709
2710// TODO: Create request/response tests for all of the following types//GetCurrentData,
2711//SetTable}
2712
2713func TestAlarmNotificationDecode(t *testing.T) {
2714 goodMessage := "0000100a000b0104800000000000000000000000000000000000000000000000000000000000000500000028"
2715 data, err := stringToPacket(goodMessage)
2716 assert.NoError(t, err)
2717
2718 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2719 assert.NotNil(t, packet)
2720
2721 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002722 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002723
2724 omciMsg, ok := omciLayer.(*OMCI)
2725 assert.True(t, ok)
2726 assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
2727 assert.Equal(t, omciMsg.MessageType, AlarmNotificationType)
2728 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2729 assert.Equal(t, omciMsg.Length, uint16(40))
2730
2731 msgLayer := packet.Layer(LayerTypeAlarmNotification)
2732 assert.NotNil(t, msgLayer)
2733
2734 request, ok2 := msgLayer.(*AlarmNotificationMsg)
2735 assert.True(t, ok2)
2736 assert.NotNil(t, request)
2737 assert.Equal(t, request.EntityClass, me.PhysicalPathTerminationPointEthernetUniClassID)
2738 assert.Equal(t, request.EntityInstance, uint16(0x104))
2739 assert.Equal(t, request.AlarmBitmap, [28]byte{
2740 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2741 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2743 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2744 })
2745 assert.Equal(t, request.AlarmSequenceNumber, byte(5))
2746
Chip Boling34ebcb62021-02-02 12:13:58 -06002747 // Active/Clear tests
2748 active, err2 := request.IsAlarmActive(0)
2749 clear, err3 := request.IsAlarmClear(0)
2750 assert.Nil(t, err2)
2751 assert.Nil(t, err3)
2752 assert.True(t, active)
2753 assert.False(t, clear)
2754
2755 // Active/Clear for undefined alarm bits
2756 active, err2 = request.IsAlarmActive(1)
2757 clear, err3 = request.IsAlarmClear(1)
2758 assert.NotNil(t, err2)
2759 assert.NotNil(t, err3)
2760
Chip Boling6e27b352020-02-14 09:10:01 -06002761 // Verify string output for message
2762 packetString := packet.String()
2763 assert.NotZero(t, len(packetString))
2764}
2765
Chip Boling34ebcb62021-02-02 12:13:58 -06002766func TestInvalidClassAlarmNotificationDecode(t *testing.T) {
2767 // Choosing GalEthernetProfile (272) since it does not support alarms, show we should
2768 // file the decode
2769 badMessage := "0000100a01100104800000000000000000000000000000000000000000000000000000000000000500000028"
2770 data, err := stringToPacket(badMessage)
2771 assert.NoError(t, err)
2772
2773 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2774 assert.NotNil(t, packet)
2775
2776 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002777 assert.NotNil(t, omciLayer)
Chip Boling34ebcb62021-02-02 12:13:58 -06002778
2779 omciMsg, ok := omciLayer.(*OMCI)
2780 assert.True(t, ok)
2781 assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
2782 assert.Equal(t, omciMsg.MessageType, AlarmNotificationType)
2783 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2784 assert.Equal(t, omciMsg.Length, uint16(40))
2785
2786 msgLayer := packet.Layer(LayerTypeAlarmNotification)
2787 assert.Nil(t, msgLayer)
2788
2789 request, ok2 := msgLayer.(*AlarmNotificationMsg)
2790 assert.False(t, ok2)
2791 assert.Nil(t, request)
2792}
2793
2794func TestUnknownsMeAlarmNotificationDecode(t *testing.T) {
2795 // Choosing class ID 22 since it is in the G.988 class ID space and is reserved
2796 goodMessage := "0000100a00160104800000000000000000000000000000000000000000000000000000000000000500000028"
2797 data, err := stringToPacket(goodMessage)
2798 assert.NoError(t, err)
2799
2800 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2801 assert.NotNil(t, packet)
2802
2803 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002804 assert.NotNil(t, omciLayer)
Chip Boling34ebcb62021-02-02 12:13:58 -06002805
2806 omciMsg, ok := omciLayer.(*OMCI)
2807 assert.True(t, ok)
2808 assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
2809 assert.Equal(t, omciMsg.MessageType, AlarmNotificationType)
2810 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2811 assert.Equal(t, omciMsg.Length, uint16(40))
2812
2813 msgLayer := packet.Layer(LayerTypeAlarmNotification)
2814 assert.NotNil(t, msgLayer)
2815
2816 request, ok2 := msgLayer.(*AlarmNotificationMsg)
2817 assert.True(t, ok2)
2818 assert.NotNil(t, request)
2819 assert.Equal(t, request.EntityClass, me.ClassID(22))
2820 assert.Equal(t, request.EntityInstance, uint16(0x104))
2821 assert.Equal(t, request.AlarmBitmap, [28]byte{
2822 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2823 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2826 })
2827 assert.Equal(t, request.AlarmSequenceNumber, byte(5))
2828}
2829
2830func TestVendorSpecificAlarmNotificationDecode(t *testing.T) {
2831 // Choosing class ID 255 since it is in the first vendor specific class ID space
2832 goodMessage := "0000100a00FF0104800000000000000000000000000000000000000000000000000000000000000500000028"
2833 data, err := stringToPacket(goodMessage)
2834 assert.NoError(t, err)
2835
2836 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2837 assert.NotNil(t, packet)
2838
2839 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002840 assert.NotNil(t, omciLayer)
Chip Boling34ebcb62021-02-02 12:13:58 -06002841
2842 omciMsg, ok := omciLayer.(*OMCI)
2843 assert.True(t, ok)
2844 assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
2845 assert.Equal(t, omciMsg.MessageType, AlarmNotificationType)
2846 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2847 assert.Equal(t, omciMsg.Length, uint16(40))
2848
2849 msgLayer := packet.Layer(LayerTypeAlarmNotification)
2850 assert.NotNil(t, msgLayer)
2851
2852 request, ok2 := msgLayer.(*AlarmNotificationMsg)
2853 assert.True(t, ok2)
2854 assert.NotNil(t, request)
2855 assert.Equal(t, request.EntityClass, me.ClassID(255))
2856 assert.Equal(t, request.EntityInstance, uint16(0x104))
2857 assert.Equal(t, request.AlarmBitmap, [28]byte{
2858 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2860 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2861 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2862 })
2863 assert.Equal(t, request.AlarmSequenceNumber, byte(5))
2864}
2865
Chip Boling6e27b352020-02-14 09:10:01 -06002866func TestAlarmNotificationSerialize(t *testing.T) {
2867 goodMessage := "0000100a000b0104800000000000000000000000000000000000000000000000000000000000000500000028"
2868
2869 omciLayer := &OMCI{
2870 TransactionID: 0,
2871 MessageType: AlarmNotificationType,
2872 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2873 // Length: 0x28, // Optional, defaults to 40 octets
2874 }
2875 request := &AlarmNotificationMsg{
2876 MeBasePacket: MeBasePacket{
2877 EntityClass: me.PhysicalPathTerminationPointEthernetUniClassID,
2878 EntityInstance: uint16(0x104),
2879 },
2880 AlarmBitmap: [28]byte{
2881 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2885 },
2886 AlarmSequenceNumber: byte(5),
2887 }
2888 // Test serialization back to former string
2889 var options gopacket.SerializeOptions
2890 options.FixLengths = true
2891
2892 buffer := gopacket.NewSerializeBuffer()
2893 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2894 assert.NoError(t, err)
2895
2896 outgoingPacket := buffer.Bytes()
2897 reconstituted := packetToString(outgoingPacket)
2898 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2899}
2900
2901func TestAttributeValueChangeDecode(t *testing.T) {
2902 goodMessage := "0000110a0007000080004d4c2d33363236000000000000000000000000000000000000000000000000000028"
2903 data, err := stringToPacket(goodMessage)
2904 assert.NoError(t, err)
2905
2906 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2907 assert.NotNil(t, packet)
2908
2909 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05002910 assert.NotNil(t, omciLayer)
Chip Boling6e27b352020-02-14 09:10:01 -06002911
2912 omciMsg, ok := omciLayer.(*OMCI)
2913 assert.True(t, ok)
2914 assert.Equal(t, omciMsg.TransactionID, uint16(0x0))
2915 assert.Equal(t, omciMsg.MessageType, AttributeValueChangeType)
2916 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2917 assert.Equal(t, omciMsg.Length, uint16(40))
2918
2919 msgLayer := packet.Layer(LayerTypeAttributeValueChange)
2920 assert.NotNil(t, msgLayer)
2921
2922 request, ok2 := msgLayer.(*AttributeValueChangeMsg)
2923 assert.True(t, ok2)
2924 assert.NotNil(t, request)
2925 assert.Equal(t, request.AttributeMask, uint16(0x8000))
2926 assert.Equal(t, request.EntityClass, me.SoftwareImageClassID)
2927 assert.Equal(t, request.EntityInstance, uint16(0))
2928 assert.Equal(t, request.Attributes["Version"], []byte{
2929 0x4d, 0x4c, 0x2d, 0x33, 0x36, 0x32, 0x36,
2930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
2931
2932 // Verify string output for message
2933 packetString := packet.String()
2934 assert.NotZero(t, len(packetString))
2935}
2936
2937func TestAttributeValueChangeSerialize(t *testing.T) {
2938 goodMessage := "0000110a0007000080004d4c2d33363236000000000000000000000000000000000000000000000000000028"
2939
2940 omciLayer := &OMCI{
2941 TransactionID: 0,
2942 MessageType: AttributeValueChangeType,
2943 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2944 // Length: 0x28, // Optional, defaults to 40 octets
2945 }
2946 request := &AttributeValueChangeMsg{
2947 MeBasePacket: MeBasePacket{
2948 EntityClass: me.SoftwareImageClassID,
2949 EntityInstance: uint16(0),
2950 },
2951 AttributeMask: uint16(0x8000),
2952 Attributes: me.AttributeValueMap{
2953 "Version": []byte{
2954 0x4d, 0x4c, 0x2d, 0x33, 0x36, 0x32, 0x36,
2955 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2956 },
2957 },
2958 }
2959 // Test serialization back to former string
2960 var options gopacket.SerializeOptions
2961 options.FixLengths = true
2962
2963 buffer := gopacket.NewSerializeBuffer()
2964 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2965 assert.NoError(t, err)
2966
2967 outgoingPacket := buffer.Bytes()
2968 reconstituted := packetToString(outgoingPacket)
2969 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
2970}
2971
Chip Boling4e0ac9a2021-01-20 14:23:09 -06002972func TestJira3769(t *testing.T) {
2973 // VOL-3769. Error parsing get response with processing error and large mask
2974 sampleMessage := "035e290a0101000001FFFC000000000000000000000000000000000000000000000000000000000000000028"
2975 data, err := stringToPacket(sampleMessage)
2976 assert.NoError(t, err)
2977
2978 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
2979 assert.NotNil(t, packet)
2980
2981 omciLayer := packet.Layer(LayerTypeOMCI)
2982 assert.NotNil(t, omciLayer)
2983
2984 omciMsg, ok := omciLayer.(*OMCI)
2985 assert.True(t, ok)
2986 assert.Equal(t, omciMsg.TransactionID, uint16(0x035e))
2987 assert.Equal(t, omciMsg.MessageType, GetResponseType)
2988 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
2989 assert.Equal(t, omciMsg.Length, uint16(40))
2990
2991 // before bugfix for this JIRA, the following call returned 'nil' Failure was
Chip Bolingd8637b02021-04-29 08:36:38 -05002992 // occurring before this at during getResponse decoding.
Chip Boling4e0ac9a2021-01-20 14:23:09 -06002993 msgLayer := packet.Layer(LayerTypeGetResponse)
2994 assert.NotNil(t, msgLayer)
2995
2996 response, ok2 := msgLayer.(*GetResponse)
2997 assert.True(t, ok2)
2998 assert.NotNil(t, response)
2999 assert.Equal(t, response.Result, me.ProcessingError)
3000 assert.Equal(t, response.AttributeMask, uint16(0xFFFC))
3001}
Chip Boling34ebcb62021-02-02 12:13:58 -06003002
Chip Boling2c046fa2021-02-23 11:30:29 -06003003func TestJira3863(t *testing.T) {
3004 goodMessage := "81a9240a013880010700000000000000000000000000000000000000000000000000000000000000000000283f73ddea"
3005 data, err := stringToPacket(goodMessage)
3006 assert.NoError(t, err)
3007
3008 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3009 assert.NotNil(t, packet)
3010
3011 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05003012 assert.NotNil(t, omciLayer)
Chip Boling2c046fa2021-02-23 11:30:29 -06003013
3014 omciMsg, ok := omciLayer.(*OMCI)
3015 assert.True(t, ok)
3016 assert.NotNil(t, omciMsg)
3017
3018 msgLayer := packet.Layer(LayerTypeCreateResponse)
3019 assert.NotNil(t, msgLayer)
3020
3021 // FEC PM ME not in class map so the following was failing (ok2 false)
3022 response, ok2 := msgLayer.(*CreateResponse)
3023 assert.True(t, ok2)
3024 assert.NotNil(t, response)
3025
3026 // Verify string output for message
3027 packetString := packet.String()
3028 assert.NotZero(t, len(packetString))
3029}
Chip Boling157c9b92021-04-21 09:58:36 -05003030
3031func TestExtendedGetRequestDecode(t *testing.T) {
3032 //ONU-2G: 257
3033 goodMessage := "035e490b010100000002fffc"
3034 data, err := stringToPacket(goodMessage)
3035 assert.NoError(t, err)
3036
3037 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3038 assert.NotNil(t, packet)
3039
3040 omciLayer := packet.Layer(LayerTypeOMCI)
Chip Bolingd8637b02021-04-29 08:36:38 -05003041 assert.NotNil(t, omciLayer)
Chip Boling157c9b92021-04-21 09:58:36 -05003042
3043 omciMsg, ok := omciLayer.(*OMCI)
3044 assert.True(t, ok)
3045 assert.Equal(t, omciMsg.TransactionID, uint16(0x035e))
3046 assert.Equal(t, omciMsg.MessageType, GetRequestType)
3047 assert.Equal(t, omciMsg.DeviceIdentifier, ExtendedIdent)
3048 assert.Equal(t, omciMsg.Length, uint16(2))
3049
3050 msgLayer := packet.Layer(LayerTypeGetRequest)
3051 assert.NotNil(t, msgLayer)
3052
3053 request, ok2 := msgLayer.(*GetRequest)
3054 assert.True(t, ok2)
3055 assert.NotNil(t, request)
3056
3057 //ONU-2G: 257
3058 assert.Equal(t, me.Onu2GClassID, request.EntityClass)
3059 assert.Equal(t, uint16(0), request.EntityInstance)
3060 assert.Equal(t, uint16(0xfffc), request.AttributeMask)
3061
3062 // Verify string output for message
3063 packetString := packet.String()
3064 assert.NotZero(t, len(packetString))
3065}
3066
3067func TestExtendedGetRequestSerialize(t *testing.T) {
3068 goodMessage := "035e490b010100000002fffc"
3069
3070 omciLayer := &OMCI{
3071 TransactionID: 0x035e,
3072 MessageType: GetRequestType,
3073 DeviceIdentifier: ExtendedIdent,
3074 // Length parameter is optional for Extended message format serialization
3075 // and if present it will be overwritten during the serialization with the
3076 // actual value.
3077 }
3078 request := &GetRequest{
3079 MeBasePacket: MeBasePacket{
3080 EntityClass: me.Onu2GClassID,
3081 EntityInstance: uint16(0),
3082 Extended: true,
3083 },
3084 AttributeMask: uint16(0xfffc),
3085 }
3086 // Test serialization back to former string
3087 var options gopacket.SerializeOptions
3088 options.FixLengths = true
3089
3090 buffer := gopacket.NewSerializeBuffer()
3091 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3092 assert.NoError(t, err)
3093
3094 outgoingPacket := buffer.Bytes()
3095 reconstituted := packetToString(outgoingPacket)
3096 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3097}
3098
3099func TestExtendedGetResponseDecode(t *testing.T) {
3100 attrDef, omciErr := me.GetAttributesDefinitions(me.Onu2GClassID)
3101 assert.NotNil(t, attrDef)
3102 assert.NotNil(t, omciErr)
3103 assert.Equal(t, omciErr.StatusCode(), me.Success)
3104
3105 attributes := []interface{}{
3106 toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="), // 1: MultiByteField - "EquipmentId" (20 zeros)
3107 byte(0xb4), // 2: ByteField - "OpticalNetworkUnitManagementAndControlChannelOmccVersion"
3108 uint16(0x1234), // 3: Uint16Field - "VendorProductCode"
3109 byte(1), // 4: ByteField - "SecurityCapability"
3110 byte(1), // 5: ByteField - "SecurityMode"
3111 uint16(0x5678), // 6: Uint16Field - "TotalPriorityQueueNumber"
3112 byte(0x44), // 7: ByteField - "TotalTrafficSchedulerNumber"
3113 byte(1), // 8: ByteField - "Deprecated"
3114 uint16(0x55aa), // 9: Uint16Field - "TotalGemPortIdNumber"
3115 uint32(0xC4108011), // 10: Uint32Field - "Sysuptime"
3116 uint16(0x6), // 11: Uint16Field - "ConnectivityCapability"
3117 byte(6), // 12: ByteField - "CurrentConnectivityMode"
3118 uint16(2), // 13: Uint16Field - "QualityOfServiceQosConfigurationFlexibility"
3119 uint16(0x1234), // 14: Uint16Field - "PriorityQueueScaleFactor"
3120 }
3121 attributeData := make([]byte, 0)
3122
3123 // Walk through all attributes and encode them
3124 for _, value := range attributes {
3125 //attrDef, err := meDef.GetAttributeByIndex(index)
3126 var buf []byte
3127 u8, ok := value.(byte)
3128 if ok {
3129 buf = []byte{u8}
3130 } else {
3131 u16, ok := value.(uint16)
3132 if ok {
3133 buf = make([]byte, 2)
3134 binary.BigEndian.PutUint16(buf, u16)
3135 } else {
3136 u32, ok := value.(uint32)
3137 if ok {
3138 buf = make([]byte, 4)
3139 binary.BigEndian.PutUint32(buf, u32)
3140 } else {
3141 bytes, ok := value.([]byte)
3142 if ok {
3143 buf = bytes
3144 } else {
3145 assert.True(t, false) // Unknown attribute type
3146 }
3147 }
3148 }
3149 }
3150 attributeData = append(attributeData, buf...)
3151 }
3152 attributeMask := 0xfffc
3153 msgLength := len(attributeData) + 7
3154 // Results is 0 ("00"), and the two optional attribute masks are 0 ("00000000") as well
3155 goodMessage := "035e290b01010000" + fmt.Sprintf("%04x", msgLength) +
3156 "00" + fmt.Sprintf("%04x", attributeMask) + "00000000" + packetToString(attributeData)
3157
3158 data, err := stringToPacket(goodMessage)
3159 assert.NotNil(t, data)
3160 assert.Nil(t, err)
3161
3162 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3163 assert.NotNil(t, packet)
3164
3165 omciLayer := packet.Layer(LayerTypeOMCI)
3166 assert.NotNil(t, omciLayer)
3167
3168 omciMsg, ok := omciLayer.(*OMCI)
3169 assert.True(t, ok)
3170 assert.Equal(t, omciMsg.TransactionID, uint16(0x035e))
3171 assert.Equal(t, omciMsg.MessageType, GetResponseType)
3172 assert.Equal(t, omciMsg.DeviceIdentifier, ExtendedIdent)
3173 assert.Equal(t, omciMsg.Length, uint16(msgLength))
3174
3175 msgLayer := packet.Layer(LayerTypeGetResponse)
3176 assert.NotNil(t, msgLayer)
3177
3178 response, ok2 := msgLayer.(*GetResponse)
3179 assert.True(t, ok2)
3180 assert.NotNil(t, response)
3181 assert.Equal(t, response.Result, me.Success)
3182 assert.Equal(t, response.AttributeMask, uint16(attributeMask))
3183 assert.Equal(t, response.FailedAttributeMask, uint16(0))
3184 assert.Equal(t, response.UnsupportedAttributeMask, uint16(0))
3185
3186 assert.Equal(t, response.Attributes["EquipmentId"], toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="))
3187 assert.Equal(t, response.Attributes["OpticalNetworkUnitManagementAndControlChannelOmccVersion"], byte(0xb4)) // )
3188 assert.Equal(t, response.Attributes["VendorProductCode"], uint16(0x1234))
3189 assert.Equal(t, response.Attributes["SecurityCapability"], byte(1))
3190 assert.Equal(t, response.Attributes["SecurityMode"], byte(1))
3191 assert.Equal(t, response.Attributes["TotalPriorityQueueNumber"], uint16(0x5678))
3192 assert.Equal(t, response.Attributes["TotalTrafficSchedulerNumber"], byte(0x44))
3193 assert.Equal(t, response.Attributes["Deprecated"], byte(1))
3194 assert.Equal(t, response.Attributes["TotalGemPortIdNumber"], uint16(0x55aa))
3195 assert.Equal(t, response.Attributes["Sysuptime"], uint32(0xC4108011))
3196 assert.Equal(t, response.Attributes["ConnectivityCapability"], uint16(0x6))
3197 assert.Equal(t, response.Attributes["CurrentConnectivityMode"], byte(6))
3198 assert.Equal(t, response.Attributes["QualityOfServiceQosConfigurationFlexibility"], uint16(2))
3199 assert.Equal(t, response.Attributes["PriorityQueueScaleFactor"], uint16(0x1234))
3200
3201 // Verify string output for message
3202 packetString := packet.String()
3203 assert.NotZero(t, len(packetString))
3204}
3205
3206func TestExtendedGetResponseSerialize(t *testing.T) {
3207 goodMessage := "035e290b01010000003100fffc" +
3208 "000000000000000000000000000000000000000000000000" +
3209 "b4123401015678440155aac410801100060600021234"
3210
3211 omciLayer := &OMCI{
3212 TransactionID: 0x035e,
3213 MessageType: GetResponseType,
3214 DeviceIdentifier: ExtendedIdent,
3215 // Length parameter is optional for Extended message format serialization
3216 // and if present it will be overwritten during the serialization with the
3217 // actual value.
3218 }
3219 request := &GetResponse{
3220 MeBasePacket: MeBasePacket{
3221 EntityClass: me.Onu2GClassID,
3222 EntityInstance: uint16(0),
3223 Extended: true,
3224 },
3225 Result: 0,
3226 AttributeMask: uint16(0xfffc),
3227 Attributes: me.AttributeValueMap{
3228 "EquipmentId": toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
3229 "OpticalNetworkUnitManagementAndControlChannelOmccVersion": byte(0xb4),
3230 "VendorProductCode": uint16(0x1234),
3231 "SecurityCapability": byte(1),
3232 "SecurityMode": byte(1),
3233 "TotalPriorityQueueNumber": uint16(0x5678),
3234 "TotalTrafficSchedulerNumber": byte(0x44),
3235 "Deprecated": byte(1),
3236 "TotalGemPortIdNumber": uint16(0x55aa),
3237 "Sysuptime": uint32(0xC4108011),
3238 "ConnectivityCapability": uint16(0x6),
3239 "CurrentConnectivityMode": byte(6),
3240 "QualityOfServiceQosConfigurationFlexibility": uint16(2),
3241 "PriorityQueueScaleFactor": uint16(0x1234),
3242 },
3243 }
3244 // Test serialization back to former string
3245 var options gopacket.SerializeOptions
3246 options.FixLengths = true
3247
3248 buffer := gopacket.NewSerializeBuffer()
3249 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3250 assert.NoError(t, err)
3251
3252 outgoingPacket := buffer.Bytes()
3253 reconstituted := packetToString(outgoingPacket)
3254 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3255}
3256
Chip Bolingd8637b02021-04-29 08:36:38 -05003257func TestGenericTestResultDecode(t *testing.T) {
3258 // ONU-G ME for this test with just made up data
3259 payload := "1234567890123456789012345678901234567890123456789012345678901234"
3260 goodMessage := "00001b0a01000000" + payload + "00000028"
3261 data, err := stringToPacket(goodMessage)
3262 assert.NoError(t, err)
3263
3264 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3265 assert.NotNil(t, packet)
3266
3267 omciLayer := packet.Layer(LayerTypeOMCI)
3268 assert.NotNil(t, omciLayer)
3269
3270 omciMsg, ok := omciLayer.(*OMCI)
3271 assert.True(t, ok)
3272 assert.Equal(t, omciMsg.TransactionID, uint16(0x0000))
3273 assert.Equal(t, omciMsg.MessageType, TestResultType)
3274 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
3275 assert.Equal(t, uint16(40), omciMsg.Length)
3276
3277 msgLayer := packet.Layer(LayerTypeTestResult)
3278 assert.NotNil(t, msgLayer)
3279
3280 // This is a generic struct since we do not do detailed decode
3281 generic, ok2 := msgLayer.(*TestResultNotification)
3282 assert.True(t, ok2)
3283 assert.NotNil(t, generic)
3284 assert.NotNil(t, generic.MeBasePacket.Payload) // Next three all same data
3285 assert.NotNil(t, generic.Payload)
3286 assert.NotNil(t, generic.TestResults())
3287
3288 base := generic.MeBasePacket
3289 assert.Equal(t, me.OnuGClassID, base.EntityClass)
3290 assert.Equal(t, uint16(0), base.EntityInstance)
3291
3292 // For the generic Test Result, get the payload data which is all the data in
3293 // the test notification past the Entity Instance value.
3294 payloadData, payloadErr := stringToPacket(payload)
3295 assert.NotNil(t, payloadData)
3296 assert.NoError(t, payloadErr)
3297 assert.Equal(t, payloadData, base.Payload)
3298 assert.Equal(t, payloadData, generic.Payload)
3299
3300 // Verify string output for message
3301 packetString := packet.String()
3302 assert.NotZero(t, len(packetString))
3303}
3304
3305func TestOpticalLineSupervisionTestResultDecode(t *testing.T) {
3306 // ANI-G ME for this test with just made up data
3307 payload := "010034" + "030067" + "050091" + "090034" + "0c0067" + "8901" + "000000000000000000000000000000"
3308 goodMessage := "00001b0a01078001" + payload + "00000028"
3309 data, err := stringToPacket(goodMessage)
3310 assert.NoError(t, err)
3311
3312 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3313 assert.NotNil(t, packet)
3314
3315 omciLayer := packet.Layer(LayerTypeOMCI)
3316 assert.NotNil(t, omciLayer)
3317
3318 omciMsg, ok := omciLayer.(*OMCI)
3319 assert.True(t, ok)
3320 assert.Equal(t, omciMsg.TransactionID, uint16(0x0000))
3321 assert.Equal(t, omciMsg.MessageType, TestResultType)
3322 assert.Equal(t, omciMsg.DeviceIdentifier, BaselineIdent)
3323 assert.Equal(t, uint16(40), omciMsg.Length)
3324
3325 msgLayer := packet.Layer(LayerTypeTestResult)
3326 assert.NotNil(t, msgLayer)
3327
3328 // This is a optical line test results
3329 optical, ok2 := msgLayer.(*OpticalLineSupervisionTestResult)
3330 assert.True(t, ok2)
3331 assert.NotNil(t, optical)
3332
3333 // Get the Managed Entity class ID and instance ID from the base packet
3334 base := optical.MeBasePacket
3335 assert.Equal(t, me.AniGClassID, base.EntityClass)
3336 assert.Equal(t, uint16(0x8001), base.EntityInstance)
3337
3338 assert.Equal(t, uint8(1), optical.PowerFeedVoltageType)
3339 assert.Equal(t, uint16(0x34), optical.PowerFeedVoltage)
3340
3341 assert.Equal(t, uint8(3), optical.ReceivedOpticalPowerType)
3342 assert.Equal(t, uint16(0x67), optical.ReceivedOpticalPower)
3343
3344 assert.Equal(t, uint8(5), optical.MeanOpticalLaunchType)
3345 assert.Equal(t, uint16(0x91), optical.MeanOpticalLaunch)
3346
3347 assert.Equal(t, uint8(9), optical.LaserBiasCurrentType)
3348 assert.Equal(t, uint16(0x34), optical.LaserBiasCurrent)
3349
3350 assert.Equal(t, uint8(12), optical.TemperatureType)
3351 assert.Equal(t, uint16(0x67), optical.Temperature)
3352
3353 assert.Equal(t, uint16(0x8901), optical.GeneralPurposeBuffer)
3354
3355 // Verify string output for message
3356 packetString := packet.String()
3357 assert.NotZero(t, len(packetString))
3358}
3359
3360func TestGenericTestResultSerialize(t *testing.T) {
3361 payload := "1234567891234567890123456789012345678901234567890123456789012345"
3362 goodMessage := "00001b0a01000000" + payload + "00000028"
3363
3364 omciLayer := &OMCI{
3365 // TransactionID: 0x0c, // Optional for notifications since TID always 0x0000
3366 MessageType: TestResultType,
3367 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3368 // Length: 0x28, // Optional, defaults to 40 octets
3369 }
3370 data, derr := stringToPacket(payload)
3371 assert.NoError(t, derr)
3372
3373 request := &TestResultNotification{
3374 MeBasePacket: MeBasePacket{
3375 EntityClass: me.OnuGClassID,
3376 EntityInstance: uint16(0),
3377 },
3378 Payload: data,
3379 }
3380 // Test serialization back to former string
3381 var options gopacket.SerializeOptions
3382 options.FixLengths = true
3383
3384 buffer := gopacket.NewSerializeBuffer()
3385 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3386 assert.NoError(t, err)
3387
3388 outgoingPacket := buffer.Bytes()
3389 reconstituted := packetToString(outgoingPacket)
3390 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3391}
3392
3393func TestOpticalLineSupervisionTestResultSerialize(t *testing.T) {
3394 // ANI-G ME for this test with just made up data
3395 payload := "010034" + "030067" + "050091" + "090034" + "0c0067" + "8901" + "000000000000000000000000000000"
3396 goodMessage := "00001b0a01078001" + payload + "00000028"
3397
3398 omciLayer := &OMCI{
3399 // TransactionID: 0x0c, // Optional for notifications since TID always 0x0000
3400 MessageType: TestResultType,
3401 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3402 // Length: 0x28, // Optional, defaults to 40 octets
3403 }
3404 request := &OpticalLineSupervisionTestResult{
3405 MeBasePacket: MeBasePacket{
3406 EntityClass: me.AniGClassID,
3407 EntityInstance: uint16(0x8001),
3408 },
3409 PowerFeedVoltageType: uint8(1),
3410 PowerFeedVoltage: uint16(0x34),
3411 ReceivedOpticalPowerType: uint8(3),
3412 ReceivedOpticalPower: uint16(0x67),
3413 MeanOpticalLaunchType: uint8(5),
3414 MeanOpticalLaunch: uint16(0x91),
3415 LaserBiasCurrentType: uint8(9),
3416 LaserBiasCurrent: uint16(0x34),
3417 TemperatureType: uint8(12),
3418 Temperature: uint16(0x67),
3419 GeneralPurposeBuffer: uint16(0x8901),
3420 }
3421 // Test serialization back to former string
3422 var options gopacket.SerializeOptions
3423 options.FixLengths = true
3424
3425 buffer := gopacket.NewSerializeBuffer()
3426 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3427 assert.NoError(t, err)
3428
3429 outgoingPacket := buffer.Bytes()
3430 reconstituted := packetToString(outgoingPacket)
3431 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3432}
3433
3434func TestGenericTestRequestDecode(t *testing.T) {
3435 // ONU-G ME for this test with just made up data
3436 payload := "1234567890523456789012345678901234567890123456789012345678901234"
3437 goodMessage := "0123520a01000000" + payload + "00000028"
3438 data, err := stringToPacket(goodMessage)
3439 assert.NoError(t, err)
3440
3441 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3442 assert.NotNil(t, packet)
3443
3444 omciLayer := packet.Layer(LayerTypeOMCI)
3445 assert.NotNil(t, omciLayer)
3446
3447 omciMsg, ok := omciLayer.(*OMCI)
3448 assert.True(t, ok)
3449 assert.Equal(t, uint16(0x0123), omciMsg.TransactionID)
3450 assert.Equal(t, TestRequestType, omciMsg.MessageType)
3451 assert.Equal(t, BaselineIdent, omciMsg.DeviceIdentifier)
3452 assert.Equal(t, uint16(40), omciMsg.Length)
3453
3454 msgLayer := packet.Layer(LayerTypeTestResult)
3455 assert.NotNil(t, msgLayer)
3456
3457 // This is a generic struct since we do not do detailed decode
3458 generic, ok2 := msgLayer.(*TestRequest)
3459 assert.True(t, ok2)
3460 assert.NotNil(t, generic)
3461 assert.NotNil(t, generic.MeBasePacket.Payload) // Next three all same data
3462 assert.NotNil(t, generic.Payload)
3463 assert.NotNil(t, generic.TestRequest())
3464
3465 base := generic.MeBasePacket
3466 assert.Equal(t, me.OnuGClassID, base.EntityClass)
3467 assert.Equal(t, uint16(0), base.EntityInstance)
3468
3469 // For the generic Test Result, get the payload data which is all the data in
3470 // the test notification past the Entity Instance value.
3471 payloadData, payloadErr := stringToPacket(payload)
3472 assert.NotNil(t, payloadData)
3473 assert.NoError(t, payloadErr)
3474 assert.Equal(t, payloadData, base.Payload)
3475 assert.Equal(t, payloadData, generic.Payload)
3476
3477 // Verify string output for message
3478 packetString := packet.String()
3479 assert.NotZero(t, len(packetString))
3480}
3481
3482func TestOpticalLineSupervisionTestRequestDecode(t *testing.T) {
3483 // ANI-G ME for this test with just made up data
3484 payload := "01" + "1234" + "5678" + "000000000000000000000000000000000000000000000000000000"
3485 goodMessage := "0ddd520a01078001" + payload + "00000028"
3486 data, err := stringToPacket(goodMessage)
3487 assert.NoError(t, err)
3488
3489 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3490 assert.NotNil(t, packet)
3491
3492 omciLayer := packet.Layer(LayerTypeOMCI)
3493 assert.NotNil(t, omciLayer)
3494
3495 omciMsg, ok := omciLayer.(*OMCI)
3496 assert.True(t, ok)
3497 assert.Equal(t, uint16(0x0ddd), omciMsg.TransactionID)
3498 assert.Equal(t, TestRequestType, omciMsg.MessageType)
3499 assert.Equal(t, BaselineIdent, omciMsg.DeviceIdentifier)
3500 assert.Equal(t, uint16(40), omciMsg.Length)
3501
3502 msgLayer := packet.Layer(LayerTypeTestResult)
3503 assert.NotNil(t, msgLayer)
3504
3505 // This is a optical line test results
3506 optical, ok2 := msgLayer.(*OpticalLineSupervisionTestRequest)
3507 assert.True(t, ok2)
3508 assert.NotNil(t, optical)
3509
3510 // Get the Managed Entity class ID and instance ID from the base packet
3511 base := optical.MeBasePacket
3512 assert.Equal(t, me.AniGClassID, base.EntityClass)
3513 assert.Equal(t, uint16(0x8001), base.EntityInstance)
3514
3515 assert.Equal(t, uint8(1), optical.SelectTest)
3516 assert.Equal(t, uint16(0x1234), optical.GeneralPurposeBuffer)
3517 assert.Equal(t, uint16(0x5678), optical.VendorSpecificParameters)
3518
3519 // Verify string output for message
3520 packetString := packet.String()
3521 assert.NotZero(t, len(packetString))
3522}
3523
3524func TestGenericTestRequestSerialize(t *testing.T) {
3525 payload := "1234567891234567890123456789012345678901234567890123456789012345"
3526 goodMessage := "eeee520a01000000" + payload + "00000028"
3527
3528 omciLayer := &OMCI{
3529 TransactionID: 0xeeee,
3530 MessageType: TestRequestType,
3531 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3532 // Length: 0x28, // Optional, defaults to 40 octets
3533 }
3534 data, derr := stringToPacket(payload)
3535 assert.NoError(t, derr)
3536
3537 request := &TestRequest{
3538 MeBasePacket: MeBasePacket{
3539 EntityClass: me.OnuGClassID,
3540 EntityInstance: uint16(0),
3541 },
3542 Payload: data,
3543 }
3544 // Test serialization back to former string
3545 var options gopacket.SerializeOptions
3546 options.FixLengths = true
3547
3548 buffer := gopacket.NewSerializeBuffer()
3549 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3550 assert.NoError(t, err)
3551
3552 outgoingPacket := buffer.Bytes()
3553 reconstituted := packetToString(outgoingPacket)
3554 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3555}
3556
3557func TestOpticalLineSupervisionTestRequestSerialize(t *testing.T) {
3558 // ANI-G ME for this test with just made up data
3559 payload := "01" + "1234" + "5678" + "000000000000000000000000000000000000000000000000000000"
3560 goodMessage := "bbbb520a01078001" + payload + "00000028"
3561
3562 omciLayer := &OMCI{
3563 TransactionID: 0xbbbb,
3564 MessageType: TestRequestType,
3565 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3566 // Length: 0x28, // Optional, defaults to 40 octets
3567 }
3568 request := &OpticalLineSupervisionTestRequest{
3569 MeBasePacket: MeBasePacket{
3570 EntityClass: me.AniGClassID,
3571 EntityInstance: uint16(0x8001),
3572 },
3573 SelectTest: uint8(1),
3574 GeneralPurposeBuffer: uint16(0x1234),
3575 VendorSpecificParameters: uint16(0x5678),
3576 }
3577 // Test serialization back to former string
3578 var options gopacket.SerializeOptions
3579 options.FixLengths = true
3580
3581 buffer := gopacket.NewSerializeBuffer()
3582 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3583 assert.NoError(t, err)
3584
3585 outgoingPacket := buffer.Bytes()
3586 reconstituted := packetToString(outgoingPacket)
3587 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3588}
3589
3590func TestTestResponseDecode(t *testing.T) {
3591 goodMessage := "0001320A01000000000000000000000000000000000000000000000000000000000000000000000000000028"
3592 data, err := stringToPacket(goodMessage)
3593 assert.NoError(t, err)
3594
3595 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3596 assert.NotNil(t, packet)
3597
3598 omciLayer := packet.Layer(LayerTypeOMCI)
3599 assert.NotNil(t, omciLayer)
3600
3601 omciMsg, ok := omciLayer.(*OMCI)
3602 assert.True(t, ok)
3603 assert.Equal(t, TestResponseType, omciMsg.MessageType)
3604 assert.Equal(t, uint16(40), omciMsg.Length)
3605
3606 msgLayer := packet.Layer(LayerTypeTestResponse)
3607
3608 assert.NotNil(t, msgLayer)
3609
3610 response, ok2 := msgLayer.(*TestResponse)
3611 assert.True(t, ok2)
3612 assert.NotNil(t, response)
3613 assert.Equal(t, me.OnuGClassID, response.EntityClass)
3614 assert.Equal(t, uint16(0), response.EntityInstance)
3615 assert.Equal(t, me.Success, response.Result)
3616
3617 // Verify string output for message
3618 packetString := packet.String()
3619 assert.NotZero(t, len(packetString))
3620}
3621
3622func TestTestResponseSerialize(t *testing.T) {
3623 goodMessage := "0001320A01000000000000000000000000000000000000000000000000000000000000000000000000000028"
3624
3625 omciLayer := &OMCI{
3626 TransactionID: 0x01,
3627 MessageType: TestResponseType,
3628 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3629 // Length: 0x28, // Optional, defaults to 40 octets
3630 }
3631 request := &TestResponse{
3632 MeBasePacket: MeBasePacket{
3633 EntityClass: me.OnuGClassID,
3634 // Default Instance ID is 0
3635 },
3636 Result: me.Success,
3637 }
3638 // Test serialization back to former string
3639 var options gopacket.SerializeOptions
3640 options.FixLengths = true
3641
3642 buffer := gopacket.NewSerializeBuffer()
3643 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3644 assert.NoError(t, err)
3645
3646 outgoingPacket := buffer.Bytes()
3647 reconstituted := packetToString(outgoingPacket)
3648 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3649}
3650
Chip Boling157c9b92021-04-21 09:58:36 -05003651// TODO: Also remember to add extended message tests to the meframe_test.go
3652// unit tests as more message types are supported