[VOL-4437] Adding support for unkown attributes

Change-Id: I54b1fbefdb75ca3ec4abfc83b57b232d07c76873
diff --git a/internal/common/omci/mib_test.go b/internal/common/omci/mib_test.go
index 9578416..2214f2e 100644
--- a/internal/common/omci/mib_test.go
+++ b/internal/common/omci/mib_test.go
@@ -17,6 +17,8 @@
 package omci
 
 import (
+	"encoding/binary"
+	"reflect"
 	"testing"
 
 	"github.com/google/gopacket"
@@ -45,6 +47,16 @@
 	assert.Equal(t, msgObj.Result, me.Success)
 }
 
+func TestSetTxIdInEncodedPacket(t *testing.T) {
+	basePkt := []byte{129, 42, 46, 10, 0, 2, 0, 0, 0, 37, 0, 1, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, 40, 40, 206, 0, 226}
+	res := SetTxIdInEncodedPacket(basePkt, uint16(292))
+	assert.Equal(t, len(basePkt), len(res))
+
+	b := res[0:2]
+	txId := binary.BigEndian.Uint16(b)
+	assert.Equal(t, uint16(292), txId)
+}
+
 // types for TestCreateMibUploadNextResponse test
 type mibArgs struct {
 	omciPkt gopacket.Packet
@@ -92,6 +104,7 @@
 		me.OnuDataClassID,
 		onuDataEntityId,
 		me.AttributeValueMap{me.OnuData_MibDataSync: 0},
+		nil,
 	})
 
 	mibDb.items = append(mibDb.items, MibDbEntry{
@@ -103,6 +116,7 @@
 			me.CircuitPack_SerialNumber:  ToOctets("BBSM-Circuit-Pack", 20),
 			me.CircuitPack_Version:       ToOctets("v0.0.1", 20),
 		},
+		nil,
 	})
 
 	mibDb.items = append(mibDb.items, MibDbEntry{
@@ -126,6 +140,7 @@
 			me.AniG_UpperOpticalThreshold:       255,
 			me.AniG_UpperTransmitPowerThreshold: 129,
 		},
+		nil,
 	})
 
 	mibDb.items = append(mibDb.items, MibDbEntry{
@@ -142,6 +157,17 @@
 			me.Onu2G_TotalPriorityQueueNumber:                    64,
 			me.Onu2G_TotalTrafficSchedulerNumber:                 8,
 		},
+		nil,
+	})
+
+	// create an entry with UnkownAttributes set
+	var customPktTxId uint16 = 5
+	customPkt := []byte{0, byte(customPktTxId), 46, 10, 0, 2, 0, 0, 0, 37, 0, 1, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, 40, 40, 206, 0, 226}
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.ClassID(37),
+		nil,
+		me.AttributeValueMap{},
+		customPkt,
 	})
 
 	tests := []struct {
@@ -157,6 +183,8 @@
 			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 3, entityID: anigEntityId.ToUint16(), entityClass: me.AniGClassID, attributes: map[string]interface{}{me.AniG_GemBlockLength: uint16(48)}}},
 		{"mibUploadNext-3", createTestMibUploadNextArgs(t, 4, 3),
 			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 4, entityID: onuDataEntityId.ToUint16(), entityClass: me.Onu2GClassID, attributes: map[string]interface{}{me.Onu2G_TotalPriorityQueueNumber: uint16(64)}}},
+		{"mibUploadNext-unknown-attrs", createTestMibUploadNextArgs(t, 5, 4),
+			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: customPktTxId, entityID: 1, entityClass: me.ClassID(37), attributes: map[string]interface{}{"UnknownAttr_1": []uint8{1}}}},
 	}
 
 	for _, tt := range tests {
@@ -182,7 +210,15 @@
 			for k, v := range tt.want.attributes {
 				attr, err := msgObj.ReportedME.GetAttribute(k)
 				assert.NilError(t, err)
-				assert.Equal(t, attr, v)
+				if isSlice(attr) {
+					expected := v.([]uint8)
+					data := attr.([]uint8)
+					for i, val := range data {
+						assert.Equal(t, expected[i], val)
+					}
+				} else {
+					assert.Equal(t, attr, v)
+				}
 			}
 		})
 	}
@@ -192,3 +228,7 @@
 	_, err := CreateMibUploadNextResponse(args.omciPkt, args.omciMsg, MDS, &mibDb)
 	assert.Error(t, err, "mibdb-does-not-contain-item")
 }
+
+func isSlice(v interface{}) bool {
+	return reflect.TypeOf(v).Kind() == reflect.Slice
+}