Add support for string types
[govpp.git] / adapter / mock / mock_adapter.go
index 3f5686f..9783651 100644 (file)
@@ -37,7 +37,7 @@ const (
        useReplyHandlers           // use reply handler
 )
 
-// VppAdapter represents a mock VPP adapter that can be used for unit/integration testing instead of the vppapiclient adapter.
+// VppAPI represents a mock VPP adapter that can be used for unit/integration testing instead of the vppapiclient adapter.
 type VppAdapter struct {
        callback adapter.MsgCallback
 
@@ -90,8 +90,15 @@ const (
 )
 
 // NewVppAdapter returns a new mock adapter.
-func NewVppAdapter() adapter.VppAdapter {
-       return &VppAdapter{}
+func NewVppAdapter() *VppAdapter {
+       a := &VppAdapter{
+               msgIDSeq:     1000,
+               msgIDsToName: make(map[uint16]string),
+               msgNameToIds: make(map[string]uint16),
+               binAPITypes:  make(map[string]reflect.Type),
+       }
+       a.registerBinAPITypes()
+       return a
 }
 
 // Connect emulates connecting the process to VPP.
@@ -100,8 +107,8 @@ func (a *VppAdapter) Connect() error {
 }
 
 // Disconnect emulates disconnecting the process from VPP.
-func (a *VppAdapter) Disconnect() {
-       // no op
+func (a *VppAdapter) Disconnect() error {
+       return nil
 }
 
 // GetMsgNameByID returns message name for specified message ID.
@@ -119,21 +126,16 @@ func (a *VppAdapter) GetMsgNameByID(msgID uint16) (string, bool) {
 
        a.access.Lock()
        defer a.access.Unlock()
-       a.initMaps()
        msgName, found := a.msgIDsToName[msgID]
 
        return msgName, found
 }
 
-// RegisterBinAPITypes registers binary API message types in the mock adapter.
-func (a *VppAdapter) RegisterBinAPITypes(binAPITypes map[string]reflect.Type) {
+func (a *VppAdapter) registerBinAPITypes() {
        a.access.Lock()
        defer a.access.Unlock()
-       a.initMaps()
-       for _, v := range binAPITypes {
-               if msg, ok := reflect.New(v).Interface().(api.Message); ok {
-                       a.binAPITypes[msg.GetMessageName()] = v
-               }
+       for _, msg := range api.GetAllMessages() {
+               a.binAPITypes[msg.GetMessageName()] = reflect.TypeOf(msg).Elem()
        }
 }
 
@@ -177,8 +179,16 @@ func (a *VppAdapter) ReplyBytes(request MessageDTO, reply api.Message) ([]byte,
        log.Println("ReplyBytes ", replyMsgID, " ", reply.GetMessageName(), " clientId: ", request.ClientID)
 
        buf := new(bytes.Buffer)
-       struc.Pack(buf, &codec.VppReplyHeader{VlMsgID: replyMsgID, Context: request.ClientID})
-       struc.Pack(buf, reply)
+       err = struc.Pack(buf, &codec.VppReplyHeader{
+               VlMsgID: replyMsgID,
+               Context: request.ClientID,
+       })
+       if err != nil {
+               return nil, err
+       }
+       if err = struc.Pack(buf, reply); err != nil {
+               return nil, err
+       }
 
        return buf.Bytes(), nil
 }
@@ -198,7 +208,6 @@ func (a *VppAdapter) GetMsgID(msgName string, msgCrc string) (uint16, error) {
 
        a.access.Lock()
        defer a.access.Unlock()
-       a.initMaps()
 
        msgID, found := a.msgNameToIds[msgName]
        if found {
@@ -213,24 +222,10 @@ func (a *VppAdapter) GetMsgID(msgName string, msgCrc string) (uint16, error) {
        return msgID, nil
 }
 
-// initMaps initializes internal maps (if not already initialized).
-func (a *VppAdapter) initMaps() {
-       if a.msgIDsToName == nil {
-               a.msgIDsToName = map[uint16]string{}
-               a.msgNameToIds = map[string]uint16{}
-               a.msgIDSeq = 1000
-       }
-
-       if a.binAPITypes == nil {
-               a.binAPITypes = map[string]reflect.Type{}
-       }
-}
-
 // SendMsg emulates sending a binary-encoded message to VPP.
 func (a *VppAdapter) SendMsg(clientID uint32, data []byte) error {
        switch a.mode {
        case useReplyHandlers:
-               a.initMaps()
                for i := len(a.replyHandlers) - 1; i >= 0; i-- {
                        replyHandler := a.replyHandlers[i]
 
@@ -249,7 +244,7 @@ func (a *VppAdapter) SendMsg(clientID uint32, data []byte) error {
                                Data:     data,
                        })
                        if finished {
-                               a.callback(msgID, clientID, reply)
+                               a.callback(msgID, reply)
                                return nil
                        }
                }
@@ -280,7 +275,7 @@ func (a *VppAdapter) SendMsg(clientID uint32, data []byte) error {
                                        struc.Pack(buf, &codec.VppOtherHeader{VlMsgID: msgID})
                                }
                                struc.Pack(buf, msg.Msg)
-                               a.callback(msgID, context, buf.Bytes())
+                               a.callback(msgID, buf.Bytes())
                        }
 
                        a.replies = a.replies[1:]
@@ -299,7 +294,7 @@ func (a *VppAdapter) SendMsg(clientID uint32, data []byte) error {
                msgID := uint16(defaultReplyMsgID)
                struc.Pack(buf, &codec.VppReplyHeader{VlMsgID: msgID, Context: clientID})
                struc.Pack(buf, &defaultReply{})
-               a.callback(msgID, clientID, buf.Bytes())
+               a.callback(msgID, buf.Bytes())
        }
        return nil
 }