blob: 514bc790cde66c7ea2cf3d024f469d4fe9ac7c2d [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)
274 assert.NotNil(t, packet)
275
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)
379 assert.NotNil(t, packet)
380
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)
439 assert.NotNil(t, packet)
440
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)
498 assert.NotNil(t, packet)
499
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)
558 assert.NotNil(t, packet)
559
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)
618 assert.NotNil(t, packet)
619
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)
688 assert.NotNil(t, packet)
689
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)
937 assert.NotNil(t, packet)
938
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)
997 assert.NotNil(t, packet)
998
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)
1058 assert.NotNil(t, packet)
1059
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)
1117 assert.NotNil(t, packet)
1118
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)
1203 assert.NotNil(t, packet)
1204
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)
1264 assert.NotNil(t, packet)
1265
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)
1323 assert.NotNil(t, packet)
1324
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)
1383 assert.NotNil(t, packet)
1384
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)
1510 assert.NotNil(t, packet)
1511
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)
1573 //assert.NotNil(t, packet)
1574 //
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)
1640 assert.NotNil(t, packet)
1641
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)
1679 assert.NotNil(t, packet)
1680
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)
1828 assert.NotNil(t, packet)
1829
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)
1894 assert.NotNil(t, packet)
1895
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)
1963 assert.NotNil(t, packet)
1964
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)
2027 //assert.NotNil(t, packet)
2028 //
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)
2087 //assert.NotNil(t, packet)
2088 //
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)
2147 assert.NotNil(t, packet)
2148
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)
2206 assert.NotNil(t, packet)
2207
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)
2268 assert.NotNil(t, packet)
2269
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)
2325 assert.NotNil(t, packet)
2326
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)
2394 assert.NotNil(t, packet)
2395
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)
2453 assert.NotNil(t, packet)
2454
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)
2515 assert.NotNil(t, packet)
2516
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)
2577 assert.NotNil(t, packet)
2578
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)
2642 assert.NotNil(t, packet)
2643
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)
2722 assert.NotNil(t, packet)
2723
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)
2777 assert.NotNil(t, packet)
2778
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)
2804 assert.NotNil(t, packet)
2805
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)
2840 assert.NotNil(t, packet)
2841
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)
2910 assert.NotNil(t, packet)
2911
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
2992 // occuring before this at during getResposne decoding.
2993 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 Boling6e27b352020-02-14 09:10:01 -06003003// TODO: Create notification tests for all of the following types
3004//TestResult,
Chip Boling2c046fa2021-02-23 11:30:29 -06003005
3006func TestJira3863(t *testing.T) {
3007 goodMessage := "81a9240a013880010700000000000000000000000000000000000000000000000000000000000000000000283f73ddea"
3008 data, err := stringToPacket(goodMessage)
3009 assert.NoError(t, err)
3010
3011 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3012 assert.NotNil(t, packet)
3013
3014 omciLayer := packet.Layer(LayerTypeOMCI)
3015 assert.NotNil(t, packet)
3016
3017 omciMsg, ok := omciLayer.(*OMCI)
3018 assert.True(t, ok)
3019 assert.NotNil(t, omciMsg)
3020
3021 msgLayer := packet.Layer(LayerTypeCreateResponse)
3022 assert.NotNil(t, msgLayer)
3023
3024 // FEC PM ME not in class map so the following was failing (ok2 false)
3025 response, ok2 := msgLayer.(*CreateResponse)
3026 assert.True(t, ok2)
3027 assert.NotNil(t, response)
3028
3029 // Verify string output for message
3030 packetString := packet.String()
3031 assert.NotZero(t, len(packetString))
3032}
Chip Boling157c9b92021-04-21 09:58:36 -05003033
3034func TestExtendedGetRequestDecode(t *testing.T) {
3035 //ONU-2G: 257
3036 goodMessage := "035e490b010100000002fffc"
3037 data, err := stringToPacket(goodMessage)
3038 assert.NoError(t, err)
3039
3040 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3041 assert.NotNil(t, packet)
3042
3043 omciLayer := packet.Layer(LayerTypeOMCI)
3044 assert.NotNil(t, packet)
3045
3046 omciMsg, ok := omciLayer.(*OMCI)
3047 assert.True(t, ok)
3048 assert.Equal(t, omciMsg.TransactionID, uint16(0x035e))
3049 assert.Equal(t, omciMsg.MessageType, GetRequestType)
3050 assert.Equal(t, omciMsg.DeviceIdentifier, ExtendedIdent)
3051 assert.Equal(t, omciMsg.Length, uint16(2))
3052
3053 msgLayer := packet.Layer(LayerTypeGetRequest)
3054 assert.NotNil(t, msgLayer)
3055
3056 request, ok2 := msgLayer.(*GetRequest)
3057 assert.True(t, ok2)
3058 assert.NotNil(t, request)
3059
3060 //ONU-2G: 257
3061 assert.Equal(t, me.Onu2GClassID, request.EntityClass)
3062 assert.Equal(t, uint16(0), request.EntityInstance)
3063 assert.Equal(t, uint16(0xfffc), request.AttributeMask)
3064
3065 // Verify string output for message
3066 packetString := packet.String()
3067 assert.NotZero(t, len(packetString))
3068}
3069
3070func TestExtendedGetRequestSerialize(t *testing.T) {
3071 goodMessage := "035e490b010100000002fffc"
3072
3073 omciLayer := &OMCI{
3074 TransactionID: 0x035e,
3075 MessageType: GetRequestType,
3076 DeviceIdentifier: ExtendedIdent,
3077 // Length parameter is optional for Extended message format serialization
3078 // and if present it will be overwritten during the serialization with the
3079 // actual value.
3080 }
3081 request := &GetRequest{
3082 MeBasePacket: MeBasePacket{
3083 EntityClass: me.Onu2GClassID,
3084 EntityInstance: uint16(0),
3085 Extended: true,
3086 },
3087 AttributeMask: uint16(0xfffc),
3088 }
3089 // Test serialization back to former string
3090 var options gopacket.SerializeOptions
3091 options.FixLengths = true
3092
3093 buffer := gopacket.NewSerializeBuffer()
3094 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3095 assert.NoError(t, err)
3096
3097 outgoingPacket := buffer.Bytes()
3098 reconstituted := packetToString(outgoingPacket)
3099 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3100}
3101
3102func TestExtendedGetResponseDecode(t *testing.T) {
3103 attrDef, omciErr := me.GetAttributesDefinitions(me.Onu2GClassID)
3104 assert.NotNil(t, attrDef)
3105 assert.NotNil(t, omciErr)
3106 assert.Equal(t, omciErr.StatusCode(), me.Success)
3107
3108 attributes := []interface{}{
3109 toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="), // 1: MultiByteField - "EquipmentId" (20 zeros)
3110 byte(0xb4), // 2: ByteField - "OpticalNetworkUnitManagementAndControlChannelOmccVersion"
3111 uint16(0x1234), // 3: Uint16Field - "VendorProductCode"
3112 byte(1), // 4: ByteField - "SecurityCapability"
3113 byte(1), // 5: ByteField - "SecurityMode"
3114 uint16(0x5678), // 6: Uint16Field - "TotalPriorityQueueNumber"
3115 byte(0x44), // 7: ByteField - "TotalTrafficSchedulerNumber"
3116 byte(1), // 8: ByteField - "Deprecated"
3117 uint16(0x55aa), // 9: Uint16Field - "TotalGemPortIdNumber"
3118 uint32(0xC4108011), // 10: Uint32Field - "Sysuptime"
3119 uint16(0x6), // 11: Uint16Field - "ConnectivityCapability"
3120 byte(6), // 12: ByteField - "CurrentConnectivityMode"
3121 uint16(2), // 13: Uint16Field - "QualityOfServiceQosConfigurationFlexibility"
3122 uint16(0x1234), // 14: Uint16Field - "PriorityQueueScaleFactor"
3123 }
3124 attributeData := make([]byte, 0)
3125
3126 // Walk through all attributes and encode them
3127 for _, value := range attributes {
3128 //attrDef, err := meDef.GetAttributeByIndex(index)
3129 var buf []byte
3130 u8, ok := value.(byte)
3131 if ok {
3132 buf = []byte{u8}
3133 } else {
3134 u16, ok := value.(uint16)
3135 if ok {
3136 buf = make([]byte, 2)
3137 binary.BigEndian.PutUint16(buf, u16)
3138 } else {
3139 u32, ok := value.(uint32)
3140 if ok {
3141 buf = make([]byte, 4)
3142 binary.BigEndian.PutUint32(buf, u32)
3143 } else {
3144 bytes, ok := value.([]byte)
3145 if ok {
3146 buf = bytes
3147 } else {
3148 assert.True(t, false) // Unknown attribute type
3149 }
3150 }
3151 }
3152 }
3153 attributeData = append(attributeData, buf...)
3154 }
3155 attributeMask := 0xfffc
3156 msgLength := len(attributeData) + 7
3157 // Results is 0 ("00"), and the two optional attribute masks are 0 ("00000000") as well
3158 goodMessage := "035e290b01010000" + fmt.Sprintf("%04x", msgLength) +
3159 "00" + fmt.Sprintf("%04x", attributeMask) + "00000000" + packetToString(attributeData)
3160
3161 data, err := stringToPacket(goodMessage)
3162 assert.NotNil(t, data)
3163 assert.Nil(t, err)
3164
3165 packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
3166 assert.NotNil(t, packet)
3167
3168 omciLayer := packet.Layer(LayerTypeOMCI)
3169 assert.NotNil(t, omciLayer)
3170
3171 omciMsg, ok := omciLayer.(*OMCI)
3172 assert.True(t, ok)
3173 assert.Equal(t, omciMsg.TransactionID, uint16(0x035e))
3174 assert.Equal(t, omciMsg.MessageType, GetResponseType)
3175 assert.Equal(t, omciMsg.DeviceIdentifier, ExtendedIdent)
3176 assert.Equal(t, omciMsg.Length, uint16(msgLength))
3177
3178 msgLayer := packet.Layer(LayerTypeGetResponse)
3179 assert.NotNil(t, msgLayer)
3180
3181 response, ok2 := msgLayer.(*GetResponse)
3182 assert.True(t, ok2)
3183 assert.NotNil(t, response)
3184 assert.Equal(t, response.Result, me.Success)
3185 assert.Equal(t, response.AttributeMask, uint16(attributeMask))
3186 assert.Equal(t, response.FailedAttributeMask, uint16(0))
3187 assert.Equal(t, response.UnsupportedAttributeMask, uint16(0))
3188
3189 assert.Equal(t, response.Attributes["EquipmentId"], toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="))
3190 assert.Equal(t, response.Attributes["OpticalNetworkUnitManagementAndControlChannelOmccVersion"], byte(0xb4)) // )
3191 assert.Equal(t, response.Attributes["VendorProductCode"], uint16(0x1234))
3192 assert.Equal(t, response.Attributes["SecurityCapability"], byte(1))
3193 assert.Equal(t, response.Attributes["SecurityMode"], byte(1))
3194 assert.Equal(t, response.Attributes["TotalPriorityQueueNumber"], uint16(0x5678))
3195 assert.Equal(t, response.Attributes["TotalTrafficSchedulerNumber"], byte(0x44))
3196 assert.Equal(t, response.Attributes["Deprecated"], byte(1))
3197 assert.Equal(t, response.Attributes["TotalGemPortIdNumber"], uint16(0x55aa))
3198 assert.Equal(t, response.Attributes["Sysuptime"], uint32(0xC4108011))
3199 assert.Equal(t, response.Attributes["ConnectivityCapability"], uint16(0x6))
3200 assert.Equal(t, response.Attributes["CurrentConnectivityMode"], byte(6))
3201 assert.Equal(t, response.Attributes["QualityOfServiceQosConfigurationFlexibility"], uint16(2))
3202 assert.Equal(t, response.Attributes["PriorityQueueScaleFactor"], uint16(0x1234))
3203
3204 // Verify string output for message
3205 packetString := packet.String()
3206 assert.NotZero(t, len(packetString))
3207}
3208
3209func TestExtendedGetResponseSerialize(t *testing.T) {
3210 goodMessage := "035e290b01010000003100fffc" +
3211 "000000000000000000000000000000000000000000000000" +
3212 "b4123401015678440155aac410801100060600021234"
3213
3214 omciLayer := &OMCI{
3215 TransactionID: 0x035e,
3216 MessageType: GetResponseType,
3217 DeviceIdentifier: ExtendedIdent,
3218 // Length parameter is optional for Extended message format serialization
3219 // and if present it will be overwritten during the serialization with the
3220 // actual value.
3221 }
3222 request := &GetResponse{
3223 MeBasePacket: MeBasePacket{
3224 EntityClass: me.Onu2GClassID,
3225 EntityInstance: uint16(0),
3226 Extended: true,
3227 },
3228 Result: 0,
3229 AttributeMask: uint16(0xfffc),
3230 Attributes: me.AttributeValueMap{
3231 "EquipmentId": toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
3232 "OpticalNetworkUnitManagementAndControlChannelOmccVersion": byte(0xb4),
3233 "VendorProductCode": uint16(0x1234),
3234 "SecurityCapability": byte(1),
3235 "SecurityMode": byte(1),
3236 "TotalPriorityQueueNumber": uint16(0x5678),
3237 "TotalTrafficSchedulerNumber": byte(0x44),
3238 "Deprecated": byte(1),
3239 "TotalGemPortIdNumber": uint16(0x55aa),
3240 "Sysuptime": uint32(0xC4108011),
3241 "ConnectivityCapability": uint16(0x6),
3242 "CurrentConnectivityMode": byte(6),
3243 "QualityOfServiceQosConfigurationFlexibility": uint16(2),
3244 "PriorityQueueScaleFactor": uint16(0x1234),
3245 },
3246 }
3247 // Test serialization back to former string
3248 var options gopacket.SerializeOptions
3249 options.FixLengths = true
3250
3251 buffer := gopacket.NewSerializeBuffer()
3252 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3253 assert.NoError(t, err)
3254
3255 outgoingPacket := buffer.Bytes()
3256 reconstituted := packetToString(outgoingPacket)
3257 assert.Equal(t, strings.ToLower(goodMessage), reconstituted)
3258}
3259
3260// TODO: Also remember to add extended message tests to the meframe_test.go
3261// unit tests as more message types are supported