VOL-4028: Add support for ANI-G Test Response and Result

Change-Id: Iae61554c426937a4ce5e78a0499195f6c3975b78
diff --git a/internal/common/omci/test.go b/internal/common/omci/test.go
index 40398ba..1285203 100644
--- a/internal/common/omci/test.go
+++ b/internal/common/omci/test.go
@@ -18,18 +18,22 @@
 
 import (
 	"errors"
+	"fmt"
 	"github.com/google/gopacket"
 	"github.com/opencord/omci-lib-go"
+	me "github.com/opencord/omci-lib-go/generated"
+	log "github.com/sirupsen/logrus"
+	"math/rand"
 )
 
-func ParseTestRequest(omciPkt gopacket.Packet) (*omci.TestRequest, error) {
-	msgLayer := omciPkt.Layer(omci.LayerTypeGetRequest)
+func ParseOpticalLineSupervisionRequest(omciPkt gopacket.Packet) (*omci.OpticalLineSupervisionTestRequest, error) {
+	msgLayer := omciPkt.Layer(omci.LayerTypeTestRequest)
 	if msgLayer == nil {
 		err := "omci Msg layer could not be detected for LayerTypeTestRequest"
 		omciLogger.Error(err)
 		return nil, errors.New(err)
 	}
-	msgObj, msgOk := msgLayer.(*omci.TestRequest)
+	msgObj, msgOk := msgLayer.(*omci.OpticalLineSupervisionTestRequest)
 	if !msgOk {
 		err := "omci Msg layer could not be assigned for LayerTypeTestRequest"
 		omciLogger.Error(err)
@@ -38,58 +42,71 @@
 	return msgObj, nil
 }
 
-// Return true if msg is an Omci Test Request
-func IsTestRequest(payload []byte) (bool, error) {
-	_, omciMsg, err := ParseOpenOltOmciPacket(payload)
+func CreateTestResponse(omciPkt gopacket.Packet, omciMsg *omci.OMCI) ([]byte, error, me.ClassID, uint16, me.Results) {
+	// TODO: currently supports only OpticalLineSupervisionRequest
+	optSupReq, err := ParseOpticalLineSupervisionRequest(omciPkt)
+
 	if err != nil {
-		return false, err
+		return nil, err, 0, 0, me.ParameterError
 	}
 
-	return omciMsg.MessageType == omci.TestRequestType, nil
+	omciLogger.WithFields(log.Fields{
+		"EntityClass":    optSupReq.EntityClass,
+		"EntityInstance": optSupReq.EntityInstance,
+	}).Trace("received-test-request")
+
+	omciResult := me.Success
+	response := &omci.TestResponse{
+		MeBasePacket: omci.MeBasePacket{
+			EntityClass:    optSupReq.EntityClass,
+			EntityInstance: optSupReq.EntityInstance,
+		},
+		Result: omciResult,
+	}
+
+	pkt, err := Serialize(omci.TestResponseType, response, omciMsg.TransactionID)
+	if err != nil {
+		omciLogger.WithFields(log.Fields{
+			"Err": err,
+		}).Error("cannot-Serialize-test-response")
+		return nil, err, 0, 0, me.ParameterError
+	}
+
+	return pkt, nil, optSupReq.EntityClass, optSupReq.EntityInstance, omciResult
+
 }
 
-func BuildTestResult(payload []byte) ([]byte, error) {
-
-	omciPkt, omciMsg, err := ParseOpenOltOmciPacket(payload)
-
-	//transactionId, deviceId, _, class, instance, _, err := omcisim.ParsePkt(payload)
-
-	if err != nil {
-		return []byte{}, err
+func CreateTestResult(classID me.ClassID, instID uint16, tid uint16) ([]byte, error) {
+	var result gopacket.SerializableLayer
+	switch classID {
+	case me.AniGClassID:
+		result = &omci.OpticalLineSupervisionTestResult{
+			MeBasePacket: omci.MeBasePacket{
+				EntityClass:    classID,
+				EntityInstance: instID,
+			},
+			PowerFeedVoltageType:     uint8(1),
+			PowerFeedVoltage:         uint16(163),
+			ReceivedOpticalPowerType: uint8(3),
+			ReceivedOpticalPower:     uint16(rand.Intn(65000)),
+			MeanOpticalLaunchType:    uint8(5),
+			MeanOpticalLaunch:        uint16(rand.Intn(3000)),
+			LaserBiasCurrentType:     uint8(9),
+			LaserBiasCurrent:         uint16(rand.Intn(10000)),
+			TemperatureType:          uint8(12),
+			Temperature:              uint16(rand.Intn(20000)),
+			GeneralPurposeBuffer:     uint16(0),
+		}
+	default:
+		return nil, fmt.Errorf("unsupported-class-id-for-test-result--class-id-%v", classID)
 	}
 
-	testRequest, err := ParseTestRequest(omciPkt)
+	pkt, err := Serialize(omci.TestResultType, result, tid)
 	if err != nil {
-		return []byte{}, err
+		omciLogger.WithFields(log.Fields{
+			"Err": err,
+		}).Error("cannot-Serialize-test-result")
+		return nil, err
 	}
-
-	// TODO create a TestResponse using omci-lib-go
-	resp := make([]byte, 48)
-	resp[0] = byte(omciMsg.TransactionID >> 8)
-	resp[1] = byte(omciMsg.TransactionID & 0xFF)
-	resp[2] = 27 // Upper nibble 0x0 is fixed (0000), Lower nibbles defines msg type (TestResult=27)
-	resp[3] = byte(omciMsg.DeviceIdentifier)
-	resp[4] = byte(omciMsg.MessageType)
-	resp[5] = byte(omciMsg.MessageType & 0xFF)
-	resp[6] = byte(testRequest.EntityInstance >> 8)
-	resp[7] = byte(testRequest.EntityInstance & 0xFF)
-	// Each of these is a 1-byte code
-	// follow by a 2-byte (high, low) value
-	resp[8] = 1 // power feed voltage
-	resp[9] = 0
-	resp[10] = 123 // 123 mV, 20 mv res --> 6mv
-	resp[11] = 3   // received optical power
-	resp[12] = 1
-	resp[13] = 200 // 456 decibel-microwatts, 0.002 dB res --> 0.912 db-mw
-	resp[14] = 5   // mean optical launch power
-	resp[15] = 3
-	resp[16] = 21 // 789 uA, 0.002 dB res --> 1.578 db-mw
-	resp[17] = 9  // laser bias current
-	resp[18] = 3
-	resp[19] = 244 // 1012 uA, 2uA res --> 505 ua
-	resp[20] = 12  // temperature
-	resp[21] = 38
-	resp[22] = 148 // 9876 deg C, 1/256 resolution --> 38.57 Deg C
-
-	return resp, nil
+	return pkt, nil
 }