)
// NewVppAdapter returns a new mock adapter.
-func NewVppAdapter() adapter.VppAdapter {
- return &VppAdapter{}
+func NewVppAdapter() *VppAdapter {
+ a := &VppAdapter{
+ msgIDsToName: make(map[uint16]string),
+ msgNameToIds: make(map[string]uint16),
+ msgIDSeq: 1000,
+ binAPITypes: make(map[string]reflect.Type),
+ }
+ a.registerBinAPITypes()
+ return a
}
// Connect emulates connecting the process to VPP.
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()
}
}
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
+ }
+ err = struc.Pack(buf, reply)
+ if err != nil {
+ return nil, err
+ }
return buf.Bytes(), nil
}
a.access.Lock()
defer a.access.Unlock()
- a.initMaps()
msgID, found := a.msgNameToIds[msgName]
if found {
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]
package main
import (
+ "bufio"
+ "bytes"
"os"
"testing"
RegisterTestingT(t)
result, err := getInputFiles("testdata")
Expect(err).ShouldNot(HaveOccurred())
- Expect(result).To(HaveLen(5))
+ Expect(result).To(HaveLen(3))
for _, file := range result {
Expect(file).To(BeAnExistingFile())
}
defer os.RemoveAll(outDir)
err := generateFromFile("testdata/acl.api.json", outDir)
Expect(err).ShouldNot(HaveOccurred())
- fileInfo, err := os.Stat(outDir + "/acl/acl.go")
+ fileInfo, err := os.Stat(outDir + "/acl/acl.ba.go")
Expect(err).ShouldNot(HaveOccurred())
Expect(fileInfo.IsDir()).To(BeFalse())
- Expect(fileInfo.Name()).To(BeEquivalentTo("acl.go"))
+ Expect(fileInfo.Name()).To(BeEquivalentTo("acl.ba.go"))
}
func TestGenerateFromFileInputError(t *testing.T) {
outDir := "test_output_directory"
err := generateFromFile("testdata/nonexisting.json", outDir)
Expect(err).Should(HaveOccurred())
- Expect(err.Error()).To(ContainSubstring("reading data from file failed"))
+ Expect(err.Error()).To(ContainSubstring("invalid input file name"))
}
func TestGenerateFromFileReadJsonError(t *testing.T) {
outDir := "test_output_directory"
err := generateFromFile("testdata/input-read-json-error.json", outDir)
Expect(err).Should(HaveOccurred())
- Expect(err.Error()).To(ContainSubstring("JSON unmarshall failed"))
+ Expect(err.Error()).To(ContainSubstring("invalid input file name"))
}
func TestGenerateFromFileGeneratePackageError(t *testing.T) {
result, err := getContext("testdata/af_packet.api.json", outDir)
Expect(err).ShouldNot(HaveOccurred())
Expect(result).ToNot(BeNil())
- Expect(result.outputFile).To(BeEquivalentTo(outDir + "/af_packet/af_packet.go"))
+ Expect(result.outputFile).To(BeEquivalentTo(outDir + "/af_packet/af_packet.ba.go"))
}
func TestGetContextNoJsonFile(t *testing.T) {
func TestGetContextInterfaceJson(t *testing.T) {
RegisterTestingT(t)
outDir := "test_output_directory"
- result, err := getContext("testdata/interface.json", outDir)
+ result, err := getContext("testdata/ip.api.json", outDir)
Expect(err).ShouldNot(HaveOccurred())
Expect(result).ToNot(BeNil())
Expect(result.outputFile)
- Expect(result.outputFile).To(BeEquivalentTo(outDir + "/interfaces/interfaces.go"))
-
+ Expect(result.outputFile).To(BeEquivalentTo(outDir + "/ip/ip.ba.go"))
}
func TestReadJson(t *testing.T) {
Expect(result).To(BeNil())
}
-/*
func TestGeneratePackage(t *testing.T) {
RegisterTestingT(t)
// prepare context
inputData, err := readFile("testdata/ip.api.json")
Expect(err).ShouldNot(HaveOccurred())
testCtx.inputBuff = bytes.NewBuffer(inputData)
- inFile, _ := parseJSON(inputData)
+ jsonRoot, err := parseJSON(inputData)
+ Expect(err).ShouldNot(HaveOccurred())
+ testCtx.packageData, err = parsePackage(testCtx, jsonRoot)
+ Expect(err).ShouldNot(HaveOccurred())
outDir := "test_output_directory"
- outFile, _ := os.Create(outDir)
+ outFile, err := os.Create(outDir)
+ Expect(err).ShouldNot(HaveOccurred())
defer os.RemoveAll(outDir)
// prepare writer
Expect(err).ShouldNot(HaveOccurred())
}
-
func TestGenerateMessageType(t *testing.T) {
RegisterTestingT(t)
// prepare context
inputData, err := readFile("testdata/ip.api.json")
Expect(err).ShouldNot(HaveOccurred())
testCtx.inputBuff = bytes.NewBuffer(inputData)
- inFile, _ := parseJSON(inputData)
+ jsonRoot, err := parseJSON(inputData)
+ Expect(err).ShouldNot(HaveOccurred())
outDir := "test_output_directory"
- outFile, _ := os.Create(outDir)
+ outFile, err := os.Create(outDir)
+ Expect(err).ShouldNot(HaveOccurred())
+ testCtx.packageData, err = parsePackage(testCtx, jsonRoot)
+ Expect(err).ShouldNot(HaveOccurred())
defer os.RemoveAll(outDir)
// prepare writer
writer := bufio.NewWriter(outFile)
- types := inFile.Map("types")
- testCtx.types = map[string]string{
- "u32": "sw_if_index",
- "u8": "weight",
- }
- Expect(types.Len()).To(BeEquivalentTo(1))
- for i := 0; i < types.Len(); i++ {
- typ := types.At(i)
- Expect(writer.Buffered()).To(BeZero())
- err := generateMessage(testCtx, writer, typ, true)
- Expect(err).ShouldNot(HaveOccurred())
+ for _, msg := range testCtx.packageData.Messages {
+ generateMessage(testCtx, writer, &msg)
Expect(writer.Buffered()).ToNot(BeZero())
-
}
}
-func TestGenerateMessageName(t *testing.T) {
+/*func TestGenerateMessageName(t *testing.T) {
RegisterTestingT(t)
// prepare context
testCtx := new(context)