X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=pkg%2Fteststube2ap%2FstubE2.go;h=d830aa7f15530946f9ab7aeceaf98374f2098961;hb=fbd4df5c352abde2ca4c0867f7471a0050242fdb;hp=5804f74ab9d7bd397875b68e7543ba5cef284ac7;hpb=cd78aeeae3212fa722be4ba9768cac711305badf;p=ric-plt%2Fsubmgr.git diff --git a/pkg/teststube2ap/stubE2.go b/pkg/teststube2ap/stubE2.go index 5804f74..d830aa7 100644 --- a/pkg/teststube2ap/stubE2.go +++ b/pkg/teststube2ap/stubE2.go @@ -23,7 +23,6 @@ import ( "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap" "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap_wrapper" "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststub" - "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/xapptweaks" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "strconv" "testing" @@ -43,7 +42,11 @@ type RmrTransactionId struct { } func (trans *RmrTransactionId) String() string { - return "trans(" + trans.xid + "/" + (&xapptweaks.RMRMeid{trans.meid}).String() + ")" + meidstr := "N/A" + if trans.meid != nil { + meidstr = trans.meid.String() + } + return "trans(" + trans.xid + "/" + meidstr + ")" } type E2Stub struct { @@ -85,7 +88,7 @@ func (tc *E2Stub) NewRmrTransactionId(xid string, ranname string) *RmrTransactio trans.xid = xid } trans.meid = &xapp.RMRMeid{RanName: ranname} - tc.Logger.Info("New test %s", trans.String()) + tc.Info("New test %s", trans.String()) return trans } @@ -106,77 +109,20 @@ func (p *E2StubSubsReqParams) Init() { // gnb -> enb outgoing // enb -> gnb incoming // X2 36423-f40.doc - p.Req.EventTriggerDefinition.NBX2EventTriggerDefinitionPresent = true - p.Req.EventTriggerDefinition.NBNRTEventTriggerDefinitionPresent = false - if p.Req.EventTriggerDefinition.NBX2EventTriggerDefinitionPresent == true { - p.Req.EventTriggerDefinition.InterfaceId.GlobalEnbId.Present = true - p.Req.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.Set("310150") - p.Req.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId.Id = 123 - p.Req.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId.Bits = e2ap.E2AP_ENBIDHomeBits28 - - p.Req.EventTriggerDefinition.InterfaceDirection = e2ap.E2AP_InterfaceDirectionIncoming - p.Req.EventTriggerDefinition.ProcedureCode = 5 //28 35 - p.Req.EventTriggerDefinition.TypeOfMessage = e2ap.E2AP_InitiatingMessage - } else if p.Req.EventTriggerDefinition.NBNRTEventTriggerDefinitionPresent == true { - p.Req.EventTriggerDefinition.NBNRTEventTriggerDefinition.TriggerNature = e2ap.NRTTriggerNature_now - } + p.Req.EventTriggerDefinition.Data.Length = 1 + p.Req.EventTriggerDefinition.Data.Data = make([]uint8, p.Req.EventTriggerDefinition.Data.Length) + p.Req.EventTriggerDefinition.Data.Data[0] = 1 p.Req.ActionSetups = make([]e2ap.ActionToBeSetupItem, 1) p.Req.ActionSetups[0].ActionId = 0 p.Req.ActionSetups[0].ActionType = e2ap.E2AP_ActionTypeReport p.Req.ActionSetups[0].RicActionDefinitionPresent = true - p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format1Present = false - p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format2Present = true - p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionNRTFormat1Present = false - - if p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format1Present { - p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format1.StyleID = 99 - // 1..255 - for index := 0; index < 1; index++ { - actionParameterItem := e2ap.ActionParameterItem{} - actionParameterItem.ParameterID = 11 - actionParameterItem.ActionParameterValue.ValueIntPresent = true - actionParameterItem.ActionParameterValue.ValueInt = 100 - p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format1.ActionParameterItems = - append(p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format1.ActionParameterItems, actionParameterItem) - } - } else if p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format2Present { - // 1..15 - for index := 0; index < 1; index++ { - ranUEgroupItem := e2ap.RANueGroupItem{} - // 1..255 - for index2 := 0; index2 < 1; index2++ { - ranUEGroupDefItem := e2ap.RANueGroupDefItem{} - ranUEGroupDefItem.RanParameterID = 22 - ranUEGroupDefItem.RanParameterTest = e2ap.RANParameterTest_equal - ranUEGroupDefItem.RanParameterValue.ValueIntPresent = true - ranUEGroupDefItem.RanParameterValue.ValueInt = 100 - ranUEgroupItem.RanUEgroupDefinition.RanUEGroupDefItems = append(ranUEgroupItem.RanUEgroupDefinition.RanUEGroupDefItems, ranUEGroupDefItem) - } - // 1..255 - for index3 := 0; index3 < 1; index3++ { - ranParameterItem := e2ap.RANParameterItem{} - ranParameterItem.RanParameterID = 33 - ranParameterItem.RanParameterValue.ValueIntPresent = true - ranParameterItem.RanParameterValue.ValueInt = 100 - ranUEgroupItem.RanPolicy.RanParameterItems = append(ranUEgroupItem.RanPolicy.RanParameterItems, ranParameterItem) - } - ranUEgroupItem.RanUEgroupID = 2 - p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format2.RanUEgroupItems = - append(p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionX2Format2.RanUEgroupItems, ranUEgroupItem) - } - } else if p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionNRTFormat1Present { - // 1..255 - for index := 0; index < 1; index++ { - ranParameterItem := e2ap.RANParameterItem{} - ranParameterItem.RanParameterID = 33 - ranParameterItem.RanParameterValue.ValueIntPresent = true - ranParameterItem.RanParameterValue.ValueInt = 100 - p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionNRTFormat1.RanParameterList = - append(p.Req.ActionSetups[0].ActionDefinitionChoice.ActionDefinitionNRTFormat1.RanParameterList, ranParameterItem) - } - } + + p.Req.ActionSetups[0].ActionDefinitionChoice.Data.Length = 1 + p.Req.ActionSetups[0].ActionDefinitionChoice.Data.Data = make([]uint8, p.Req.ActionSetups[0].ActionDefinitionChoice.Data.Length) + p.Req.ActionSetups[0].ActionDefinitionChoice.Data.Data[0] = 1 + p.Req.ActionSetups[0].SubsequentAction.Present = true p.Req.ActionSetups[0].SubsequentAction.Type = e2ap.E2AP_SubSeqActionTypeContinue p.Req.ActionSetups[0].SubsequentAction.TimetoWait = e2ap.E2AP_TimeToWaitZero @@ -229,7 +175,7 @@ func (tc *E2Stub) SendSubsReq(t *testing.T, rparams *E2StubSubsReqParams, oldTra trans = tc.NewRmrTransactionId("", "RAN_NAME_1") } - tc.Logger.Info("SendSubsReq %s", trans.String()) + tc.Info("SendSubsReq %s", trans.String()) e2SubsReq := e2asnpacker.NewPackerSubscriptionRequest() //--------------------------------- @@ -247,9 +193,9 @@ func (tc *E2Stub) SendSubsReq(t *testing.T, rparams *E2StubSubsReqParams, oldTra tc.TestError(t, "pack NOK %s %s", trans.String(), err.Error()) return nil } - tc.Logger.Debug("%s %s", trans.String(), e2SubsReq.String()) + tc.Debug("%s %s", trans.String(), e2SubsReq.String()) - params := xapptweaks.NewParams(nil) + params := &xapp.RMRParams{} params.Mtype = xapp.RIC_SUB_REQ params.SubId = -1 params.Payload = packedMsg.Buf @@ -258,8 +204,8 @@ func (tc *E2Stub) SendSubsReq(t *testing.T, rparams *E2StubSubsReqParams, oldTra params.Xid = trans.xid params.Mbuf = nil - tc.Logger.Info("SEND SUB REQ: %s", params.String()) - snderr := tc.RmrSend(params, 5) + tc.Info("SEND SUB REQ: %s", params.String()) + snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s %s", trans.String(), snderr.Error()) return nil @@ -270,8 +216,8 @@ func (tc *E2Stub) SendSubsReq(t *testing.T, rparams *E2StubSubsReqParams, oldTra //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- -func (tc *E2Stub) RecvSubsReq(t *testing.T) (*e2ap.E2APSubscriptionRequest, *xapptweaks.RMRParams) { - tc.Logger.Info("RecvSubsReq") +func (tc *E2Stub) RecvSubsReq(t *testing.T) (*e2ap.E2APSubscriptionRequest, *xapp.RMRParams) { + tc.Info("RecvSubsReq") e2SubsReq := e2asnpacker.NewPackerSubscriptionRequest() //--------------------------------- @@ -282,7 +228,7 @@ func (tc *E2Stub) RecvSubsReq(t *testing.T) (*e2ap.E2APSubscriptionRequest, *xap if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_REQ"] { tc.TestError(t, "Received wrong mtype expected %s got %s, error", "RIC_SUB_REQ", xapp.RicMessageTypeToName[msg.Mtype]) } else { - tc.Logger.Info("Recv Subs Req") + tc.Info("Recv Subs Req") packedData := &e2ap.PackedData{} packedData.Buf = msg.Payload unpackerr, req := e2SubsReq.UnPack(packedData) @@ -301,8 +247,8 @@ func (tc *E2Stub) RecvSubsReq(t *testing.T) (*e2ap.E2APSubscriptionRequest, *xap //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- -func (tc *E2Stub) SendSubsResp(t *testing.T, req *e2ap.E2APSubscriptionRequest, msg *xapptweaks.RMRParams) { - tc.Logger.Info("SendSubsResp") +func (tc *E2Stub) SendSubsResp(t *testing.T, req *e2ap.E2APSubscriptionRequest, msg *xapp.RMRParams) { + tc.Info("SendSubsResp") e2SubsResp := e2asnpacker.NewPackerSubscriptionResponse() //--------------------------------- @@ -331,9 +277,9 @@ func (tc *E2Stub) SendSubsResp(t *testing.T, req *e2ap.E2APSubscriptionRequest, if packerr != nil { tc.TestError(t, "pack NOK %s", packerr.Error()) } - tc.Logger.Debug("%s", e2SubsResp.String()) + tc.Debug("%s", e2SubsResp.String()) - params := xapptweaks.NewParams(nil) + params := &xapp.RMRParams{} params.Mtype = xapp.RIC_SUB_RESP //params.SubId = msg.SubId params.SubId = -1 @@ -343,8 +289,8 @@ func (tc *E2Stub) SendSubsResp(t *testing.T, req *e2ap.E2APSubscriptionRequest, //params.Xid = msg.Xid params.Mbuf = nil - tc.Logger.Info("SEND SUB RESP: %s", params.String()) - snderr := tc.RmrSend(params, 5) + tc.Info("SEND SUB RESP: %s", params.String()) + snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) } @@ -354,7 +300,7 @@ func (tc *E2Stub) SendSubsResp(t *testing.T, req *e2ap.E2APSubscriptionRequest, // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsResp(t *testing.T, trans *RmrTransactionId) uint32 { - tc.Logger.Info("RecvSubsResp") + tc.Info("RecvSubsResp") e2SubsResp := e2asnpacker.NewPackerSubscriptionResponse() var e2SubsId uint32 @@ -381,7 +327,7 @@ func (tc *E2Stub) RecvSubsResp(t *testing.T, trans *RmrTransactionId) uint32 { if unpackerr != nil { tc.TestError(t, "RIC_SUB_RESP unpack failed err: %s", unpackerr.Error()) } - tc.Logger.Info("Recv Subs Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) + tc.Info("Recv Subs Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) return e2SubsId } } else { @@ -394,8 +340,8 @@ func (tc *E2Stub) RecvSubsResp(t *testing.T, trans *RmrTransactionId) uint32 { // //----------------------------------------------------------------------------- -func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg *xapptweaks.RMRParams) { - tc.Logger.Info("SendSubsFail") +func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg *xapp.RMRParams) { + tc.Info("SendSubsFail") e2SubsFail := e2asnpacker.NewPackerSubscriptionFailure() //--------------------------------- @@ -405,9 +351,9 @@ func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg if packerr != nil { tc.TestError(t, "pack NOK %s", packerr.Error()) } - tc.Logger.Debug("%s", e2SubsFail.String()) + tc.Debug("%s", e2SubsFail.String()) - params := xapptweaks.NewParams(nil) + params := &xapp.RMRParams{} params.Mtype = xapp.RIC_SUB_FAILURE params.SubId = msg.SubId params.Payload = packedMsg.Buf @@ -416,8 +362,8 @@ func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg params.Xid = msg.Xid params.Mbuf = nil - tc.Logger.Info("SEND SUB FAIL: %s", params.String()) - snderr := tc.RmrSend(params, 5) + tc.Info("SEND SUB FAIL: %s", params.String()) + snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) } @@ -427,7 +373,7 @@ func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsFail(t *testing.T, trans *RmrTransactionId) uint32 { - tc.Logger.Info("RecvSubsFail") + tc.Info("RecvSubsFail") e2SubsFail := e2asnpacker.NewPackerSubscriptionFailure() var e2SubsId uint32 @@ -454,7 +400,7 @@ func (tc *E2Stub) RecvSubsFail(t *testing.T, trans *RmrTransactionId) uint32 { if unpackerr != nil { tc.TestError(t, "RIC_SUB_FAILURE unpack failed err: %s", unpackerr.Error()) } - tc.Logger.Info("Recv Subs Fail rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) + tc.Info("Recv Subs Fail rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) return e2SubsId } } else { @@ -473,7 +419,7 @@ func (tc *E2Stub) SendSubsDelReq(t *testing.T, oldTrans *RmrTransactionId, e2Sub trans = tc.NewRmrTransactionId("", "RAN_NAME_1") } - tc.Logger.Info("SendSubsDelReq %s", trans.String()) + tc.Info("SendSubsDelReq %s", trans.String()) e2SubsDelReq := e2asnpacker.NewPackerSubscriptionDeleteRequest() //--------------------------------- // xapp activity: Send Subs Del Req @@ -488,9 +434,9 @@ func (tc *E2Stub) SendSubsDelReq(t *testing.T, oldTrans *RmrTransactionId, e2Sub tc.TestError(t, "pack NOK %s %s", trans.String(), err.Error()) return nil } - tc.Logger.Debug("%s %s", trans.String(), e2SubsDelReq.String()) + tc.Debug("%s %s", trans.String(), e2SubsDelReq.String()) - params := xapptweaks.NewParams(nil) + params := &xapp.RMRParams{} params.Mtype = xapp.RIC_SUB_DEL_REQ params.SubId = int(e2SubsId) params.Payload = packedMsg.Buf @@ -499,8 +445,8 @@ func (tc *E2Stub) SendSubsDelReq(t *testing.T, oldTrans *RmrTransactionId, e2Sub params.Xid = trans.xid params.Mbuf = nil - tc.Logger.Info("SEND SUB DEL REQ: %s", params.String()) - snderr := tc.RmrSend(params, 5) + tc.Info("SEND SUB DEL REQ: %s", params.String()) + snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s %s", trans.String(), snderr.Error()) return nil @@ -511,8 +457,8 @@ func (tc *E2Stub) SendSubsDelReq(t *testing.T, oldTrans *RmrTransactionId, e2Sub //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- -func (tc *E2Stub) RecvSubsDelReq(t *testing.T) (*e2ap.E2APSubscriptionDeleteRequest, *xapptweaks.RMRParams) { - tc.Logger.Info("RecvSubsDelReq") +func (tc *E2Stub) RecvSubsDelReq(t *testing.T) (*e2ap.E2APSubscriptionDeleteRequest, *xapp.RMRParams) { + tc.Info("RecvSubsDelReq") e2SubsDelReq := e2asnpacker.NewPackerSubscriptionDeleteRequest() //--------------------------------- @@ -523,7 +469,7 @@ func (tc *E2Stub) RecvSubsDelReq(t *testing.T) (*e2ap.E2APSubscriptionDeleteRequ if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_DEL_REQ"] { tc.TestError(t, "Received wrong mtype expected %s got %s, error", "RIC_SUB_DEL_REQ", xapp.RicMessageTypeToName[msg.Mtype]) } else { - tc.Logger.Info("Recv Subs Del Req") + tc.Info("Recv Subs Del Req") packedData := &e2ap.PackedData{} packedData.Buf = msg.Payload @@ -542,8 +488,8 @@ func (tc *E2Stub) RecvSubsDelReq(t *testing.T) (*e2ap.E2APSubscriptionDeleteRequ //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- -func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDeleteRequest, msg *xapptweaks.RMRParams) { - tc.Logger.Info("SendSubsDelResp") +func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDeleteRequest, msg *xapp.RMRParams) { + tc.Info("SendSubsDelResp") e2SubsDelResp := e2asnpacker.NewPackerSubscriptionDeleteResponse() //--------------------------------- @@ -558,9 +504,9 @@ func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDelete if packerr != nil { tc.TestError(t, "pack NOK %s", packerr.Error()) } - tc.Logger.Debug("%s", e2SubsDelResp.String()) + tc.Debug("%s", e2SubsDelResp.String()) - params := xapptweaks.NewParams(nil) + params := &xapp.RMRParams{} params.Mtype = xapp.RIC_SUB_DEL_RESP params.SubId = msg.SubId params.Payload = packedMsg.Buf @@ -569,8 +515,8 @@ func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDelete params.Xid = msg.Xid params.Mbuf = nil - tc.Logger.Info("SEND SUB DEL RESP: %s", params.String()) - snderr := tc.RmrSend(params, 5) + tc.Info("SEND SUB DEL RESP: %s", params.String()) + snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) } @@ -580,7 +526,7 @@ func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDelete // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsDelResp(t *testing.T, trans *RmrTransactionId) { - tc.Logger.Info("RecvSubsDelResp") + tc.Info("RecvSubsDelResp") e2SubsDelResp := e2asnpacker.NewPackerSubscriptionDeleteResponse() //--------------------------------- @@ -601,7 +547,7 @@ func (tc *E2Stub) RecvSubsDelResp(t *testing.T, trans *RmrTransactionId) { if unpackerr != nil { tc.TestError(t, "RIC_SUB_DEL_RESP unpack failed err: %s", unpackerr.Error()) } - tc.Logger.Info("Recv Subs Del Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) + tc.Info("Recv Subs Del Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) return } } else { @@ -612,8 +558,8 @@ func (tc *E2Stub) RecvSubsDelResp(t *testing.T, trans *RmrTransactionId) { //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- -func (tc *E2Stub) SendSubsDelFail(t *testing.T, req *e2ap.E2APSubscriptionDeleteRequest, msg *xapptweaks.RMRParams) { - tc.Logger.Info("SendSubsDelFail") +func (tc *E2Stub) SendSubsDelFail(t *testing.T, req *e2ap.E2APSubscriptionDeleteRequest, msg *xapp.RMRParams) { + tc.Info("SendSubsDelFail") e2SubsDelFail := e2asnpacker.NewPackerSubscriptionDeleteFailure() //--------------------------------- @@ -630,9 +576,9 @@ func (tc *E2Stub) SendSubsDelFail(t *testing.T, req *e2ap.E2APSubscriptionDelete if packerr != nil { tc.TestError(t, "pack NOK %s", packerr.Error()) } - tc.Logger.Debug("%s", e2SubsDelFail.String()) + tc.Debug("%s", e2SubsDelFail.String()) - params := xapptweaks.NewParams(nil) + params := &xapp.RMRParams{} params.Mtype = xapp.RIC_SUB_DEL_FAILURE params.SubId = msg.SubId params.Payload = packedMsg.Buf @@ -641,8 +587,8 @@ func (tc *E2Stub) SendSubsDelFail(t *testing.T, req *e2ap.E2APSubscriptionDelete params.Xid = msg.Xid params.Mbuf = nil - tc.Logger.Info("SEND SUB DEL FAIL: %s", params.String()) - snderr := tc.RmrSend(params, 5) + tc.Info("SEND SUB DEL FAIL: %s", params.String()) + snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) }