Merge "[VOL-3986] Correctly serializing GemPortNetworkCtpPerformanceMonitoringHistoryData ME in GetResponse"
diff --git a/internal/common/omci/get.go b/internal/common/omci/get.go
index 67a65ff..384fc0b 100644
--- a/internal/common/omci/get.go
+++ b/internal/common/omci/get.go
@@ -101,7 +101,7 @@
 		omciLogger.WithFields(log.Fields{
 			"Err":  err,
 			"TxID": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
-		}).Error("cannot-Serialize-Onu2gResponse")
+		}).Error("cannot-Serialize-GetResponse")
 		return nil, err
 	}
 
@@ -369,21 +369,6 @@
 		return nil
 	}
 
-	// L2 PM counters MEs exceed max allowed OMCI payload size.
-	// So the request/responses are always multipart.
-	// First identify the attributes that are not requested in the current GET request.
-	// Then filter out those attributes from the responses in the current GET response.
-	unwantedAttributeMask := ^attributeMask
-	var i uint16
-	for i = 1; i <= 16; i++ { // 1 and 16 because they are allowed valid min and max index keys in AttributeValueMap.
-		// We leave out 0 because that is ManagedEntity and that is a default IE in the map
-		if (1<<(16-i))&unwantedAttributeMask > 0 {
-			if err := managedEntity.DeleteAttributeByIndex(uint(i)); err != nil {
-				omciLogger.Errorf("error deleting attribute at index=%v, err=%v", i, err)
-			}
-		}
-	}
-
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.EthernetFramePerformanceMonitoringHistoryDataUpstreamClassID,
@@ -424,21 +409,6 @@
 		return nil
 	}
 
-	// L2 PM counters MEs exceed max allowed OMCI payload size.
-	// So the request/responses are always multipart.
-	// First identify the attributes that are not requested in the current GET request.
-	// Then filter out those attributes from the responses in the current GET response.
-	unwantedAttributeMask := ^attributeMask
-	var i uint16
-	for i = 1; i <= 16; i++ { // 1 and 16 because they are allowed valid min and max index keys in AttributeValueMap.
-		// We leave out 0 because that is ManagedEntity and that is a default IE in the map
-		if (1<<(16-i))&unwantedAttributeMask > 0 {
-			if err := managedEntity.DeleteAttributeByIndex(uint(i)); err != nil {
-				omciLogger.Errorf("error deleting attribute at index=%v, err=%v", i, err)
-			}
-		}
-	}
-
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.EthernetFramePerformanceMonitoringHistoryDataDownstreamClassID,
@@ -479,21 +449,6 @@
 		return nil
 	}
 
-	// L2 PM counters MEs exceed max allowed OMCI payload size.
-	// So the request/responses are always multipart.
-	// First identify the attributes that are not requested in the current GET request.
-	// Then filter out those attributes from the responses in the current GET response.
-	unwantedAttributeMask := ^attributeMask
-	var i uint16
-	for i = 1; i <= 16; i++ { // 1 and 16 because they are allowed valid min and max index keys in AttributeValueMap.
-		// We leave out 0 because that is ManagedEntity and that is a default IE in the map
-		if (1<<(16-i))&unwantedAttributeMask > 0 {
-			if err := managedEntity.DeleteAttributeByIndex(uint(i)); err != nil {
-				omciLogger.Errorf("error deleting attribute at index=%v, err=%v", i, err)
-			}
-		}
-	}
-
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.EthernetPerformanceMonitoringHistoryDataClassID,
@@ -559,21 +514,6 @@
 		return nil
 	}
 
-	// L2 PM counters MEs exceed max allowed OMCI payload size.
-	// So the request/responses are always multipart.
-	// First identify the attributes that are not requested in the current GET request.
-	// Then filter out those attributes from the responses in the current GET response.
-	unwantedAttributeMask := ^attributeMask
-	var i uint16
-	for i = 1; i <= 7; i++ { // 1 and 7 because they are allowed valid min and max index keys in AttributeValueMap.
-		// We leave out 0 because that is ManagedEntity and that is a default IE in the map
-		if (1<<(7-i))&unwantedAttributeMask > 0 {
-			if err := managedEntity.DeleteAttributeByIndex(uint(i)); err != nil {
-				omciLogger.Errorf("error deleting attribute at index=%v, err=%v", i, err)
-			}
-		}
-	}
-
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.GemPortNetworkCtpPerformanceMonitoringHistoryDataClassID,
diff --git a/internal/common/omci/get_test.go b/internal/common/omci/get_test.go
index d995bba..0d9663f 100644
--- a/internal/common/omci/get_test.go
+++ b/internal/common/omci/get_test.go
@@ -92,11 +92,30 @@
 			getArgs{createOnuDataResponse(32768, 10, 129), 2},
 			getWant{2, map[string]interface{}{"MibDataSync": uint8(129)}},
 		},
+		{"getGemPortNetworkCtpPerformanceMonitoringHistoryDataResponse",
+			getArgs{createGemPortNetworkCtpPerformanceMonitoringHistoryData(32768, 10), 2},
+			getWant{2, map[string]interface{}{"ManagedEntityId": uint16(10)}},
+		},
+		{"getEthernetFramePerformanceMonitoringHistoryDataUpstreamResponse",
+			getArgs{createEthernetFramePerformanceMonitoringHistoryDataUpstreamResponse(32768, 10), 2},
+			getWant{2, map[string]interface{}{"ManagedEntityId": uint16(10)}},
+		},
+		{"getEthernetFramePerformanceMonitoringHistoryDataDownstreamResponse",
+			getArgs{createEthernetFramePerformanceMonitoringHistoryDataDownstreamResponse(32768, 10), 2},
+			getWant{2, map[string]interface{}{"ManagedEntityId": uint16(10)}},
+		},
+		{"getEthernetPerformanceMonitoringHistoryDataResponse",
+			getArgs{createEthernetPerformanceMonitoringHistoryDataResponse(32768, 10), 2},
+			getWant{2, map[string]interface{}{"ManagedEntityId": uint16(10)}},
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 
-			data, _ := Serialize(omci.GetResponseType, tt.args.generatedPkt, tt.args.transactionId)
+			data, err := Serialize(omci.GetResponseType, tt.args.generatedPkt, tt.args.transactionId)
+			if err != nil {
+				t.Fatal("cannot-serial-omci-packet", err)
+			}
 
 			// emulate the openonu-go behavior:
 			// omci_cc.receiveMessage process the message (creates a gopacket and extracts the OMCI layer) and invokes a callback